
Netty | 01 - 服务器启动流程以及常用api笔记
发布日期:2022-02-21 17:40:28
浏览次数:22
分类:技术文章
本文共 2719 字,大约阅读时间需要 9 分钟。
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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.77.167.74]2022年12月04日 12时19分14秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
最新文章
QT中插件分析
2019-07-31 22:59:22
qt 实现单例
2019-07-31 22:59:22
软件架构模式-读书笔记(5)-基于空间的架构
2019-07-31 22:59:21
软件架构模式-读书笔记(4)-微服务架构
2019-07-31 22:59:21
软件架构模式-读书笔记(3)-微内核架构
2019-07-31 22:59:20
软件架构模式-读书笔记(2)-事件驱动架构
2019-07-31 22:59:20
软件架构模式-读书笔记(1)-分层架构
2019-07-31 22:59:19
架构师都需要了解的康威定律(Konway‘s Law)
2019-07-31 22:59:19
开源JSON库Rapidjson与cJSON对比
2019-07-31 22:59:18
Docker Image,Container,Repository的概念理解
2019-07-31 22:59:18
Docker network driver分类及介绍 Bridge、host、overlay、macvlan(1)
2019-07-31 22:59:17
Docker Compose network配置
2019-07-31 22:59:17
node-red 安装和使用实例
2019-07-31 22:59:17
2020,我的CSDN博文之路
2019-07-31 22:59:16
ROS 使用GDB调试详解
2019-07-31 22:59:16
Python的协程与GIL
2019-07-31 22:59:15
Influxdb python API使用说明
2019-07-31 22:59:15
InfluxDB配置总结-通过配置参数和Curl命令
2019-07-31 22:59:15
python的@classmethod和@staticmethod详解
2019-07-31 22:59:14
python获取CPU和操作系统类型
2019-07-31 22:59:14