java网络断开管道,收到的文件已损坏

java网络断开管道,收到的文件已损坏,java,network-programming,broken-pipe,Java,Network Programming,Broken Pipe,我正在尝试编写一个服务器,它接受文件并使用DataInputStream和BufferedInputStream将其写入特定目录 服务器获取“用户名(字符串)”“文件数(int)”“文件名(字符串)”“每个文件的大小(长)”和“未解释字节的文件内容(字节[])” 如果一切顺利,我应该发送布尔值 但问题是它没有正确地接收文件 我不时收到“断管”错误消息,或收到后文件已损坏 解决了这个问题 一件可能与你的问题有关的小事。您应该按照实际读取的字节数而不是请求读取的字节数来减小文件大小变量:

我正在尝试编写一个服务器,它接受文件并使用DataInputStream和BufferedInputStream将其写入特定目录

服务器获取“用户名(字符串)”“文件数(int)”“文件名(字符串)”“每个文件的大小(长)”和“未解释字节的文件内容(字节[])”

如果一切顺利,我应该发送布尔值

但问题是它没有正确地接收文件

我不时收到“断管”错误消息,或收到后文件已损坏


解决了这个问题

一件可能与你的问题有关的小事。您应该按照实际读取的字节数而不是请求读取的字节数来减小文件大小变量:

       while(fileSize>0){
            if(fileSize < byteSize)
                byteSize = (int)fileSize;
            int byteRead = din.read(b, 0, byteSize);
            fos.write(b);
            fileSize -= byteRead; // <-- See here
        }
while(文件大小>0){
if(文件大小<字节大小)
字节大小=(int)文件大小;
int byteRead=din.read(b,0,字节大小);
fos.编写(b);

fileSize-=byteRead;//一件可能与您的问题有关的小事。您应该按实际读取的字节数而不是请求读取的字节数来减小文件大小变量:

       while(fileSize>0){
            if(fileSize < byteSize)
                byteSize = (int)fileSize;
            int byteRead = din.read(b, 0, byteSize);
            fos.write(b);
            fileSize -= byteRead; // <-- See here
        }
while(文件大小>0){
if(文件大小<字节大小)
字节大小=(int)文件大小;
int byteRead=din.read(b,0,字节大小);
fos.编写(b);

fileSize-=byteRead;//如果在读取输入时,发送方关闭了连接,则可能会出现此错误。这可能与您的代码无关。发送方可能已超时、在传输完成之前关闭了连接或其他许多事情


查看此相关问题:

如果在读取输入时,发件人关闭了连接,则可能会出现此错误。这可能与您的代码无关。发件人可能已超时、在传输完成之前关闭了连接或其他许多事情


看看这个相关问题:

可能重复的+1可能重复的问题这很可能是错误背后的真正问题。如果读取的字节数少于所需的字节数,这可能会使程序过早退出
,而
循环并错误获取下一个文件长度。这可能导致在re不再有数据。此外,您应该检查
byteRead
结果,不要每次都将整个缓冲区数组写入输出,而只写入实际读取的字节数。否则,您可能会将读取数据的部分写入输出两次。+1这很可能是错误背后的真正问题。如果读取的字节数少于要求的字节数,则his会使程序在
循环时过早退出
,并错误获取下一个文件长度。这会导致在没有更多数据时继续读取输入流。此外,您还应该检查
字节
结果,不要每次都将整个缓冲区数组写入输出,而只写入实际读取的字节数。否则您可以将读取数据的部分写入输出两次。