在客户端和服务器之间将图像作为字节数组发送

时间:2012-11-28 02:08:47

标签: java image sockets

我可以成功发送并从我的客户端向我的服务器绘制一个经过调整的125 x 125图像。唯一的问题是,那太小了。我希望能够发送更大的图像,但字节数组无法处理它,我得到一个Java堆异常。目前我用它来解释我的形象。有更有效的方法吗?

在客户端

screenShot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
                screenShot = resize(screenShot, 125, 125);

                ByteArrayOutputStream byteArrayO = new ByteArrayOutputStream();
                ImageIO.write(screenShot,"PNG",byteArrayO);
                byte [] byteArray = byteArrayO.toByteArray();
                out.writeLong(byteArray.length);
                out.write(byteArray);

调整上面调用的方法。

    public static BufferedImage resize(BufferedImage img, int newW, int newH) {  
    int w = img.getWidth();  
    int h = img.getHeight();  
    BufferedImage dimg = new BufferedImage(newW, newH, img.getType()); 
    Graphics2D g = dimg.createGraphics();  
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
    RenderingHints.VALUE_INTERPOLATION_BILINEAR);  
    g.drawImage(img, 0, 0, newW, newH, 0, 0, w, h, null);  
    g.dispose();  
    return dimg;  
   } 

解释图像的服务器

in = new DataInputStream(Client.getInputStream());
            long nbrToRead = in.readLong();
            byte[] byteArray = new byte[(int) nbrToRead];
            int nbrRd = 0;
            int nbrLeftToRead = (int) nbrToRead;

            while (nbrLeftToRead > 0) {
                int rd = in.read(byteArray, nbrRd, nbrLeftToRead);
                if (rd < 0)
                    break;
                nbrRd += rd; // accumulate bytes read
                nbrLeftToRead -= rd;
            }
            ByteArrayInputStream byteArrayI = new ByteArrayInputStream(
                    byteArray);
            image = ImageIO.read(byteArrayI);

            if (image != null) {
                paint(f.getGraphics(), image);
            } else {
                System.out.println("null image.");
            }

因为你可以说代码很大并且很可能效率低下。我可以发送图像的1/10为10倍和高度,然后绘制这些部分,但我想知道是否有更简单的方法来做到这一点。

2 个答案:

答案 0 :(得分:1)

您应该考虑通过网络将数据传输为流。您可以使用RMIIO等第三方库。如果您可以使用Web服务进行数据传输,那么您可以查看消息传输优化机制(MTOM),它允许您以更有效的方式作为流传输数据。有关详细信息,请查看here

答案 1 :(得分:0)

这对我有用

public class ImageClient {

  public static void main(String[] args) throws AWTException, IOException {

    BufferedImage screenShot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
    Socket socket = new Socket("localhost",11111);
    MemoryCacheImageOutputStream byteArrayO = new MemoryCacheImageOutputStream(socket.getOutputStream());
    ImageIO.write(screenShot, "PNG", byteArrayO);
    byteArrayO.flush();
    socket.close();
  }

}


public class ImageServer {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ServerSocket ss = new ServerSocket(11111);
        try{
            Socket s = ss.accept();
            InputStream is = s.getInputStream();
            MemoryCacheImageInputStream ois = new MemoryCacheImageInputStream(is);
            ImageIO.read(ois);
            s.close();
        }finally{
            ss.close();
        }
   }
}