范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Netty基石,JavaNIO核心知识

  在深入 Netty 之前,我觉得有必要先对齐一下 Java NIO 的基础知识,因为 Netty 对底层网络 I/O 的操作就是基于 Java NIO 的,所以有必要了解一下。
  到时候看源码,会有很多概念,例如 Channel、Selector、SelectionKey、Buffer 等等,这篇我们就来了解下这些名词到底代表着什么,分别是什么意思。
  关于 Java NIO 相关的核心,总的来看包含以下三点,分别是:  Channel  Buffer  Selector  什么是 Channel
  翻译过来就是通道。
  我们可以往通道里写数据,也可以从通道里读数据,它是双向的,而与之配套的是 Buffer,也就是你想要往一个通道里写数据,必须要将数据写到一个 Buffer 中,然后写到通道里。
  从通道里读数据,必须将通道里的数据先读取到一个 Buffer 中,然后再操作。
  在 NIO 中 Channel 有多种类型:  SocketChannel  ServerSocketChannel  DatagramChannel  FileChannel  SocketChannel
  对标 Socket, 我们可以直接将它当做所建立的连接 。
  通过 SocketChannel ,我们可以利用 TCP 协议进行读写网络数据。  ServerSocketChannel
  可以对标 ServerSocket,也就是服务端创建的 Socket。
  它的作用就是监听新建连的 TCP 连接,为新进一个连接创建对应的 SocketChannel。
  之后,通过新建的 SocketChannel 就可以进行网络数据的读写,与对端交互。
  可以看到它主要是用来接待新连接,这功能主要就是服务端做的,所以叫 Server SocketChannel。 DatagramChannel
  看到 Datagram 应该就知道是 UDP 协议了,是无连接协议。
  利用 DatagramChannel 可以直接通过 UDP 进行网络数据的读写。  FileChannel
  文件通道,用来进行文件的数据读写。
  我们日常开发主要是基于这些 TCP 协议,所以我们把精力放在 SocketChannel 和 ServerSocketChannel 上即可。
  我们再回过头来继续看看 SocketChannel 和 ServerSocketChannel。
  SocketChannel 主要在两个地方出现:  客户端,客户端创建一个 SocketChannel 用于连接至远程的服务端。  服务端,服务端利用 ServerSocketChannel 接收新连接之后,为其创建一个 SocketChannel 。
  随后,客户端和服务端就可以通过这两个 SocketChannel 相互发送和接收数据。
  ServerSocketChannel 主要出现在一个地方:服务端。
  服务端需要绑定一个端口,然后监听新连接的到来,这个活儿就由 ServerSocketChannel 来干。
  服务端内常常会利用一个线程,一个死循环,不断地接收新连接的到来。  ServerSocketChannel serverSocketChannel    = ServerSocketChannel.open();  ...... while(true){   // 接收的新连接   SocketChannel socketChannel =       serverSocketChannel.accept();  ....... }
  至此,想必你应该清楚 ServerSocketChannel 和 SocketChannel 的区别和作用了。  Buffer
  Buffer 说白了就是内存中可以读写的一块地方,叫缓冲区,用于缓存数据。
  其实还真没啥好说的,最多就是讲讲 Java NIO Buffer 的 API。
  但讲 API 得太死板了,所以自己上网搜搜吧。我就告知一个结论,这个 API 很不好用,稍微漏写了点,就容易出错 bug,而且还有很多优化的之处,所以 Netty 没用 Java NIO Buffer 而是自己实现了一个 Buffer,叫 ByteBuf。
  等我们之后分析 ByteBuf 的时候再来盘一盘。现在你只需要知道 Buffer 主要用来缓存通道的读写数据即可。
  对了,看到这可能会有人提出疑问,为什么 Channel 必须和 Buffer 搭配使用?
  其实网络数据是面向字节的,但是我们读写的数据往往是多字节的,假设不用 Buffer ,那我们就得一个字节一个字节的调用读和调用写,想想是不是很麻烦?
  所以我们搞个 Buffer,把数据拢一拢,这样之后的调用才能更好地处理完整的数据,方便异步的处理等等。  Selector
  I/O多路复用的核心玩意。
  一个 Selector 上可以注册多个 Channel ,我们从上面得知一个消息 Channel 就对应了一个连接,因此一个 Selector 可以管理多个 Channel 。
  具体管理什么?
  当任意 Channel 发生读写事件的时候,通过  Selector.select()  就可以捕捉到事件的发生,因此我们利用一个线程,死循环的调用 Selector.select() ,这样可以利用一个线程管理多个连接,减少了线程数,减少了线程的上下文切换和节省了线程资源。
  这就是 Selector 的核心功能,然后我们再来细说具体是怎样管理的。
  首先,创建一个 Selector。  Selector selector = Selector.open();
  然后,你需要将被管理的 Channel 注册到 Selector 上,并声明感兴趣的事件。  SelectionKey key = channel.register(selector, Selectionkey.OP_READ);
  事件一共有以上四种类型,注册的时候可以同时对多种类型的事件感兴趣,例如:  SelectionKey key    = channel.register(selector,     Selectionkey.OP_READ | SelectionKey.OP_WRITE);
  这样,当这个 Channel 发生读或写事件,我们调用  Selector.select() 就可以得知有事件发生。
  具体 Selector.select() 有三个重载方法:  int selectNow(),不论是否有无事件发生,立即返回  int select(long timeout),至多阻塞 timeout 时间(或被唤醒),如果提早有事件发生,提早返回  int select(),一直阻塞着,直到有事件发生(或被唤醒)
  返回值就是就绪的通道数,一般判断大于 0 即可进行后续的操作。
  后续的操作就是调用:  Set selectedKeys = selector.selectedKeys();
  获得了一个类型为 Set 的 selectedKeys 集合,那这个 selectedKeys 又是啥玩意?
  我们来看一下它的方法和成员:
  看到这些成员,其实我们就很清晰了,我们可以通过 selectedKey 得知当前发生的是什么事件,有 isAcceptable、isReadable 等等。
  然后还能获得对应的 channel 进行相应的读写操作,还有获取 attachment 等等。
  所以得到了 selectedKeys 就可以 通过迭代器遍历所有发生事件的连接 ,然后进行操作。
  大致使用的代码如下所示:  while(true) {  int readyNum = selector.select();  if (readyNum == 0) {     continue;  }  Set selectedKeys = selector.selectedKeys();  Iterator keyIterator = selectedKeys.iterator();  while(keyIterator.hasNext()) {     SelectionKey key = keyIterator.next();     if(key.isAcceptable()) {         // a connection was accepted by a ServerSocketChannel.     } else if (key.isConnectable()) {         // a connection was established with a remote server.     } else if (key.isReadable()) {         // a channel is ready for reading     } else if (key.isWritable()) {         // a channel is ready for writing     }     keyIterator.remove(); //执行完毕之后,需要在循环内移除自己  } }
  还有个方法就是  Selector.wakeup() ,可以唤醒阻塞着的 Selector。
  对了还有一点没说,就是如果 Channel 要和 Selector 搭配,那它必须得是非阻塞的,即配置  channel.configureBlocking(false);
  从上面的操作,我们可以得知 Selector 处理事件的时候必须快,如果长时间处理某个事件,那么注册到 Selector 上的其他连接的事件就不会被及时处理,造成客户端阻塞。
  至此,想必你应该清晰 Selector 具体是如何管理这么多连接的了。
  参考:  https://ifeve.com/java-nio-all/

好看又能打,送给ta的七夕数码礼物清单突然发现最近朋友圈又开始讨论不良的送礼风气了,我正疑惑,最近也没啥重大节日啊!当我翻开日历之后,发现原来又要过七夕节了。为什么说又,现在商家为了商业炒作,随便都能造个节日。如果要细2022年7月22日华强北手机批发报价单今日各品牌手机报价已出,欢迎查看交流评论留言,喜欢的点击关注了解手机每日走势!华为一加苹果苹果荣耀华为三星苹果SoloJBL魅族飞利浦小米红米黑鲨哈曼卡顿华为荣耀华硕SKG戴森vi荣耀平板8预售,4128GB只要1399元昨夜HONOR荣耀发布会正式发布并开售最新的平板电脑荣耀平板8,拥有曙光蓝晨曦金和薄荷绿三种配色,金属机身厚度仅为6。9mm,重量轻至520g,单手握持更舒适,7。2mm窄边框搭配离婚6年后,王宝强抚养儿子马蓉抚养女儿,兄妹见面对比太明显根据数据调查,目前我们国内单亲家庭的孩子数量大约有50万,而这些从小缺乏父母关爱,在单亲家庭环境下长大的孩子,很多都患有不同程度的心理疾病,有些人不善交谈心理自卑,尤其是踏入社会后一个最省钱的美容法学会洗脸洗脸,是一件再简单不过的事情了,简单到没人会主动去思考到底该怎么洗比较好,很多人觉得,洗脸谁不会,不就是把洗面奶涂脸上,一冲不就好了吗,但是事实真的是这样吗?不当的洗脸方法,不仅会人工智能预测金州勇士卫冕成功,列五大取胜之匙,条条言之凿凿NBA进入长草期,夏季联赛也落下了帷幕,美媒又开始搞事情,随着在ESPY年度大会上,金州勇士独揽四项大奖后,美媒通过人工智能对202324NBA赛季的总冠军归属,作出了大胆的预测,拳王梅威瑟再炫富花费12万元,为外孙安装貂皮儿童座椅前5个级别拳王弗洛伊德梅威瑟又炫富了,但这次他没有将重点放在自己身上,而是为外孙小肯特雷尔安装了价值不菲的貂皮儿童座椅。生活中的梅威瑟,愿意在美好的事物上砸钱,他从不亏待自己,更不再见欧文!曝湖人2换2交易方案,用威少塔克换回2射手NBA记者DaveMcMenamin在NBAToday节目中谈到了威少与欧文的交易进展,他表示佩林卡一直在给各个球队打电话,寻求把威少交易出去。就篮网方面而言,这笔交易谈判没有进展为何不能用手触摸逝者遗体?入殓师跟恐惧无关,就算亲人也不行2021年10月29日,日本电影入殓师修复版4K在中国上映,这部电影让我们清楚地认识了一个特殊职业入殓师。电影中有句经典语录死亡就是一扇门,它不意味着生命的结束,而是穿过它进入另一关于李小龙电影的惊人事实是什么?在照片中,我们看到前NBA篮球运动员卡里姆阿卜杜勒贾巴尔(KarimAbdulJabbar)与李小龙一起在电影死亡游戏中演出,这是李小龙在1972年不幸去世前拍摄的最后一部电影。李马斯克通过比特币割了把韭菜最近看到马斯克卖掉了大部分比特币,套现了63亿美元。名义上是为公司流动资金,我看他就是赚够了想溜。比特币没有国家信用,也没有法律保障,只能是一场无政府主义的狂欢和财富幻觉。它只是一
被狂灌7球后哥斯达黎加主帅宣布全员封闭训练在2022年世界杯首轮小组赛中,哥斯达黎加07惨败给西班牙。哥斯达黎加足协要求全队进行封闭集训,并且除官方新闻发布会之外禁止接受媒体采访。足协主席还表示,哥斯达黎加主帅苏亚雷斯不会哈登替身24910,76人险胜倒数第2!哈里斯2310,哈雷尔立大功北京时间11月26日,NBA常规赛继续进行。费城76人队奔赴客场,与奥兰多魔术队展开对决。该场比赛,詹姆斯哈登乔尔恩比德马克西塞布尔因伤缺战,东部排名倒数第2的魔术队也有多人缺席比王长伟十一月二十六日农历十一月初三思故乡叶县常村的山王长伟十一月二十六日农历十一月初三思故乡叶县常村的山一hr老青山(西唐山)伏牛山系老青山,南界方城北鲁山。叶县境内最高峰,昆水东去此发源。巍巍青山千秋画,滔滔澧水万古弦。李白吟诗留周末去哪儿丨载歌载舞迎你来!趁着县庆,总要去一趟融水吧融水苗族自治县成立70周年庆祝活动将于11月30日至12月1日举行届时将举办富有民族特色丰富多彩的庆祝活动活动安排表这就给各位安排上点击查看大图图源秀美融水风情苗乡(仅供参考,具体这些概念其实是伪科学,请不要被他们忽悠当今已经是一个知识爆炸的时代,但还是有一些产品打着科技的旗号来愚弄大家。这些貌似科学的概念完全违反了科学常识,属于哗众取宠的行为。一靠正常的食物不能摄取足够的维生素。我就纳闷了,如ColorOS13使用技巧小布助手,你的智能小管家以前看科幻电影的时候,总能看到各种智能管家,只要说出指令,它们就能替我们管理生活上和工作上的各种大小事务,例如开关灯处理来电邮件等,那时候的我真的异常羡慕。如今,随着科技的发展,虽王者法师出装性价比分析第一期今天就跟大家一起聊聊各种法术装备的性价比,看一看哪件法装能给你带来更高的输出。法师需要的属性不像射手那么多样化,基本就三个数值,法强冷却法穿。但由于法师输出技能的多种多样,这次统计大理攻略永无尽头的约会,大理古城隐匿的14家小店好在君blahblah疫情裹挟下的日子好像过得比往年过得更快大理古城的交通依赖步行和脚踏车而也恰好因为这样拉近和放缓了人和建筑之间的距离本篇将带您一起看看古城里面那些隐匿的小店靠近世界杯主教练们是哲学家也是魔法师新京报快评世界杯上的主教练们,从各个角度穷尽了现代人工作时的魅力。乌拉圭队海报,右一是主教练迭戈阿隆索。图国际足联官网图片文牛东平卡塔尔世界杯小组赛中,乌拉圭队被韩国队逼平,可乌拉圭队47岁每日一穴护膝要穴曲泉曲泉(合水穴)肝属木,肾属水,水能生木,肾为肝之母,根据虚则补其母的原则,肝之虚症,可用曲泉补之。肝虚则易倦乏力,肝虚则阳痿早泄,肝虚则心恐善惊,肝虚则血亏不孕,肝虚则头涨眩晕,肝陕西省美丽宜居示范村西安高新区2个村入选日前,陕西省住房和城乡建设厅发布了关于2022年陕西省美丽宜居示范村名单的公示,西安高新区草堂街道高冠村东大街道北大村2个村入选。高冠村位于西安高新区南部,秦岭北麓半坡地带,包括李