Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java套接字发送时图像不完整_Java_Serversocket - Fatal编程技术网

使用java套接字发送时图像不完整

使用java套接字发送时图像不完整,java,serversocket,Java,Serversocket,我想向套接字服务器发送一个映像,但它没有完全到达 首先,我创建了一个屏幕截图,该截图应使用以下代码通过套接字发送到服务器: try { Robot robot = new Robot(); Rectangle rectangle = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); File file = new File("original.png"); BufferedImage buffe

我想向套接字服务器发送一个映像,但它没有完全到达

首先,我创建了一个屏幕截图,该截图应使用以下代码通过套接字发送到服务器:

try {
    Robot robot = new Robot();
    Rectangle rectangle = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
    File file = new File("original.png");
    BufferedImage bufferedImage = robot.createScreenCapture(rectangle);
    try {
        ImageIO.write(bufferedImage, "png", file);
    } catch (IOException e) {
        e.printStackTrace();
    }
    socket(robot.createScreenCapture(rectangle));
} catch (AWTException ex) {
    System.err.println(ex);
}

void socket(BufferedImage bufferedImage) {
    try {
        Socket socket = new Socket("localhost", 20000);
        OutputStream outputStream = socket.getOutputStream();

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ImageIO.write(bufferedImage, "jpg", byteArrayOutputStream);

        byte[] size = ByteBuffer.allocate(4).putInt(byteArrayOutputStream.size()).array();
        outputStream.write(size);
        outputStream.write(byteArrayOutputStream.toByteArray());
        outputStream.flush();

        System.out.println(byteArrayOutputStream.size());

        try {
            sleep(1200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        socket.close();
        System.exit(0);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
try {
    ServerSocket serverSocket = new ServerSocket(20000);
    System.out.println("-------------------------------------------------------");
    while ( true ) {
        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
            handleConnection(clientSocket);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            if (clientSocket != null) {
                try {
                    clientSocket.close();
                } catch (IOException e) {
                }
            }
        }
    }
} catch (UnknownHostException uhe) {
    System.out.println(uhe);
} catch (IOException ioe) {
    System.out.println(ioe);
}
static void handleConnection(Socket clientSocket) {
    try {
        OutputStream socketoutstr = clientSocket.getOutputStream();
        OutputStreamWriter osr = new OutputStreamWriter(socketoutstr);
        BufferedWriter bw = new BufferedWriter(osr);

        InputStream socketinstr = clientSocket.getInputStream();
        InputStreamReader isr = new InputStreamReader(socketinstr);
        BufferedReader br = new BufferedReader(isr);


        byte[] sizeAr = new byte[4];
        socketinstr.read(sizeAr);
        int size = ByteBuffer.wrap(sizeAr).asIntBuffer().get();

        byte[] imageAr = new byte[size];
        socketinstr.read(imageAr);

        BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageAr));
        ImageIO.write(image, "png", new File("send.png"));

        System.out.println("111");

        bw.write("");
        bw.newLine();
        bw.flush();

        bw.close();
        br.close();
        clientSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
然后,服务器应使用以下代码保存此文件:

try {
    Robot robot = new Robot();
    Rectangle rectangle = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
    File file = new File("original.png");
    BufferedImage bufferedImage = robot.createScreenCapture(rectangle);
    try {
        ImageIO.write(bufferedImage, "png", file);
    } catch (IOException e) {
        e.printStackTrace();
    }
    socket(robot.createScreenCapture(rectangle));
} catch (AWTException ex) {
    System.err.println(ex);
}

void socket(BufferedImage bufferedImage) {
    try {
        Socket socket = new Socket("localhost", 20000);
        OutputStream outputStream = socket.getOutputStream();

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ImageIO.write(bufferedImage, "jpg", byteArrayOutputStream);

        byte[] size = ByteBuffer.allocate(4).putInt(byteArrayOutputStream.size()).array();
        outputStream.write(size);
        outputStream.write(byteArrayOutputStream.toByteArray());
        outputStream.flush();

        System.out.println(byteArrayOutputStream.size());

        try {
            sleep(1200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        socket.close();
        System.exit(0);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
try {
    ServerSocket serverSocket = new ServerSocket(20000);
    System.out.println("-------------------------------------------------------");
    while ( true ) {
        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
            handleConnection(clientSocket);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            if (clientSocket != null) {
                try {
                    clientSocket.close();
                } catch (IOException e) {
                }
            }
        }
    }
} catch (UnknownHostException uhe) {
    System.out.println(uhe);
} catch (IOException ioe) {
    System.out.println(ioe);
}
static void handleConnection(Socket clientSocket) {
    try {
        OutputStream socketoutstr = clientSocket.getOutputStream();
        OutputStreamWriter osr = new OutputStreamWriter(socketoutstr);
        BufferedWriter bw = new BufferedWriter(osr);

        InputStream socketinstr = clientSocket.getInputStream();
        InputStreamReader isr = new InputStreamReader(socketinstr);
        BufferedReader br = new BufferedReader(isr);


        byte[] sizeAr = new byte[4];
        socketinstr.read(sizeAr);
        int size = ByteBuffer.wrap(sizeAr).asIntBuffer().get();

        byte[] imageAr = new byte[size];
        socketinstr.read(imageAr);

        BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageAr));
        ImageIO.write(image, "png", new File("send.png"));

        System.out.println("111");

        bw.write("");
        bw.newLine();
        bw.flush();

        bw.close();
        br.close();
        clientSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
发送的图片需要更多的空间:

有人知道如何在不做任何更改的情况下发送图片吗?

我发现两个问题

写入套接字的格式是jpg,而不是png。因此,比较文件的大小总是不同的

另一个由@joachim sauer提到-readbyte[]需要在一个循环中:

int read = 0;
while(read<size)
{
  read += socketinstr.read(imageAr,read,size-read); 
}
始终在循环中调用readbyte[]并检查其返回值,因为它是。