1、Netty服务器端简单的DEMO源码分析_netty代码demo-程序员宅基地

技术标签: netty  

package com.zengweidaren.demo1.netty.source.echo;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.util.SelfSignedCertificate;

public final class EchoServer {

    static final boolean SSL = System.getProperty("ssl") != null;
    static final int PORT = Integer.parseInt(System.getProperty("port", "8009"));

    public static void main(String[] args) throws Exception {

        final SslContext sslCtx;
        if (SSL) {
            SelfSignedCertificate ssc = new SelfSignedCertificate();
            sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()).build();
        } else {
            sslCtx = null;
        }
        
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        //1
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
        //2
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)//2.1
             .channel(NioServerSocketChannel.class)//2.2
             .option(ChannelOption.SO_BACKLOG, 100)
             .handler(new LoggingHandler(LogLevel.INFO))//2.3
             .childHandler(new ChannelInitializer<SocketChannel>() {//2.4
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                     ChannelPipeline p = ch.pipeline();
                     if (sslCtx != null) {
                         p.addLast(sslCtx.newHandler(ch.alloc()));
                     }
                     p.addLast(new LoggingHandler(LogLevel.INFO));
                     //p.addLast(new EchoServerHandler());
                 }
             });

            ChannelFuture f = b.bind(PORT).sync();//2.5

            f.channel().closeFuture().sync();//2.6
        } finally {
            //2.7
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

 

1.1、当EventLoopGroup workerGroup = new NioEventLoopGroup();
执行时,会调用
DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt(
 "io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2));
,创建线程根据默认个线程 cpu 核数*2,可以充分的利用多核的优势。
1.2、调用多线程事件循环器    
protected MultithreadEventExecutorGroup(int nThreads, Executor executor,
                                            EventExecutorChooserFactory chooserFactory, Object... args) 
会创建, EventExecutor 数组 :EventExecutor[] children = new EventExecutor[nThreads];
EventExecutor 数组中的每一个元素都是NIOEventLoop,NIOEventLoop 实现了 EventLoop 接口    和 Executor 接口
1.3、遍历事件执行器,将每一个都添加一个监听器
        for (EventExecutor e: children) {
            e.terminationFuture().addListener(terminationListener);
        }
将EventExecutor 最后放入一个叫readonlyChildern的父类是Collections集合中
返回的workerCroup中包含:ExentExcetor,Collections,Atomiclnteger,DefaultPromise,DefalitEventExecutorChooseFactory
2.1、
ServerBootstrap 对象,他是一个引导类,用于启动服务器和引导整个程序的初始化
它和 ServerChannel  关联, 而 ServerChannel  继承了 Channel,有一些方法 remoteAddress 等
2.2.channel(NioServersSocketChannel.classs),通过添加了一个 channel , 其中参数一个 Class 对象, 引导类将通过这个 Class 对象反射创建
ChannelFactory。然后添加了一些 TCP 的参数。[说明:Channel 的创建在bind 方法,可以 Debug 下 bind ,会找到 channel = channelFactory.newChannel(); 
2.3: .handler(new LoggingHandler(LogLevel.INFO))再添加了一个服务器专属的日志处理器 handler。
2.4:childHandler(new ChannelInitializer<SocketChannel>() {@Override
                 public void initChannel(SocketChannel ch) throws Exception {.......}
再添加一个 SocketChannel(不是 ServerSocketChannel)的 handler
2.5ChannelFuture f = b.bind(PORT).sync();然后绑定端口并阻塞至连接成功。
2.6f.channel().closeFuture().sync();最后 main 线程阻塞等待关闭。
2.7bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();finally 块中的代码将在服务器关闭时优雅关闭所有资源


 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zengweidaren/article/details/109956391

智能推荐

java/php/node.js/python电影院订票系统【2024年毕设】-程序员宅基地

文章浏览阅读39次。springboot基于SpringBoot远程教学网页前端的设计与实现。springboot基于springboot的社区家庭医疗档案管理系统。springboot基于springboot的交互式教学微信小程序。springboot基于springboot的桌游信息管理系统。springboot微信小程序名胜风景推荐平台的设计。springboot基于微信小程序的毕设评阅答辩系统。springboot宠物救助管理系统的设计与实现。springboot小商品购物商场的设计与实现。

模运算中的逆元_模逆元 算法-程序员宅基地

文章浏览阅读1k次,点赞12次,收藏22次。但是在介绍之前需要先铺垫一些知识点, 想要直接跳到结尾。吗, 显然不行, 因为c++中的除号是整除。回到本文开头, 我们要求出。在c++中, 我们可以把。逆元: 在模运算中,定义: 有两个正整数。, 如果有一个正整数。_模逆元 算法

vatee万腾前瞻性的科技愿景:Vatee领先的技术创新-程序员宅基地

文章浏览阅读330次,点赞7次,收藏6次。Vatee万腾深信未来的科技将更加智能化,因此公司致力于研发和推动人工智能、机器学习等领域的技术创新。Vatee万腾以其前瞻性的科技愿景和领先的技术创新,正在引领着数字化时代的潮流。通过对未来的深刻洞察和创新力量的释放,Vatee万腾助推着科技发展进入了一个更加激动人心的新阶段。因此,公司在技术创新中注入了更多的人性化设计和个性化定制,以满足不同用户的需求,提供更加贴心的数字化体验。Vatee万腾一直以来都是科技领域的领军者,其前瞻性的科技愿景成为公司引领未来的驱动力。

Docker详解-程序员宅基地

文章浏览阅读3.8w次,点赞25次,收藏139次。Docker详解一、Docker基础1、Docker简介Docker 是一个开源的应用容器引擎,基于Go 语言并遵从 Apache2.0 协议开源。让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互隔离,性能开销极低。Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。2、_docker

多平台支持的RTSP-Server组件EasyRTSPServer如何实现自定义数据传输-程序员宅基地

文章浏览阅读342次。EasyRTSPServer是一套稳定、高效、可靠、多平台支持的RTSP-Server组件,接口调用非常简单成熟,无需关注RTSPServer中关于客户端监听接入、音视频多路复用、RTSP具体流程、RTP打包与发送等相关问题,支持多种音视频格式,再也不用去处理整个RTSP OPTIONS/DESCRIBE/SETUP/PLAY/RTP/RTCP的复杂流程和担心内存释放的问题了,非常适合于安防领域、...

用拓扑排序检测有向图中是否有环_拓扑排序判断有向图是否有环-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏15次。目录算法主要步骤代码测试数据提示:由于拓扑排序的检测方式不涉及到边权或点权,所以拓扑序列中的正环和负环都能够被检测出来。检测可达负环可以用Bellman-Ford或者SPFA。算法主要步骤1. 记录每个结点的入度,设置一个队列,专门存放入度为0的结点,设置一个整型计数变量inqNum,记录加入过队列的结点的个数。2. 首先将所有的入度为0的点放入队列中,进入while循环,条件是队列不为空,对于队列中的每一个点,都对齐后继结点的入度进行减一操作,如果在那之后该后继节点的入度变为0_拓扑排序判断有向图是否有环

随便推点

2024/4/19 MySQL索引结构-程序员宅基地

文章浏览阅读679次,点赞3次,收藏5次。如果查询语句的查询条件用了二级索引,但是查询的数据不是主键值,也不是二级索引值,这时在二级索引找到主键后,就需要回表才能查到数据,需要扫描两次B+树。在索引页中主要记录的是主键与页号,假设是主键id类型是bigint,那就是8字节,页号固定为4字节,那么索引页中一条数据也就是12byte,那么一个索引页可以存储 15 * 1024 / 12 ≈。叶子节点中存放的是真正的行数据,这个影响的因素就会多很多,比如字段的类型,字段的数量。我比较常用的是B+树索引,因为它是InnoDB引擎默认使用的索引类型,

使用PyQt实现QTableWidget的搜索和访问选中项功能_pyqt5 tablewidget搜索内容-程序员宅基地

文章浏览阅读628次。在使用PyQt制作表格界面时,我们常常需要实现搜索功能和访问当前选中项的需求。现在,我们就可以开始实现搜索功能了。在上述代码中,我们首先定义了要搜索的文本search_text,然后调用findItems方法查找匹配项,并将这些项设置为选中状态。接下来,我们实现访问当前选中项的功能。在上述代码中,我们调用selectedItems方法获取选中单元格的列表,并打印出每个单元格的行号、列号和文本值。以上就是如何使用PyQt实现QTableWidget的搜索和访问选中项功能的完整代码。_pyqt5 tablewidget搜索内容

PCDViewer的常用操作-程序员宅基地

文章浏览阅读4.5k次,点赞3次,收藏23次。PCDViewer是一款功能强大但操作极为简单的点云可视化和编辑软件,支持对点云的渲染显示、查询、量测、建图拼接、编辑、格式转换等功能,同时支持了pose文件、矢量文件等的显示。PCDViewer目前提供了Windows、Ubuntu18.04、Ubuntu20.04等版本。本页面总结了PCDViewer的基本、常用操作。在安装目录下,双击PCDViewer,或者通过命令行打开PCDViewer,即可启动软件。软件支持pcd、ply、las点云文件的打开。_pcdviewer

SpringCloud Gateway 新网关与zuul的对比选型_springcloud zuul和gateway对比-程序员宅基地

文章浏览阅读7.4k次,点赞4次,收藏13次。SpringCloud Gateway是Spring Cloud的一个全新项目, 基纡Spring 5.0+ Spring Boot 2.0和Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统- -的 API路由管理方式。SpringCloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Zuul,在Spring Cloud 2.0以..._springcloud zuul和gateway对比

Electron入门 01:快速入门_electron教程-程序员宅基地

文章浏览阅读9k次,点赞14次,收藏58次。文章目录目的总结目的总结_electron教程

【GRU回归预测】灰狼算法优化注意力机制卷积神经网络结合门控循环单元GWO-Attention-CNN-GRU数据预测(多维输入单输出)【含Matlab源码 3732期】-程序员宅基地

文章浏览阅读327次,点赞6次,收藏11次。灰狼算法优化注意力机制卷积神经网络结合门控循环单元GWO-Attention-CNN-GRU数据预测(多维输入单输出)完整的代码,方可运行;可提供运行操作视频!适合小白!

推荐文章

热门文章

相关标签