Java 在客户端和服务器之间以字节数组形式发送图像

Java 在客户端和服务器之间以字节数组形式发送图像,java,image,sockets,Java,Image,Sockets,我可以成功地从我的客户机向服务器发送并绘制大小为125 x 125的图像。唯一的问题是,这太小了。我希望能够发送一个更大的图像,但字节数组无法处理它,我得到了一个java堆异常。现在我用这个来解释我的图像。有没有更有效的方法 论客户 screenShot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); screenShot

我可以成功地从我的客户机向服务器发送并绘制大小为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.");
            }
in=newdatainputstream(Client.getInputStream());
long nbrToRead=in.readLong();
字节[]byteArray=新字节[(int)NBRTREAD];
int nbrRd=0;
int nbrleftRead=(int)nbrRead;
而(NbLeftToRead>0){
int rd=in.read(字节数组、nbrRd、NBRLeftRead);
if(rd<0)
打破
nbrRd+=rd;//累积读取的字节数
NbleFTREAD-=rd;
}
ByteArrayInputStream byteArrayI=新建ByteArrayInputStream(
byteArray);
image=ImageIO.read(byteArrayI);
如果(图像!=null){
绘制(f.getGraphics(),图像);
}否则{
System.out.println(“空图像”);
}

正如您所知,代码非常庞大,而且很可能效率低下。我可以将图像的1/10发送10次,以显示尺寸和高度,然后在这些部分绘制,但我想知道是否有更简单的方法来实现这一点

您可能应该考虑通过网络以流的形式传输数据。您可以使用第三方库,如。若您可以使用web服务进行数据传输,那个么您可以查看消息传输优化机制(MTOM),它允许您以更高效的方式以流的形式传输数据。有关更多详细信息,请查看

您可能应该考虑通过网络以流的形式传输数据。您可以使用第三方库,如。若您可以使用web服务进行数据传输,那个么您可以查看消息传输优化机制(MTOM),它允许您以更高效的方式以流的形式传输数据。有关更多详细信息,请查看

这对我很有用

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();
        }
   }
}
这对我有用

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();
        }
   }
}

我认为这有点类似于我正在做的事情,但我的字节数组太大,无法处理任何>125x125I'试图避免以多个片段读取屏幕您需要将其作为字节数组发送吗?这就是造成您的尺寸限制的原因。为什么不通过对象流将其作为对象发送呢?我可以做到?为什么呢如何将其转换回
buffereImage
?我认为这与这有点类似,这与我正在做的类似,但我的字节数组太大,无法处理任何内容>125x125I'试图避免以多个片段读取屏幕是否需要将其作为字节数组发送?这就是造成您的尺寸限制的原因。为什么不通过对象流将其作为对象发送呢?我可以做到?为什么呢我将如何将其转换回
缓冲图像
?稍后我将对此进行研究,但在简要阅读之后,这似乎是我所需要的。谢谢稍后我会看一看,但这似乎是我在简要阅读之后所需要的。谢谢