java - 使用 datainput/-outputstream 通过 java 套接字发送 jpg-图像时出现问题

标签 java sockets file-io iostream bufferedimage

我希望通过 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/

相关文章:

java - apache Camel 在路由内多线程

java - ReadWriteLock 写锁饱和

java - 抛出 ConcurrentModificationException(内部有多个 for 循环)

python - 如何在 Python 套接字聊天室中创建踢功能?

javascript - 从客户端接收消息并将消息发送到 Node js服务器

ruby 套接字 dgram 示例

java - 蛮力数独算法

java - 访问 WEB-INF | 内的文件 java

c# - 在没有 Try Catch 的情况下检查文件锁定

android - 如何按名称从 res/raw 读取文件