Netty | 01 - 服务器启动流程以及常用api笔记
发布日期:2022-02-21 17:40:28
浏览次数:55
分类:技术文章
本文共 3288 字,大约阅读时间需要 10 分钟。
1 前言
要启动一个Netty服务端,必须要指定三类属性,分别是:
- 线程模型
- IO 模型
- 连接读写处理逻辑
有了这三者,之后在调用bind(8000),我们就可以在本地绑定一个 8000 端口启动起来, 话不多说看代码吧
2 代码
public class NettyServer { public static void main(String[] args) { // 这两个对象可以看做是传统IO编程模型的两大线程组 // bossGroup表示监听端口, accept 新连接的线程组 NioEventLoopGroup bossGroup = new NioEventLoopGroup(); // workerGroup表示处理每一条连接的数据读写的线程组 NioEventLoopGroup workerGroup = new NioEventLoopGroup(); // 创建引导类 ServerBootstrap,这个类将引导我们进行服务端的启动工作 ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap // 给引导类配置两大线程组,这个引导类的线程模型也就定型了 .group(bossGroup, workerGroup) // 指定服务端的 IO 模型 .channel(NioServerSocketChannel.class) // 定义后续每条连接的数据读写,业务处理逻辑 .childHandler(new ChannelInitializer() { // 泛型参数NioSocketChannel,这个类就是 Netty 对 NIO 类型的连接的抽象,NioServerSocketChannel也是对 NIO 类型的连接的抽象,NioServerSocketChannel和NioSocketChannel的概念可以和 BIO 编程模型中的ServerSocket以及Socket两个概念对应上 protected void initChannel(NioSocketChannel ch) { } }) /** ***************************************************************************** * 以上三个定义是最主要最核心的三个定义,下面扩展一些其他serverBootstrap中的方法 * ***************************************************************************** **/ // 和childHandler()方法对应起来,childHandler()用于指定处理新连接数据的读写处理逻辑 // handler()用于指定在服务端启动过程中的一些逻辑,通常情况下用不着这个方法 .handler(new ChannelInitializer () { protected void initChannel(NioServerSocketChannel ch) { System.out.println("服务端启动中"); } }) // attr()方法可以给服务端的 channel,也就是NioServerSocketChannel指定一些自定义属性 // 然后可以通过channel.attr()取出这个属性 // 比如指定服务端channel的一个serverName属性,属性值为nettyServer // 其实说白了就是给NioServerSocketChannel维护一个map而已,通常情况下也用不上这个方法 .attr(AttributeKey.newInstance("serverName"), "nettyServer") // childAttr可以给每一条连接指定自定义属性,然后通过channel.attr()取出该属性 .childAttr(AttributeKey.newInstance("clientKey"), "clientValue") // 可以给每条连接设置一些TCP底层相关的属性 // 表示是否开启TCP底层心跳机制,true为开启 .childOption(ChannelOption.SO_KEEPALIVE, true) // 表示是否开启Nagle算法,true表示关闭,false表示开启 // 通俗地说,如果要求高实时性,有数据发送时就马上发送,就关闭 // 如果需要减少发送次数减少网络交互,就开启 .childOption(ChannelOption.TCP_NODELAY, true) // 表示系统用于临时存放已完成三次握手的请求的队列的最大长度 // 如果连接建立频繁,服务器处理创建新连接较慢,可以适当调大这个参数 .option(ChannelOption.SO_BACKLOG, 1024) ; // 监听端口是否绑定成功 bind(serverBootstrap, 1000); } private static void bind(final ServerBootstrap serverBootstrap, final int port) { serverBootstrap.bind(port).addListener(future -> { if (future.isSuccess()) { System.out.println("端口[" + port + "]绑定成功!"); } else { System.err.println("端口[" + port + "]绑定失败!"); bind(serverBootstrap, port + 1); } }); }}
转载地址:https://blog.csdn.net/weixin_40597409/article/details/122812684 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年04月10日 23时55分05秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
木兰编程语言入门教程之二——控制走向
2019-04-26
基于「木兰」编译器,加十行代码实现 ∈ (属于集合)语法
2019-04-26
创建安卓键盘演示——“好不”
2019-04-26
木兰编程语言入门教程之三——函数和类型
2019-04-26
基于「木兰」逆向工程用 pyinstaller 生成可执行文件
2019-04-26
从微盟事件看商业数据公开化的必然趋势
2019-04-26
为新语言编写Visual Studio Code语法高亮插件
2019-04-26
手机编程环境初尝试-用AIDE开发Android应用
2019-04-26
Java关键字的汉化用词探讨
2019-04-26
程序员面试时用中文命名写白板代码的好处
2019-04-26
1992年日本对母语编程的可读性比较实验
2019-04-26
[转] 用python编写控制网络设备的自动化脚本3:启动
2019-04-26
扩展Python控制台实现中文反馈信息
2019-04-26
扩展Python控制台实现中文反馈信息之二-正则替换
2019-04-26
在PyPI测试平台发布Python包
2019-04-26
中文代码示例之Electron桌面应用开发初体验
2019-04-26
中文代码示例之NW.js桌面应用开发初体验
2019-04-26
为《 两周自制脚本语言 》添加中文测试代码
2019-04-26
将《 两周自制脚本语言 》测试中使用的接口中文化
2019-04-26