2012-12-23 33 views
0

我有一個Java NIO套接字服務器。Java NIO SocketChannel讀預定義字節數

服務器從遠程客戶端獲得JSONObjects。 我使用的是SocketChannel.read(ByteBuffer)方法以便從通道讀取。每個消息以'\ n'結尾,標記當前消息的結尾。

我的問題是,有時read()方法來讀取更多的字節和「\ n」後到達.. 有沒有辦法對我來說,從SocketChannel只有等到「\ n」讀發現?我想可能是逐字節讀取(我只是找不到文件如何實現它..)?

其他解決方案?

回答

2

處理ByteBuffer中的字節直到'\ n',因此緩衝區的位置是'\ n'後的第一個字節,然後調用ByteBuffer.compact()。任何超過'\ n'的字節將保留在緩衝區中,下一次讀取將附加到它們。

+0

這不是一個壞主意,但我想留下SocketChannel內剩餘的數據來閱讀,所以選擇器會發現這是新的消息以後閱讀..這很重要,因爲我的服務器機制是爲每條消息 - 線程池中的一個線程將執行 –

+0

要做到這一點,您可能會按照您的建議一次讀取一個字節,我認爲這樣會導致性能不佳。我認爲,不要依賴SelectionKey的可讀性來了解何時有消息,每次讀取後都需要在緩衝區中查找'\ n'。無論如何,你可能必須這樣做,因爲批量讀取不會保證在一個調用中讀取整行(甚至可以讀取多行)。 – VGR