应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

认识Netty之helloworld

  最近一直在看与IM相关的东西说到这个java中应该要说到netty,下面来认识一下netty。
  开始了解netty之前我们先了解下传统的IO编程。IO编程
  我们来做一个比较简单的demo:客户端每隔5秒发送一条消息到服务端,服务端收到消息打印出来。服务端实现
  Server端首先创建了一个serverSocket来监听8000端口,然后创建一个线程,线程里面不断调用阻塞方法serversocket。accept();获取新的连接,当获取到新的连接之后,给每条连接创建一个新的线程,这个线程负责从该连接中读取数据,然后读取数据是以字节流的方式。packagecom。pine。springbootdemo01。netty;importjava。io。IOException;importjava。io。InputStream;importjava。net。ServerSocket;importjava。net。Socket;authoranziyangversionV1。0date20223111:53上午publicclassIOServer{publicstaticvoidmain(String〔〕args)throwsException{ServerSocketserverSocketnewServerSocket(8000);接收新连接线程newThread((){while(true){try{阻塞方法获取新的连接SocketsocketserverSocket。accept();每一个新的连接都创建一个线程,负责读取数据newThread((){try{intlen;byte〔〕datanewbyte〔1024〕;InputStreaminputStreamsocket。getInputStream();按字节流方式读取数据while((leninputStream。read(data))!1){System。out。println(newString(data,0,len));}}catch(IOExceptione){System。err。println(e);}})。start();}catch(IOExceptione){System。err。println(e);}}})。start();}}客户端实现
  启动一个线程连接到服务端,循环中每次睡眠五秒也就是每隔五秒发送一次消息。packagecom。pine。springbootdemo01。netty;importjava。io。IOException;importjava。net。Socket;importjava。util。Date;authoranziyangversionV1。0date20223111:54上午publicclassIOClient{publicstaticvoidmain(String〔〕args){启动一个线程newThread((){try{SocketsocketnewSocket(127。0。0。1,8000);while(true){try{socket。getOutputStream()。write((newDate():helloworldsocket)。getBytes());睡眠5秒Thread。sleep(5000);}catch(Exceptione){System。err。println(e);}}}catch(IOExceptione){System。err。println(e);}})。start();}}
  先启动server端然后启动client可以看到server收到请求如下:
  上面的demo,从服务端代码中我们可以看到,在传统的IO模型中,每个连接创建成功之后都需要一个线程来维护,每个线程包含一个whiletrue死循环,那么10w个连接对应10w个线程,继而10w个while死循环,这就带来如下几个问题:线程资源受限:线程是操作系统中非常宝贵的资源,同一时刻有大量的线程处于阻塞状态是非常严重的资源浪费,操作系统耗不起线程切换效率低下:单机CPU核数固定,线程爆炸之后操作系统频繁进行线程切换,应用性能急剧下降。除了以上两个问题,IO编程中,我们看到数据读写是以字节流为单位。
  为了解决这三个问题,JDK在1。4之后提出了NIO。
  NIO(NonblockingIO,在Java领域,也称为NewIO),是一种同步非阻塞的IO模型,也是IO多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、IO处理问题的有效方式。
  NIO编程
  java对于非堵塞IO的支持是在2002年引入的,位于JDK1。4的java。nio包中。
  IO和NIO的区别:IO是面向字节流和字符流的,而NIO是面向缓冲区的。IO是阻塞模式的,NIO是非阻塞模式的NIO新增了选择器的概念,可以通过选择器监听多个通道。
  NIO用的是事件机制。它可以用一个线程把Accept,读,写操作,请求处理的逻辑全干了。如果什么事都没得做,它也不会死循环,它会将线程休眠起来,直到下一个事件来了再继续干活,这样的一个线程称之为NIO线程。
  packagecom。pine。springbootdemo01。netty;importjava。io。IOException;importjava。net。InetSocketAddress;importjava。nio。ByteBuffer;importjava。nio。channels。SelectionKey;importjava。nio。channels。Selector;importjava。nio。channels。ServerSocketChannel;importjava。nio。channels。SocketChannel;importjava。nio。charset。Charset;importjava。util。Iterator;importjava。util。Set;authoranziyangversionV1。0date2022312:29下午publicclassNIOServer{publicstaticvoidmain(String〔〕args)throwsIOException{SelectorserverSelectorSelector。open();SelectorclientSelectorSelector。open();启动一个线程绑定select用于监听是否有新的连接newThread((){try{对应IO编程中服务端启动ServerSocketChannellistenerChannelServerSocketChannel。open();listenerChannel。socket()。bind(newInetSocketAddress(8000));listenerChannel。configureBlocking(false);listenerChannel。register(serverSelector,SelectionKey。OPACCEPT);while(true){监测是否有新的连接,这里的1指的是阻塞的时间为1msif(serverSelector。select(1)0){SetSelectionKeysetserverSelector。selectedKeys();IteratorSelectionKeykeyIteratorset。iterator();while(keyIterator。hasNext()){SelectionKeykeykeyIterator。next();if(key。isAcceptable()){try{(1)每来一个新连接,不需要创建一个线程,而是直接注册到clientSelectorSocketChannelclientChannel((ServerSocketChannel)key。channel())。accept();clientChannel。configureBlocking(false);clientChannel。register(clientSelector,SelectionKey。OPREAD);}finally{keyIterator。remove();}}}}}}catch(IOExceptione){System。err。println(e);}})。start();启动一个线程绑定select用于监听哪些连接有数据可读newThread((){try{while(true){(2)批量轮询是否有哪些连接有数据可读,这里的1指的是阻塞的时间为1msif(clientSelector。select(1)0){SetSelectionKeysetclientSelector。selectedKeys();IteratorSelectionKeykeyIteratorset。iterator();while(keyIterator。hasNext()){SelectionKeykeykeyIterator。next();if(key。isReadable()){try{SocketChannelclientChannel(SocketChannel)key。channel();ByteBufferbyteBufferByteBuffer。allocate(1024);(3)面向BufferclientChannel。read(byteBuffer);byteBuffer。flip();System。out。println(Charset。defaultCharset()。newDecoder()。decode(byteBuffer)。toString());}finally{keyIterator。remove();key。interestOps(SelectionKey。OPREAD);}}}}}}catch(IOExceptione){System。err。println(e);}})。start();}}
  从上面的代码中我们可以看到NIO模型中通常会有两个线程,每个线程绑定一个轮询器selector,在我们这个例子中serverSelector负责轮询是否有新的连接,clientSelector负责轮询连接是否有数据可读服务端监测到新的连接之后,不再创建一个新的线程,而是直接将新连接绑定到clientSelector上,这样就不用IO模型中1w个while循环在死等,参见(1)clientSelector被一个while死循环包裹着,如果在某一时刻有多条连接有数据可读,那么通过clientSelector。select(1)方法可以轮询出来,进而批量处理,参见(2)数据的读写面向Buffer,参见(3)
  启动NIOServermain方法然后启动之前的client可以看到控制打印
  Netty编程
  首先看下netty如何实现服务端的:packagecom。pine。springbootdemo01。netty;importio。netty。bootstrap。ServerBootstrap;importio。netty。channel。ChannelHandlerContext;importio。netty。channel。ChannelInitializer;importio。netty。channel。SimpleChannelInboundHandler;importio。netty。channel。nio。NioEventLoopGroup;importio。netty。channel。socket。nio。NioServerSocketChannel;importio。netty。channel。socket。nio。NioSocketChannel;importio。netty。handler。codec。string。StringDecoder;authoranziyangversionV1。0date2022312:41下午publicclassNettyServer{publicstaticvoidmain(String〔〕args){ServerBootstrapserverBootstrapnewServerBootstrap();NioEventLoopGroupbossnewNioEventLoopGroup();NioEventLoopGroupworkernewNioEventLoopGroup();serverBootstrap。group(boss,worker)。channel(NioServerSocketChannel。class)。childHandler(newChannelInitializerNioSocketChannel(){protectedvoidinitChannel(NioSocketChannelch){ch。pipeline()。addLast(newStringDecoder());ch。pipeline()。addLast(newSimpleChannelInboundHandlerString(){OverrideprotectedvoidchannelRead0(ChannelHandlerContextctx,Stringmsg){System。out。println(msg);}});}})。bind(8000);}}
  上面代码明显比前面的NIO少很多代码,优雅了不少。
  可以看到netty服务端输出内容:
  本文就先聊这么多,主要是熟悉下netty编程,看下经典的helloworld。
  感觉有收获点个赞,转发下哦
  参考文档:
  https:juejin。cnbook6844733738119593991section6844733738270588942
  https:www。jianshu。comp432d5557a19e
  https:www。cnblogs。comflyingeaglearticles11031163。html

