我想写一个接受文件并使用DataInputStream和BufferedInputStream将其写入特定目录的服务器。 (字符串)“'文件数量(int)''文件名称(字符串)''每个文件的长度(长)'和'未解释字节的文件内容(byte [ ])'java网络断开的管道和收到的文件损坏
如果一切都成功了,那么我应该发送布尔值。
但问题是它没有正确接收文件。
我不时收到'broken pipe'错误消息或文件损坏。
解决了这个问题..
我想写一个接受文件并使用DataInputStream和BufferedInputStream将其写入特定目录的服务器。 (字符串)“'文件数量(int)''文件名称(字符串)''每个文件的长度(长)'和'未解释字节的文件内容(byte [ ])'java网络断开的管道和收到的文件损坏
如果一切都成功了,那么我应该发送布尔值。
但问题是它没有正确接收文件。
我不时收到'broken pipe'错误消息或文件损坏。
解决了这个问题..
可能与您的问题有关的一件小事。你应该通过实际读取的字节数递减的,而不是字节数文件大小可变,请求读取:
while(fileSize>0){
if(fileSize < byteSize)
byteSize = (int)fileSize;
int byteRead = din.read(b, 0, byteSize);
fos.write(b);
fileSize -= byteRead; // <-- See here
}
+ 1这很可能是这个错误背后的真正问题。如果读取的字节数少于所需的字节数,可能会导致程序过早退出while循环并错误地获取下一个文件长度。这可能导致在没有更多数据时保持读取输入流。 –
你也应该检查'byteRead'结果,而不是每次都将整个缓冲区数组写入输出,而只是实际读取的字节数。否则,您可能会将读取的数据部分写入输出两次。 – Gandalf
它解决了我的问题!谢谢!! –
如果在读取输入时,发送方关闭你可能会得到这个错误连接。它可能与你的代码无关。发件人可能已超时,在传输完成之前关闭连接或其他许多事情。
的可能的复制[如何解决java.net.SocketException异常:残破的管道(http://stackoverflow.com/q/2309561/851811) –