0

我的程序拍摄用户屏幕的照片,当他们使用我的程序时,制作屏幕截图,然后将其发送到服务器。图像将加载大约 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();

}

如果有人可以帮助我,我将不胜感激!

4

1 回答 1

1

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

看看如何使用 java socket 实现客户端和服务器之间传输文件的答案。

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

此外,除非它在事件调度线程上,否则不要对 Swing 做任何事情。请参阅如何使用事件调度线程?更多细节。

于 2012-07-11T05:04:41.617 回答