不动的大图书馆杂谈篇之消光2新DLC猩红纽带刺激体验【不动的大图书馆】系列,其意主要在于记录作者所体验或了解过的游戏、动漫、小说等相关内容,该系列将对以上内容进行游戏篇、动漫篇、小说篇的分类记录于系列之中,或短评,或介绍,或杂谈……小米12Pro手机评测一款优秀的旗舰手机小米12Pro是该公司最新的旗舰手机,旨在巩固其在高端旗舰领域的地位。小米在2021年的表现相当强劲,拥有一系列令人惊叹的小米11Ultra掌舵的旗舰设备,但是没有小米12Ul……俄乌空战中的自杀无人机值班作者宇多田出品虎嗅科技组头图来自Twitter2017年11月,加州大学伯克利分校的计算机视觉教授StuartRussell上传的一段7分钟视频,现在来看……俄罗斯宣布带美国宇航员一起返回地球,为何美国不派飞船去接?根据俄联邦航天局的计划,在今年3月18日的时候,俄罗斯将会发射飞船,送3名俄罗斯宇航员去国际空间站,之后,在3月30日的时候,会带着3名目前正在国际空间站执行任务的宇航员返回地……冯巩大战愈演愈烈,汪海林怒批足协是第一责任人,建议陈戍源跳舞自从中国男足输给越南后,国足就被推到了舆论的风口浪尖,几乎各个行业的人都会批下这个让人又爱又恨的群体。不久前,巩汉林直言不讳地点评了国足,尤其提到了他们拿高薪却丢国人脸的尴尬事……甲状腺疾病患者的营养小贴士已有一些科学证据表明一些特定食物和营养素可能影响甲状腺健康。虽然某些营养缺乏症(如碘和硒过少)可能是甲状腺功能减退的原因,但由于土壤质量、饮食和碘盐的使用,这些情况并不常……马克西哈登上场赛后跟我说要多打他在场上感受不到我的存在直播吧3月13日讯今日,76人球员马克西在球队训练结束后接受了媒体采访。谈到上一场比赛低迷表现(7中2得到4分),马克西表示:这完全是我自己的问题,与他人无关,我不会指责……想要成功,有几句话要悟透人生不可能总是顺心如意,但持续朝着阳光走,影子就会躲在后面。刺眼,却是对的方向!成功的路上会经过冷水关、汗水关和泪水关,宁可被人笑一时,不可被人笑一世。乐观是一首激……F1的不舒服问题笼罩在2022赛季,因为维斯塔潘和汉密尔顿续2022F1赛季的第一个比赛周末正在巴林进行,因为车手们参加了周五的练习赛当我们接近今年的第一场比赛时,谁将占据上风?自2021年阿布扎比大奖赛结束以来,围绕世界锦标赛的……Mo2C促进钠硫电池多硫化物氧化还原动力学【研究背景】室温钠硫(RTNaS)电池作为有前途的下一代储能器件候选者之一,由于其高能量密度和丰富的地球储量而受到越来越多的关注。然而,RTNaS电池的固有缺点(即巨大的……斧头湖是湖北省第三大湖武汉斧头湖迎来捕鱼高峰期斧头湖位于嘉鱼,江夏、咸安三县区交界处,位于东经1141011415,北纬29563007;最大湖长18。1千米,最大湖宽13。3千米;正常蓄水位21。……各地加快复工复产快递物流加速跑央视网消息:连日来,中国多地密集调整优化疫情防控措施,同时,各地加大助企纾困力度,多举措帮助企业加快复工复产。目前,企业生产、物流、旅游等各行各业正加快复工复产复苏。重庆……
被逆转后,沃格尔官宣决定!霍华德地位太尴尬,安东尼也遭到批评119127,洛杉矶湖人最终客场不敌华盛顿奇才,无缘连胜。说到连胜,湖人上一次的连胜,还要追溯到两个月之前,具体点就是70天之前,而湖人本赛季已经只剩下11场比赛了,他们能否在……从根本上解决电信诈骗!运营商出大招了彻底屏蔽境外短信3月22日消息,工信微报报道,江西电信、江西移动、江西联通发布联合公告,为严控境外诈骗短信,自3月28日起,江西省内用户国际及港澳台短信接收业务调整为依用户申请开通。用户……没人愿意揭开的电动车遮羞布?撰文马晓蕾编辑钱亚光设计师玉超来源seekingalpha作者:EricGroovenhoff电动汽车并不是一个新事物。早在1832年,电动汽车开……肠癌是怎么来的?提醒可能与3多2痛有关,建议了解谈癌色变并不夸张,癌症具有高发生率和高死亡率,所以它带给我们的印象并不好,家庭中一旦有人患有癌症,不仅再造成负担,在心理上也会承受很大的压力。夏方养生指南随着时代的发展,……孙颖莎长发也太可爱了吧莎莎被问到获得冠军想怎么庆祝,莎莎回答怎么庆祝?还是先回去好好休息吧这一小只小朋友真是累坏了。〔泣不成声〕〔泣不成声〕〔泣不成声〕〔泣不成声〕宠辱不惊,尊重对……脑力工作者和学生,不管有钱没钱,建议常吃这几种益智健脑的食物本期导读:脑力工作者和学生,不管有钱没钱,建议常吃这几种益智健脑的食物脑力工作者,你有没有出现过这种情况,经常会出现用脑过度,精神不安的情况,还有处在学习期的青少年,每天……拥抱阳春三月,看那醉人的美景在北方,三月天可能还有一些寒气逼人,冬天还没有过去。可是在南方,很多地方也是春暖花开,小草发芽,众多的花儿把大地装扮的五彩缤纷,河边的垂柳已发芽。河边垂柳,每年这个……被开除的前中国体操冠军,三次重伤远赴瑞士,隐忍8年奥运夺金在瑞士有这么一位华裔运动员,曾经不仅连续两年被瑞士评为瑞士最佳运动员,瑞士当地电视台还针对他的人生经历拍了一部收视率很高的自传类型的纪录片,后在瑞士及欧洲各国分别用德文和其他语……邓伦艺考时住80块钱一晚的地下室,普通家庭出身,经济条件并不01hr之前一次采访中,邓伦谈到自己出生在一个比较传统的家庭里,当时报考艺考的时候,住的是北京80块一晚的地下室,目的就是为省钱嘛,邓伦直言当时的经济条件并不宽裕另外他还……金世佳凭借猎罪图鉴成功出圈,展播弟弟,终于轮到你火了前段时间小白和今麦妹妹的戏火了,可以说是为2022年的国产剧开了个好头,相较于去年的青黄不接,今年的影视圈可说是佳作扎堆,让剧迷们大呼过瘾。最近刚刚上线的《猎罪图鉴》可以说很好……怎样开启冰雪探秘之旅?第二十届亚布力滑雪节发来冬日邀约12月8日,以酷雪生活为主题的第二十届亚布力滑雪节正式揭开亚布力滑雪旅游度假区今冬序章,期待与八方游客共赏冰雪之美、生态之美、极限之美和运动之美。相约冰雪文化盛宴搅热寒冬……我国空间站航天员出舱,身穿的3000万元衣服,为何无法带回地综述每当我们看到宇航员从太空顺利返回的时候,都会为他们深深松一口气,虽然我们国家的航空航天事业一直都保持着很高的水平,很少会有失败的案例,但是毕竟这是一个地球人从外太空走……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网