我希望通过 TCP 套接字连接将 JPG 图像从客户端发送到服务器。我在客户端将文件转换为字节数组,然后在发送数组长度后将其发送到服务器。服务器一次从套接字输入流读取一个字节的数据到一个新的字节数组,然后将其写入 jpg 文件。然而数据已损坏,无法查看该图像。下面是客户端和服务器端的核心java代码。
客户:
Socket s = new Socket("localhost", 666);
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
String imgPath = "C:/Users/huehuehue/Documents/Uni/D0036D/prick1.JPG";
File file = new File(imgPath);
byte[] b = new byte[(int) file.length()];
FileInputStream fis = new FileInputStream(file);
fis.read(b);
fis.close();
dos.writeInt((int) file.length());
dos.flush();
dos.write(b, 0, b.length);
dos.flush();
服务器:
ServerSocket serverSocket = new ServerSocket(666);
Socket connect = serverSocket.accept();
DataInputStream dis = new DataInputStream(connect.getInputStream());
File file = new File("C:/Users/huehuehue/Documents/Uni/D0036D/PLAYERprick.JPG");
FileOutputStream fos = new FileOutputStream(file);
int arrlen = dis.readInt();
byte[] b = new byte[arrlen];
int i = 0;
for(i = 0; i < arrlen; i++) {
b[i] = dis.readByte();
i++;
}
fos.write(b, 0 , b.length);
我不明白为什么这不起作用,非常感谢任何帮助或建议。
最佳答案
int arrlen = dis.readInt();
byte[] b = new byte[arrlen];
int i = 0;
for(i = 0; i < arrlen; i++) {
b[i] = dis.readByte();
i++;
}
您将 i
递增两次,因此您忽略了一半的输入,并将您不忽略的内容写入了错误的插槽中。幸运的是,有一种更简单的方法,也更有效:
int arrlen = dis.readInt();
byte[] b = new byte[arrlen];
dis.readFully(b);
注意 fis.read(b);
无效。你不能假设它填满了缓冲区。您也应该在这里使用DataInputStream.readFully()
。
关于java - 使用 datainput/-outputstream 通过 java 套接字发送 jpg-图像时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26373333/