Java nio Socketchannel 的读写问题 - V2EX
zsh1995
V2EX    Java

Java nio Socketchannel 的读写问题

  •  
  •   zsh1995 Aug 4, 2018 3277 views
    This topic created in 2856 days ago, the information mentioned may be changed or developed.

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

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

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

    5 replies    2018-08-05 23:04:21 +08:00
    zjp
        1
    zjp  
       Aug 4, 2018 via Android
    因为不存在这种问题所以不需要处理
    http://zhuanlan.zhihu.com/p/30706315
    zsh1995
        2
    zsh1995  
    OP
       Aug 5, 2018 via Android
    @zjp tcp 不存在粘包的说法,但是应用层的逻辑需要对包进行划分呢
    owenliang
        3
    owenliang  
       Aug 5, 2018 via Android
    读到 buffer 里追加,然后反序列化,剩余字节保持在 buffer 里继续追加。
    zjp
        4
    zjp  
       Aug 5, 2018   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
       Aug 5, 2018
    @zjp 很棒的内容!感谢!
    About     Help     Advertise     Blog     API     FAQ     Solana     1667 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 16:19 PVG 00:19 LAX 09:19 JFK 12:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86