Web服务 - 移动应用程序(j2me)文件传输

时间:2009-09-29 13:21:07

标签: file java-me transfer

我要做的是将图像从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).

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

1 个答案:

答案 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);

希望这有帮助!