1

我想要做的是将图像从网络服务传输到移动客户端。为此,我创建了一个返回 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).

有什么想法为什么会发生?或者,也许您可​​以建议任何其他方式将数据发送到移动客户端。

4

1 回答 1

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 客户端上,您将从 URL 中读取响应,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);

希望这可以帮助!

于 2009-09-29T14:22:54.227 回答