4

動的バッファ サイズをソケット ストリームに送信する必要があります。正しく動作しますが、サイズが より大きい複数のバッファを送信しようとすると 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 を使用しています。およびソケット cclient

4

1 に答える 1

4

「壊れたパイプ」とは、もう一方の端で既に閉じられている接続にデータを書き込んだことを意味します。

したがって、問題はこのコードではなく、反対側にあります。たとえば、相手側が長語プロトコルを本当に理解していないか、正しく実装していない可能性があります。

このコードのようなものである場合は、返された結果を無視しread()、バッファがいっぱいになると想定しているため、そうではありません。それを行うことは指定されておらず、少なくとも 1 バイトを転送することのみが指定されています。

于 2015-01-05T23:34:24.760 に答える