2016-05-04 44 views
0

我有一個存儲多條消息的緩衝區。說,緩衝區是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()是正確的方法。

是否有一種以這種方式處理部分消息的衆所周知的解決方案?我可以想到很多事情要嘗試,但這必須是一個常見問題。我想盡可能地避免緩衝區的中間創建,但不能想到一個不會調用某種剩餘緩衝區的解決方案。

謝謝

+0

是什麼讓你認爲'compact()'不是正確的方法?它是。 – EJP

+0

我試着在下一個socket.read()調用之後打印bytearray,並且我不認爲socket.read()開始寫入緩衝區的位置。 IE,如果我的最後一個位置是P,那麼對socket.read()的調用是從P開始還是從0開始? –

+0

它從P開始,就像Javadoc一樣。閱讀與放置相同。 – EJP

回答

1

你錯了。使用compact(),然後重新使用下一個read()的緩衝區正是正確的方法。

+0

謝謝。看起來太優雅而不被信任。 –