Java nio Socketchannel 的读写问题

2018-08-04 22:52:57 +08:00
 zsh1995

使用nio解决 tcp 粘包 /拆包问题时,常用到类似这样的代码:

while (socketChannel.read(byteBuffer) > 0) {
	// ...
}
	

在选择器中选择一个读就绪的 key,第一次read的话,肯定是非阻塞的,但是循环读的时候是不能保证下一个包已经到达,那read操作是阻塞的吗?
否则的话 nio 一个怎样处理粘包问题 ?

2308 次点击
所在节点    Java
5 条回复
zjp
2018-08-04 23:50:26 +08:00
因为不存在这种问题所以不需要处理
http://zhuanlan.zhihu.com/p/30706315
zsh1995
2018-08-05 09:04:48 +08:00
@zjp tcp 不存在粘包的说法,但是应用层的逻辑需要对包进行划分呢
owenliang
2018-08-05 09:22:45 +08:00
读到 buffer 里追加,然后反序列化,剩余字节保持在 buffer 里继续追加。
zjp
2018-08-05 10:38:01 +08:00
@zsh1995 这一块我也没完全清楚,重新捋了一下。有错的地方还望指出。
Channel 可以通过 socketChannel.configureBlocking() 设置阻塞模式。非阻塞下,一旦没有更多数据可读,read()立即返回 0,所以在一个 Readable 事件中可能只读到了部分数据。如果需要保存全部的数据,参考这里 http://tutorials.jenkov.com/java-nio/non-blocking-server.html
的 Storing Partial Messages 一节
zsh1995
2018-08-05 23:04:21 +08:00
@zjp 很棒的内容!感谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/476930

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX