我要做的是将图像从Web服务传输到移动客户端。为了做到这一点,我创建了一个返回byte []变量的Web服务操作。在这个方法中,我从图表创建一个.png图像。在此之后,我从图像中获取字节并将它们作为操作的返回值提供。这是服务器代码:
public byte[] getBytes() throws IOException {
BufferedImage chartImage = chart.createBufferedImage(230, 260);
//I get the image from a chart component.
ByteArrayOutputStream baos = new ByteArrayOutputStream(1000);
ImageIO.write( chartImage, "png",baos );
baos.flush();
byte[] bytesImage = baos.toByteArray();
baos.close();
return bytesImage;
}
Now in the mobile application all i do is assign a byte[] variable the return value of the web service operation.
byte[] imageBytes = Stub.getBytes().
也许我错过了一些东西,但这不起作用,因为我得到了这个运行时错误:
java.rmi.MarshalException: Expected Byte, received: iVBORw0KGgoAAAANSUhEU.... (very long line).
有任何想法为什么会发生这种情况?或者,您可以建议以其他方式将数据发送到移动客户端。
答案 0 :(得分:4)
如果服务仅将图像作为字节数组传递,则通过将其包装在SOAP响应中而导致开销,并且客户端上的XML / SOAP解析似乎是不必要的。为什么不在servlet中实现图表生成,让客户端从“非SOAP”服务器URL检索图像?
您可以将字节数组写入servlet的响应对象,而不是像您一样从WebService方法返回bytesImage:
response.setContentType("image/png");
response.setContentLength(bytesImage.length);
OutputStream os = response.getOutputStream();
os.write(bytesImage);
os.close();
在J2ME客户端上,您将读取servlet绑定到的URL的响应,并从数据中创建一个图像:
HttpConnection conn = (HttpConnection)Connector.open("http://<servlet-url>");
DataInputStream dis = conn.openDataInputStream();
byte[] buffer = new byte[conn.getLength()];
dis.readFully(buffer);
Image image = Image.createImage(buffer, 0, buffer.length);
希望这有帮助!