gpt4 book ai didi

java - 套接字 : premature end of JPEG file

转载 作者:行者123 更新时间:2023-12-02 08:14:34 24 4
gpt4 key购买 nike

我正在尝试通过套接字将图像文件从服务器发送到客户端。 套接字以前用于将一些字符串从服务器发送到客户端(使用缓冲的输入/输出流)。

问题是无法正确接收图像文件,出现“JPEG 文件过早结束”错误。

服务器首先将文件大小发送给客户端,然后客户端创建该大小的byte[],并开始接收文件。

代码如下:

服务器:

        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
//Send file size
dos.writeInt((int) file.length());

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
byte[] fileBytes = new byte[bis.available()];
bis.read(fileBytes);
bis.close();

BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bos.write(fileBytes);
bos.flush();

客户:

        DataInputStream dis = new DataInputStream(socket.getInputStream());
//Receive file size
int size = dis.readInt();

BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
byte[] fileBytes = new byte[size];

bis.read(fileBytes, 0, fileBytes.length);

更有趣的是,如果我让服务器在发送文件大小和写入字节[]之间 hibernate 大约 2 秒,则可以正确接收图像。我想知道服务器和客户端之间是否存在某种竞争条件

最佳答案

错误很可能在这里:

byte[] fileBytes = new byte[bis.available()];

方法available不返回文件的大小。它可能只返回输入缓冲区的大小,该大小小于文件的大小。请参阅 BufferedInputStream 中该方法的 API 文档。

此外,下面一行中的 read 并不能保证一次性读取整个文件。它返回实际读取的字节数,该数可能小于您要求的字节数。在客户端代码中,您以相同的方式使用read,而无需实际检查它是否读取了所有数据。

关于java - 套接字 : premature end of JPEG file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6693626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com