V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zsh1995
V2EX  ›  Java

Java nio Socketchannel 的读写问题

  •  
  •   zsh1995 · 2018-08-04 22:52:57 +08:00 · 2280 次点击
    这是一个创建于 2063 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    5 条回复    2018-08-05 23:04:21 +08:00
    zjp
        1
    zjp  
       2018-08-04 23:50:26 +08:00 via Android
    因为不存在这种问题所以不需要处理
    http://zhuanlan.zhihu.com/p/30706315
    zsh1995
        2
    zsh1995  
    OP
       2018-08-05 09:04:48 +08:00 via Android
    @zjp tcp 不存在粘包的说法,但是应用层的逻辑需要对包进行划分呢
    owenliang
        3
    owenliang  
       2018-08-05 09:22:45 +08:00 via Android
    读到 buffer 里追加,然后反序列化,剩余字节保持在 buffer 里继续追加。
    zjp
        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 一节
    zsh1995
        5
    zsh1995  
    OP
       2018-08-05 23:04:21 +08:00
    @zjp 很棒的内容!感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5205 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 09:27 · PVG 17:27 · LAX 02:27 · JFK 05:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.