【问题标题】:Java Byte Array And Image With SocketJava 字节数组和带套接字的图像
【发布时间】:2012-07-11 04:25:11
【问题描述】:

我的程序拍摄用户屏幕的照片,当他们使用我的程序时,制作屏幕截图,然后将其发送到服务器。图像将加载大约 1/4 并冻结。

发送截图:

            BufferedImage buffimg = robot.createScreenCapture(captureSize);
            BufferedImage image = buffimg;
            byte[] imageInByte;


            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(image, "png", baos);
            baos.flush();
            imageInByte = baos.toByteArray();
            baos.close();

            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            PrintWriter out = new PrintWriter(socket.getOutputStream());

            out.println("!SCREENDATA!");
            out.flush();
            dos.writeInt(baos.toByteArray().length);
            dos.write(baos.toByteArray());
            dos.flush();

获取图片:

                    if (input.startsWith("!SCREENDATA!")) {
                        System.out.println("reading");

                        DataInputStream dis = new DataInputStream(socket.getInputStream());
                        int len = dis.readInt();
                        System.out.println(len);
                        byte[] data = new byte[len];

                        dis.read(data);
                        InputStream in = new ByteArrayInputStream(data);
                        Image image = Toolkit.getDefaultToolkit().createImage(data);

                        v.repaint(image);
                    }

显示图像:

public void repaint(Image img) {

    frame.getContentPane().add(new JLabel(new ImageIcon(img)));
    frame.repaint();
    frame.pack();

}

如果有人能帮我解决这个问题,我将不胜感激!

【问题讨论】:

    标签: java arrays sockets byte


    【解决方案1】:

    您需要继续调用dis.read(data);,因为 TCP 套接字上的此方法并非旨在在一次调用中提供整个缓冲区(它是一个流套接字,它会继续运行)。但请注意,当套接字没有数据可提供时,方法调用将阻塞。此外,最好在文件之前发送文件大小,以便另一端知道预期的大小 - 它不太容易出现可能导致无限循环的协议错误。

    查看how to achieve transfer file between client and server using java socket的答案。

    无论如何,打个比方:套接字有一个已填满的存储桶,比方说 512kb。您有一个 2048kb 的存储桶。您必须不断将插座桶倒入自己的桶中。

    另外,不要对 Swing 做任何事情,除非它在 ​​Event Dispatch Thread 上。详情请见How do you use the Event Dispatch Thread?

    【讨论】:

      猜你喜欢
      • 2012-07-23
      • 2015-02-19
      • 2010-11-13
      • 2023-04-10
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多