主要讲的是客户端向服务端发起请求,服务器的主要执行过程、解码问题、应答客户端。
执行流程:
- 最先加载的是服务端的handlerAdded,这个方法基本是super的
- 其次是channelRegistered,注册用的,这个方法其实也使用super就行无需做改动
- 第三是channelActive,类似激活,在前面两种方法的执行中比较重要的开始
- 第四是channelRead,这个是读取流,你可以在这个方法中加入自己对数据流的解析处理,同时也是对客户端做出应答的方法,如果存在自定义编码器,则编码器优先,二channelRead在后面
- 第五是channelReadComplete,字面理解读取数据流完成,在第四步骤已经处理过了或者继续往下走了
- 第六是channelInactive,失效,跟第三步骤是层次对应,到这就已经结束一次客户端请,服务端应答
备注:如果在初始化配置的时候,如果解码代码顺序问题也会导致这个顺序问题。
代码如下:
1.ServerBootstrap 服务启动类
package netty.NIO;
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 lombok.extern.slf4j.Slf4j;
@Slf4j
public class TimeServer {
public static void main(String[] args) {
int port = 9898;
new TimeServer().bind(port);
}
public void bind(int port) {
/**
* interface EventLoopGroup extends EventExecutorGroup extends ScheduledExecutorService extends ExecutorService
* 配置服务端的 NIO 线程池,用于网络事件处理,实质上他们就是 Reactor 线程组
* bossGroup 用于服务端接受客户端连接,workerGroup 用于进行 SocketChannel 网络读写*/
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
/** ServerBootstrap 是 Netty 用于启动 NIO 服务端的辅助启动类,用于降低开发难度
* */
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 1024)
.childHandler(new ChildChannelHandler());
/**服务器启动辅助类配置完成后,调用 bind 方法绑定监听端口,调用 sync 方法同步等待绑定操作完成*/
ChannelFuture f = b.bind(port).sync();
System.out.println(Thread.currentThread().getName() + ",服务器开始监听端口,等待客户端连接.........");
/**下面会进行阻塞,等待服务器连接关闭