Netty服务端Server代码说明

本文是简单的Netty启动服务端代码理解笔记

public class MyServer { public static void main(String[] args) throws Exception{ //创建两个线程组,Boss用来接收,Worke用来处理已经建立连接的Channel EventLoopGroup bossGroup = new NioEventLoopGroup(1); //默认8个NioEventLoop CPU核心*2 EventLoopGroup workerGroup = new NioEventLoopGroup(); try { //创建一个服务端启动器 ServerBootstrap serverBootstrap = new ServerBootstrap(); //为服务端启动器指定两个时间循环组(NIOEventGroup),前者用来Accept,后者处理已经连接的Channel serverBootstrap.group(bossGroup, workerGroup); //为服务端指定ServerSocketChannel的类型是NioServerSocketChannel serverBootstrap.channel(NioServerSocketChannel.class); //handler是指为BossGroup添加处理程序 serverBootstrap.handler(new LoggingHandler(LogLevel.INFO)); //childhandler是指WorkGroup,也就是为处理事件循环组添加处理方法,在这儿添加了一个Channel(通道)初始化器 //这个初始化器主要是传递SocketChannel serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() { //得到这个传递进来的SocketChannel之后,获取它的管道,这个管道本质是一个双向链表 @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); //加入一个netty 提供 IdleStateHandler /* 说明 1. IdleStateHandler 是netty 提供的处理空闲状态的处理器 2. long readerIdleTime : 表示多长时间没有读, 就会发送一个心跳检测包检测是否连接 3. long writerIdleTime : 表示多长时间没有写, 就会发送一个心跳检测包检测是否连接 4. long allIdleTime : 表示多长时间没有读写, 就会发送一个心跳检测包检测是否连接 5. 文档说明 triggers an {@link IdleStateEvent} when a {@link Channel} has not performed read, write, or both operation for a while. 6. 当 IdleStateEvent 触发后 , 就会传递给管道 的下一个handler去处理 通过调用(触发)下一个handler 的 userEventTiggered , 在该方法中去处理 IdleStateEvent(读空闲,写空闲,读写空闲) */ pipeline.addLast(new IdleStateHandler(7000,7000,10, TimeUnit.SECONDS)); //加入一个对空闲检测进一步处理的handler(自定义) pipeline.addLast(new MyServerHandler()); } }); //启动服务器,指定端口并且阻塞运行等待结果 ChannelFuture channelFuture = serverBootstrap.bind(7000).sync(); channelFuture.channel().closeFuture().sync(); }finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } }
public class MyServerHandler extends ChannelInboundHandlerAdapter { /** * @param ctx 上下文 * @param evt 事件 * @throws Exception */ @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { //userEventTriggered 用户事件触发 if(evt instanceof IdleStateEvent) { //将 evt 向下转型 IdleStateEvent IdleStateEvent event = (IdleStateEvent) evt; String eventType = null; switch (event.state()) { case READER_IDLE: eventType = "读空闲"; break; case WRITER_IDLE: eventType = "写空闲"; break; case ALL_IDLE: eventType = "读写空闲"; break; } System.out.println(ctx.channel().remoteAddress() + "--超时时间--" + eventType); System.out.println("服务器做相应处理.."); //如果发生空闲,我们关闭通道 // ctx.channel().close(); } } }

__EOF__

本文作者等不到的口琴
本文链接https://www.cnblogs.com/Courage129/p/14259601.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   等不到的口琴  阅读(428)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示