使用nio
解决 tcp 粘包 /拆包问题时,常用到类似这样的代码:
while (socketChannel.read(byteBuffer) > 0) {
// ...
}
在选择器中选择一个读就绪的 key,第一次read
的话,肯定是非阻塞的,但是循环读的时候是不能保证下一个包已经到达,那read
操作是阻塞的吗?
否则的话 nio
一个怎样处理粘包问题 ?
1
zjp 2018-08-04 23:50:26 +08:00 via Android
因为不存在这种问题所以不需要处理
http://zhuanlan.zhihu.com/p/30706315 |
3
owenliang 2018-08-05 09:22:45 +08:00 via Android
读到 buffer 里追加,然后反序列化,剩余字节保持在 buffer 里继续追加。
|
4
zjp 2018-08-05 10:38:01 +08:00 1
@zsh1995 这一块我也没完全清楚,重新捋了一下。有错的地方还望指出。
Channel 可以通过 socketChannel.configureBlocking() 设置阻塞模式。非阻塞下,一旦没有更多数据可读,read()立即返回 0,所以在一个 Readable 事件中可能只读到了部分数据。如果需要保存全部的数据,参考这里 http://tutorials.jenkov.com/java-nio/non-blocking-server.html 的 Storing Partial Messages 一节 |