Java 来自套接字 NIO ByteBuffer 的部分消息处理
Java Partial message handling from socket NIO ByteBuffer
我有一个缓冲区可以存储多条消息。假设缓冲区是 50 字节(让我试着用元代码来说明)
-------------------- (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 ....
此外,我知道第三条消息开始的位置,所以我只想将第三条消息的内容保留在我的缓冲区中。我以为做 compact 会是这样:
>>> readbuffer.compact()
然后简单地将相同的缓冲区传递回 socket.read()
>>> socket.read(readBuffer)
理想情况下,这会填满我的缓冲区
33333333|44444444|55555...
但是,我认为压缩并简单地将读取缓冲区传递回 sock.read() 不是正确的方法。
是否有以这种方式处理部分消息的众所周知的解决方案?我可以想到很多尝试的方法,但这必须是一个常见问题。我想尽可能避免中间创建缓冲区,但想不出一个不调用某种残留缓冲区的解决方案。
谢谢
你错了。使用 compact()
然后为下一个 read()
重新使用缓冲区正是正确的方法。
我有一个缓冲区可以存储多条消息。假设缓冲区是 50 字节(让我试着用元代码来说明)
-------------------- (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 ....
此外,我知道第三条消息开始的位置,所以我只想将第三条消息的内容保留在我的缓冲区中。我以为做 compact 会是这样:
>>> readbuffer.compact()
然后简单地将相同的缓冲区传递回 socket.read()
>>> socket.read(readBuffer)
理想情况下,这会填满我的缓冲区
33333333|44444444|55555...
但是,我认为压缩并简单地将读取缓冲区传递回 sock.read() 不是正确的方法。
是否有以这种方式处理部分消息的众所周知的解决方案?我可以想到很多尝试的方法,但这必须是一个常见问题。我想尽可能避免中间创建缓冲区,但想不出一个不调用某种残留缓冲区的解决方案。
谢谢
你错了。使用 compact()
然后为下一个 read()
重新使用缓冲区正是正确的方法。