我使用了Here中的代码如下所示,只发送了一半图片,有人可以告诉我原因吗?获取大小和读取大小的代码对我来说太复杂了,所以我无法弄明白。
public class Send {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 13085);
OutputStream outputStream = socket.getOutputStream();
BufferedImage image = ImageIO.read(new File("test.jpg"));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", byteArrayOutputStream);
byte[] size = ByteBuffer.allocate(4).putInt(byteArrayOutputStream.size()).array();
outputStream.write(size);
outputStream.write(byteArrayOutputStream.toByteArray());
outputStream.flush();
System.out.println("Flushed: " + System.currentTimeMillis());
Thread.sleep(120000);
System.out.println("Closing: " + System.currentTimeMillis());
socket.close();
}
}
public class Receive {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(13085);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream=new DataInputStream(inputStream);
System.out.println("Reading: " + System.currentTimeMillis());
byte[] sizeAr = new byte[4];
dataInputStream.read(sizeAr);
int size = ByteBuffer.wrap(sizeAr).getInt();
byte[] imageAr = new byte[size];
dataInputStream.readFully(imageAr);
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageAr));
System.out.println("Received " + image.getHeight() + "x" + image.getWidth() + ": " + System.currentTimeMillis());
ImageIO.write(image, "jpg", new File("received.jpg"));
serverSocket.close();
}
}
正如@EJP评论的那样,最可能的问题是在receive部分中,inputStream.read(byte [] byteArray)无法完全加载byteArray。如果我使用DataInputStream dis = new DataInputStream(inputStream)然后调用dis.readFully(byteArray)它将加载byteArray。虽然我无法弄清楚inputStream无法工作的原因。希望有人可以证明原因,这将是非常值得赞赏的。更正后的代码如下:
==4778== Thread 2:
==4778== Invalid read of size 1
==4778== at 0x804A302: swapBuffer (doubleBuffer.c:85)
==4778== by 0x804A1FA: setDoubleBuffer (doubleBuffer.c:39)
==4778== by 0x804935C: TempControl (t2.c:167)
==4778== by 0x4062F6F: start_thread (pthread_create.c:312)
==4778== by 0x4163BED: clone (clone.S:129)
==4778== Address 0x4228098 is 0 bytes after a block of size 4,000 alloc'd
==4778== at 0x402C109: calloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==4778== by 0x804A0FF: build_double_buffer (doubleBuffer.c:14)
==4778== by 0x8048E49: init (t2.c:56)
==4778== by 0x804988A: main (t2.c:299)
==4778==
==4778== Invalid read of size 1
==4778== at 0x804A2E8: swapBuffer (doubleBuffer.c:86)
==4778== by 0x804A1FA: setDoubleBuffer (doubleBuffer.c:39)
==4778== by 0x804935C: TempControl (t2.c:167)
==4778== by 0x4062F6F: start_thread (pthread_create.c:312)
==4778== by 0x4163BED: clone (clone.S:129)
==4778== Address 0x4228098 is 0 bytes after a block of size 4,000 alloc'd
==4778== at 0x402C109: calloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==4778== by 0x804A0FF: build_double_buffer (doubleBuffer.c:14)
==4778== by 0x8048E49: init (t2.c:56)
==4778== by 0x804988A: main (t2.c:299)
==4778==
==4778== Invalid write of size 1
==4778== at 0x804A2EB: swapBuffer (doubleBuffer.c:86)
==4778== by 0x804A1FA: setDoubleBuffer (doubleBuffer.c:39)
==4778== by 0x804935C: TempControl (t2.c:167)
==4778== by 0x4062F6F: start_thread (pthread_create.c:312)
==4778== by 0x4163BED: clone (clone.S:129)
==4778== Address 0x4229068 is 0 bytes after a block of size 4,000 alloc'd
==4778== at 0x402C109: calloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==4778== by 0x804A11A: build_double_buffer (doubleBuffer.c:15)
==4778== by 0x8048E49: init (t2.c:56)
==4778== by 0x804988A: main (t2.c:299)
答案 0 :(得分:0)
删除字节数组流并使用套接字流直接执行ImageIO
。
问题在于你假设read()
填充了缓冲区,但如果你这样做,那么无论如何你都会完全摆脱read()
。
发送长度也毫无意义,因为无论如何你都要关闭它们。流的结尾足以界定图像。
摆脱睡眠。你不需要在网络代码中睡觉。