使用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[]并检查其返回值,因为它是。