我有一個存儲多條消息的緩衝區。說,緩衝區是50個字節(讓我嘗試與元代碼來說明這一點)Java從套接字NIO進行部分消息處理ByteBuffer
-------------------- (50 byte empty buffer)
和我的消息是大小20.在給定的套接字讀取,我可以得到1消息
|111111111|----------- (50 byte buffer with 1 20 byte message
或者兩個消息
|111111111|222222222|----
但是,如果我得到三個消息,我結束了一個局部的第三個消息
|111111111|222222222|3333 (TRUNCATE)
在下一socketread,所述第三消息的其餘部分來通過和字節流包含消息3的第二半:
>>> socket.read()
33334444444455555555 ....
此外,我知道所述第三消息開始時的位置,所以我我想簡單地將第三條消息的內容保留在我的緩衝區中。我想這樣做緊湊會出現這種情況:
>>> readbuffer.compact()
,然後簡單地通過這個相同的緩衝回socket.read()
>>> socket.read(readBuffer)
理想情況下,這將填補我的緩衝區所以
33333333|44444444|55555...
但是,我不認爲壓縮並簡單地將readbuffer傳遞迴sock.read()是正確的方法。
是否有一種以這種方式處理部分消息的衆所周知的解決方案?我可以想到很多事情要嘗試,但這必須是一個常見問題。我想盡可能地避免緩衝區的中間創建,但不能想到一個不會調用某種剩餘緩衝區的解決方案。
謝謝
是什麼讓你認爲'compact()'不是正確的方法?它是。 – EJP
我試着在下一個socket.read()調用之後打印bytearray,並且我不認爲socket.read()開始寫入緩衝區的位置。 IE,如果我的最後一個位置是P,那麼對socket.read()的調用是從P開始還是從0開始? –
它從P開始,就像Javadoc一樣。閱讀與放置相同。 – EJP