前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java nio 使用入门

java nio 使用入门

作者头像
平凡的学生族
发布2019-05-25 09:15:03
3630
发布2019-05-25 09:15:03
举报
文章被收录于专栏:后端技术后端技术后端技术

参考

  1. 简易的自动发消息机
  2. nio聊天室

前提知识

  1. 理解Selector、Channel、Buffer、SelectionKey
  2. 了解建立连接、通信、断开连接时的机制

理解Channel的read方法

参考Java NIO 读数据处理过程

  1. channel还有数据,继续读。
  2. channel中暂时没数据,但channel还没断开,这是读取到的数据个数为0,结束读,继续到select()处阻塞等待数据。
  3. 另一端channel.close()关闭连接,这时候读channel返回的读取数是-1,表示已经到末尾,跟读文件到末尾时是一样的。既然已经结束了,就把对应的SelectionKey给cancel掉,表示selector不再监听这个channel上的读事件。并且关闭连接,本端channel.close()。
  4. 另一端被强制关闭,也就是channel没有close()就被强制断开了,这时候本端会抛出一个IOException异常,要处理这个异常。

channel.read(buffer)返回0

while循环中,多次channel.read(buffer)、flip并write后,如果不调用clear会使read返回0 跟踪read方法到IOUtils的readIntoNativeBuffer方法,看到当limit - postion为0时,方法直接返回0。

疑问

  1. 如果有一个字符数很长的请求进入,是否照接受? 应当按情况处理,这是另一个话题了。所以nio不好用啊hhh,netty已经解决了这些问题。
  2. selector源码如何控制各个channel的通信顺序? 在Set<SelectedKey> selectedKeys中,按事件的激活顺序排列。
  3. 传输消息的序列化? 各种办法,JSON、HTML、分隔符分割都行。netty为这些都做好了方案,所以说别用nio用netty啊~
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.03.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考
  • 前提知识
  • 理解Channel的read方法
  • channel.read(buffer)返回0
  • 疑问
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档