for循环不会收到完整数据

时间:2015-12-16 08:20:18

标签: java socket.io serversocket

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

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

}

有人知道如何传输屏幕截图的所有数据吗?

问候 最大

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我认为你的问题是因为你的观点(画布/标签/等)宽度和&amp;高度小于图像。尝试调整屏幕大小的宽度和宽度。高度与您的视图相同(画布/标签/等)。

答案 2 :(得分:0)

好的,我现在已经改变了

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

并将输出从“Filled buffer”更改为“Initialized buffer”;)

我还完全删除了本地保存部分,对于我的程序来说,只需在程序中显示它就足够了。

但是:执行din.readFully(buffer);时仍然卡住了,所以问题本身仍然存在。

您对如何解决这个问题有任何想法吗?

问候 最大

答案 3 :(得分:-1)

您可以将其添加到发件人部分:

socket.flush();

如果不起作用,那么:

socket.shutdownOutput();