【问题标题】:Sending an image through socket as byte array in Java通过套接字发送图像作为Java中的字节数组
【发布时间】:2015-02-19 21:39:15
【问题描述】:

我知道有人以几种不同的方式提出过这个问题,但我已经为此工作了 2 天,但无济于事。我的代码失败,因为接收方不断抛出 EOF 异常。有人能指出我正确的方向吗?

接收方:

    class ReceiveThread extends Thread {

    ReceiveThread() {

    }

    @Override
    public void run() {
        System.out.println("Receive Thread Start");
        DataInputStream in;
        try {

        } catch (Exception e) {
            return;
        }
        try {
            in = new DataInputStream(connection.getInputStream());
            while (true) {
                if (!connection.isConnected()) {
                    System.out.println("Connection not connected");
                    break;
                }
                try {

                    int len = in.readInt();
                    byte[] data = new byte[len];
                    System.out.println("Image size: " + len);
                    if (len > 0) {
                        in.readFully(data, 0, len);
                        BufferedImage bi = ImageIO.read(new ByteArrayInputStream(data));
                        panel.updateImage(bi);
                        panel.repaint();
                    }
                    in.close();
                } catch (Exception e) {
                }
                pause(100);
            }
        } catch (Exception e) {

        }
    }

    public void pause(long time) {
        try {
            Thread.sleep(time);
        } catch (Exception e) {

        }
    }
}

发送方:

    class UpdateScreenThread extends Thread {

    Robot robot;

    public UpdateScreenThread() {
        try {
            robot = new Robot();
            System.out.println("Update Thread Created");
        } catch (Exception e) {

        }
    }

    @Override
    public void run() {
        System.out.println("Update Thread Running");
        Settings.isSharing = true;
        Dimension screenSize;
        screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Rectangle screenRectangle = new Rectangle(screenSize);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream out;
        try {
            out = new DataOutputStream(s.getOutputStream());
        } catch (Exception e) {
            return;
        }
        while (s.isConnected()) {
            //System.out.println("test");
            BufferedImage bi = robot.createScreenCapture(screenRectangle);
            try {

                ImageIO.write(bi, "PNG", baos);
                baos.flush();
                byte[] bytes = baos.toByteArray();
                out.flush();
                out.writeInt(bytes.length);
                out.flush();
                out.write(bytes);
                System.out.println("Image sent");
            } catch (Exception e) {
            }
            pause(500);
        }

        try {
            out.close();
        } catch (Exception e) {
        }
        Settings.isSharing = false;
    }

}

感谢任何可以提供帮助的人。这让我发疯了。

【问题讨论】:

  • 尝试移动发送方的第一个out.flush()调用(byte[] bytes = baos.toByteArray();之后的行向下3行(放在out.write(bytes);之后)。

标签: java image sockets stream byte


【解决方案1】:

简化为基本内容,这是您的阅读循环:

public void run() {
//...
    try {
        in = new DataInputStream(connection.getInputStream());
        while (true) {
            //...
            try {
                int len = in.readInt();
                byte[] data = new byte[len];
                in.readFully(data, 0, len);
                //...
                in.close();
            } catch (Exception e) {
            }
            pause(100);
        }
    } catch (Exception e) {
    }
}

请注意,while (true) {...} 包括 in.close()。将关闭移出循环。

【讨论】:

  • 进行了更改,但仍然收到持续的 EOF 异常并且没有收到任何图片数据
  • 我无法重现这一点,因为缺少重要部分,例如您如何设置套接字连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 2012-08-29
  • 2013-12-31
相关资源
最近更新 更多