私はJavaのBufferedInputStream
クラスを使用してソケットに送信されたバイトを読み取ります。 ソケットへのデータはHTTP形式なので、一般的に定義されたコンテンツ長、その後のコンテンツを持つヘッダです。BufferedInputStreamを使用したソケットの読み込み
私が抱えている問題は、時々BufferedInputStream.read()
が送信されたデータの全量を読み取らないということです。読み込まれたバイト数が返されますが、これは送信されたバイト数よりはるかに少なくなります。私はWiresharkので送信されたバイトを確認し、完全なメッセージが送信されて確認することができる)
以下のサンプルコード:
BufferedInputStream inFromClient = new BufferedInputStream(socket.getInputStream());
int contentLength = getContentLengthFromHeader();
byte[] b = new byte[contentLength];
int bytesRead = inFromClient.read(b, 0, contentLength);
を一度(読み取り)bytesRead
をcontentLength
に等しい時々終了が、他の機会にされていますread()はコンテンツの最後までは読んでいないようです。 誰が何が起こっているかについてのアイデアはありますか? Javaバッファリングは出力されますか?ソケットから読む方がいいですか?
に大きなバッファ、後者
BufferedInputStream.
変更の両方を必要としません。 ()> 0)。最後に、EOFで終わるものを取り除くことができます。 – EJPこんにちは@ejp、コメントありがとうございました。あなたはおそらく正しいと思いますが、私はそれほど得意ではありません - あなたは詳細を教えてください。 'while(src.read(buffer)!= -1)'をあなたの提案と置き換えた場合、たとえば、http転送が一時的に停止した場合(readは0を返す可能性がある)新しいデータが利用できないので、私たちが持っているバッファを排水し終えて、位置0にしておくことができます)。しかし、この時点でループを終了させるのは間違いでしょう(EOFに達していないためです)。 ? – JVMATL
あなたは '|| 'の後ろの部分を見逃しています – EJP