信创国产化替换如何推动企业自主创新与市场竞争力提升
713
2022-11-19
Netty-1-一个简单的服务器实例
文章所有涉及到“结论”的东西都是我自己从源码,注释,控制台打印结果出中推测出来的,请勿相信百分之百正确
POM文件,我的博客介绍所有关于netty的文章都基于netty4,netty3与4的写法有很多不同,netty5目测已经作废,我将逐步完善关于netty的学习笔记,打造没有任何多余代码的demo
下面写一个小的netty服务器,在windows环境下,首先,建1个类,是我们自己处理事件的事件类
1.事件类
public class MyServerHandler1 implements ChannelInboundHandler { private String objName = UUID.randomUUID().toString(); @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { System.out.println(objName + ":handlerAdded"); } @Override public void channelRegistered(ChannelHandlerContext ctx) throws Exception { System.out.println(objName + ":channelRegistered"); } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { System.out.println(objName + ":channelActive[所在通道:" + ctx.channel().id() + "]"); } @Override public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { System.out.println(objName + ":handlerRemoved"); } @Override public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { System.out.println(objName + ":channelUnregistered"); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { System.out.println(objName + ":channelInactive"); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { System.out.println(objName + ":channelRead"); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { System.out.println(objName + ":channelReadComplete"); } @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { System.out.println(objName + ":userEventTriggered"); } @Override public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception { System.out.println(objName + ":channelWritabilityChanged"); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { System.out.println(objName + ":exceptionCaught"); }}
下面是main函数,绑定9999端口
public static void main(String[] args) throws InterruptedException { EventLoopGroup boosGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); ServerBootstrap b = new ServerBootstrap(); b.group(boosGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new MyServerHandler1()); ChannelFuture f = b.bind(9999).sync(); f.channel().closeFuture().sync(); }
好了,一个简单的netty服务器搭建完成,接下来我准备往9999端口发送请求,你可以使用telnet命令,也可以用浏览器localhost:9999,反正无论什么协议,什么请求,都无所谓,因为最终都是byte数组而已,接下来,cmd调出windows窗口 输入
telnet localhost 9999
如图
则控制台打印出
f692156c-8985-45f1-be99-f6596fd565e2:handlerAddedf692156c-8985-45f1-be99-f6596fd565e2:channelRegisteredf692156c-8985-45f1-be99-f6596fd565e2:channelActive[所在通道:b86364f5]
然后我再cmd一个新的窗口,依然输入
telnet localhost 9999
此时控制台打印出
f692156c-8985-45f1-be99-f6596fd565e2:handlerAddedf692156c-8985-45f1-be99-f6596fd565e2:channelRegisteredf692156c-8985-45f1-be99-f6596fd565e2:channelActive[所在通道:da872349]
观察两次打印不同,得出结论 在本次示例代码中,打开两个客户端去连接服务端,使用了两个通道,但是这两个通道使用的handler是同一个handler,也就是说只new 了一次MyServerHandler1
继续操作,在黑窗口中按键盘上的任意按键,则控制台会输出
//从通道中读数据f692156c-8985-45f1-be99-f6596fd565e2:channelRead//数据读取完毕f692156c-8985-45f1-be99-f6596fd565e2:channelReadComplete
//我也不知道为什么关闭窗口会触发一次读事件f692156c-8985-45f1-be99-f6596fd565e2:channelReadCompletef692156c-8985-45f1-be99-f6596fd565e2:channelInactivef692156c-8985-45f1-be99-f6596fd565e2:channelUnregisteredf692156c-8985-45f1-be99-f6596fd565e2:handlerRemoved
结论: 一个客户端连接服务端,发送一条消息,再关闭客户端,服务端触发的事件如下 1.handlerAdded:将ChannelHandler添加到ChannelPipeline之后触发 2.channelRegistered:将Channel注册到EventLoop后触发 3.channelActive:将Channel激活后触发 4.channelRead:从NioServerSocketChannel中读数据后触发 5.channelReadComplete:目前并不清楚与channelRead的区别 6.channelReadComplete:当关闭客户端时,优先触发 7.channelInactive:将Channel设置成未激活后触发 8.channelUnregistered:将Channel从EventLoop移除后触发 9.handlerRemoved:将ChannelHandler从ChannelPipeline移除之后触发 九个步骤,八个(56相同)事件
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~