java socket输出流和断管

时间:2015-01-05 21:52:11

标签: java sockets outputstream broken-pipe

我必须向套接字流发送动态缓冲区大小。 它工作正常,但当我尝试发送多个大小的缓冲区 大于 int my_buffer_size =18 * 1024; (这是一个指示性值)

我收到错误(对于某些写入):

Java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)

我的代码非常简单: 例如,如果我想发送一个大文件,我用

读取文件流
byte[] bs = new byte[my_buffer_size];
while (... ){ 
fileInputStream.read(bs);
byte[] myBufferToSend = new byte[sizeBuffer];
DataOutputStream out = new DataOutputStream(cclient.getoutputStream());
out.writeInt(myBufferToSend.length);
out.write(myBufferToSend);
out.flush();
}

(该文件只是一个测试,缓冲区大小可以变化)

SendBufferSize是146988。

有没有办法修复损坏的管道错误?我读过,但实际上我没有解决问题。

谢谢 任何帮助表示赞赏

我使用经典的ServerSocket serverSocket; 和Socket cclient

1 个答案:

答案 0 :(得分:4)

'断管'意味着您已将数据写入已被另一端关闭的连接。

问题在于另一端,而不是在此代码中。可能另一端并不真正理解你的长字协议,或者没有正确实现它。

如果它与此代码类似,那么它不会被忽略,因为你忽略了read()返回的结果,并假设它填充了缓冲区。没有指定这样做,只传输至少一个字节。