我使用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緩衝輸出是什麼?是否有更好的方法從套接字讀取?
的'channelCopy()'方法的循環應該是'而(src.read(緩衝)> 0 || buffer.position ()> 0)。「然後你可以擺脫在EOF結束的那些東西。 – EJP
嗨@ejp,感謝您的評論;我希望你可能是對的,但我不太明白 - 你能否詳細說明一下?如果我用你的建議替換'while(src.read(buffer)!= -1)',在我看來複制操作可能會提前終止,例如,如果http傳輸暫時停止(讀取可能返回0因爲沒有新的數據可用,並且我們可以完成耗盡我們有的緩衝區,將它留在位置0,)但是此時終止循環是錯誤的(因爲EOF尚未到達) - 我在這裏錯過了什麼? – JVMATL
你錯過了'||。'後面的部分 – EJP