Netty服务端初始化

一般需要两个线程组,一个是用来管理接受新线程的线程组(Boss),一个是处理每条连接的读写数据的线程组(Worker),可以理解成老板出去接活,员工干细活。所以服务端的创建关键代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class NettyServer {
public static void main(String[] args) {
NioEventLoopGroup bossGroup = new NioEventLoopGroup();//接受管理新的连接
NioEventLoopGroup workerGroup = new NioEventLoopGroup();//处理每条连接的数据读写

ServerBootstrap serverBootstrap = new ServerBootstrap();//引导类进行服务端的启动操作。
serverBootstrap
.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)//指定IO模型,也可以指定BIO等其他IO模型(OioServerSocketChannel.class)
.childHandler(new ChannelInitializer<NioSocketChannel>() {//childHandler()主要是用来处理每个新连接的数据读写的业务逻辑
protected void initChannel(NioSocketChannel ch) {
}
});

serverBootstrap.bind(8000);
}
}

常用方法

handler()方法和childHandler()

  • handler()一般是对服务端启动过程中的一些业务逻辑处理
  • childHandler()一般是处理新连接的数据的读写逻辑处理

attr()方法和childAttr()方法

  • attr()方法可以给服务端的channel自定义属性,实际上就是通过一个map维护不同的channel
  • childAttr()可以给每一条连接指定自定义属性,后续我们可以通过channel.attr()取出该属性。

应用场景:

  • 认证状态跟踪:您可以使用childAttr()来存储每个客户端连接的身份认证状态,以确保只有经过认证的客户端可以访问服务器资源。
  • 客户端会话信息:如果您的服务器需要跟踪每个客户端的会话信息,您可以使用childAttr()来存储会话数据,以便在处理客户端请求时访问它们。
  • 全局配置attr()方法可用于存储服务器级别的全局配置,例如监听端口号或服务器的标识。
  • 连接统计:您可以使用attr()childAttr()来记录连接的统计信息,例如连接的数量、连接的类型等。

childOption()方法和option()方法

  • childOption()可以给每条连接设置一些TCP底层相关的属性,比如上面,我们设置了两种TCP属性,其中

    • ChannelOption.SO_KEEPALIVE表示是否开启TCP底层心跳机制,true为开启
    • ChannelOption.TCP_NODELAY表示是否开启Nagle算法,true表示关闭,false表示开启,通俗地说,如果要求高实时性,有数据发送时就马上发送,就关闭,如果需要减少发送次数减少网络交互,就开启。
  • option()方法可以给服务端channel设置一些属性,最常见的就是so_backlog,如下设置

    1
    serverBootstrap.option(ChannelOption.SO_BACKLOG, 1024)

    表示系统用于临时存放已完成三次握手的请求的队列的最大长度,如果连接建立频繁,服务器处理创建新连接较慢,可以适当调大这个参数

bind()方法

  • 是一个异步方法,返回一个ChannelFuture可以通过给ChannelFuture添加一监听器GenericFutureListener监听端口,在这个监听器的operationComplete方法里面监听绑定是否成功。
1
2
3
4
5
6
7
8
9
serverBootstrap.bind(8000).addListener(new GenericFutureListener<Future<? super Void>>() {
public void operationComplete(Future<? super Void> future) {
if (future.isSuccess()) {
System.out.println("端口绑定成功!");
} else {
System.err.println("端口绑定失败!");
}
}
});

总结

  • 先创建引导类,指定线程模型,IO模型,连接读写处理逻辑,绑定端口即可启动服务端。
  • 可以给channel设置一些属性值,设置底层TCP参数