Netty | 01 - 服务器启动流程以及常用api笔记
发布日期:2022-02-21 17:40:28 浏览次数:22 分类:技术文章

本文共 2719 字,大约阅读时间需要 9 分钟。

1 前言

要启动一个Netty服务端,必须要指定三类属性,分别是:

  1. 线程模型
  2. IO 模型
  3. 连接读写处理逻辑

有了这三者,之后在调用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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:c++各种排序算法实现
下一篇:Netty | 03 - 客户端与服务端双向通信

发表评论

最新留言

初次前来,多多关照!
[***.77.167.74]2022年12月04日 12时19分14秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章