for 循环没有收到完整数据

for loop doesn't receive full data

我遇到的问题是我的程序卡在 for 循环中,因为 dataInputSteam 在 DataOutputSteam 完成之前没有接收到所有数据。 在我的程序中,我想向服务器发送一个截图,客户端应该会收到它: 服务器:

public sendScreen(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        Robot robot;
        try {
            robot = new Robot();
            Dimension screenSize  = Toolkit.getDefaultToolkit().getScreenSize();
            Rectangle screen = new Rectangle( screenSize );
            BufferedImage image = robot.createScreenCapture( screen );

            BufferedImage scaledImage = Scalr.resize(image, 300);

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(image, "png", baos);
            byte[] screenBytes = baos.toByteArray();


            daos = new DataOutputStream(socket.getOutputStream());
            daos.writeInt(screenBytes.length);
            daos.write(screenBytes);
            System.out.println("Screen sent");
        } catch (AWTException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

而客户:

public static class GetScreenshot implements Runnable{

    Socket socket;
    private static DataInputStream din;
    private static BufferedImage screenshot;

    public GetScreenshot(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        System.out.println("start method getScreenshot");
        int length;
        byte[] buffer;
        PrintWriter out;

        try {
            //sending command to send screenshot
            out = new PrintWriter(socket.getOutputStream(), true);
            out.println("GETSCREENSHOT");

            din = new DataInputStream(socket.getInputStream());
            System.out.println("DIS created");
            length = din.readInt();
            System.out.println("Got data from DIS");
            buffer = new byte[length];
            System.out.println("Filled buffer");
            for(int i = 0; i < length; i++){
                buffer[i] = (byte) din.read();
                System.out.println("read" + i+ "while length is " + length + " read data " + buffer);
            }
            System.out.println("got buffer");
            ByteArrayInputStream bais = new ByteArrayInputStream(buffer);

            screenshot = ImageIO.read(bais);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //writing screenshot to local disk
        File outputfile = new File("C:\users\XXXX\documents\image2.png");
        try {
            ImageIO.write(screenshot, "png", outputfile);
            System.out.println("image written to local disk");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //set screenshot in the tool
        Main.labelScreenshot.setIcon(new ImageIcon(screenshot));
    }

}

有谁知道如何传输截图的所有数据?

您好 最大值

您将此添加到发件人部分:

socket.flush();

如果没有成功,那么:

socket.shutdownOutput();
buffer = new byte[length];
System.out.println("Filled buffer");

在这一点上,这条消息是不真实的。您已经创建了缓冲区,但您肯定还没有填充它。

for(int i = 0; i < length; i++){
    buffer[i] = (byte) din.read();
    System.out.println("read" + i+ "while length is " + length + " read data " + buffer);
}

所有这些等同于:

din.readFully(buffer);

然后:

ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
screenshot = ImageIO.read(bais);
//writing screenshot to local disk
File outputfile = new File("C:\users\XXXX\documents\image2.png");
try {
    ImageIO.write(screenshot, "png", outputfile);

所有这些完全等同于:

try (new FileOutputStream out = new FileOutputStream("C:\users\XXXX\documents\image2.png"))
{
    out.write(buffer);
}

无需对图像进行解码和重新编码。

我认为您的问题是因为您的视图 (canvas/label/etc) 宽度和高度小于您的图像。尝试调整屏幕截图的大小,使宽度和高度与您的视图相同 (canvas/label/etc)。