学习过程中有参考Redisson和RocketMq对于netty的使用
一、服务端
1、启动类
@Autowired
private WebsocketProperties properties;
@Autowired
private WebSocketChannelInitializer webSocketChannelInitializer;
NioEventLoopGroup bossGroup = new NioEventLoopGroup();
NioEventLoopGroup workerGroup = new NioEventLoopGroup();
public void start() throws InterruptedException {
prepareExecutorService();
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 1024)
.childOption(ChannelOption.TCP_NODELAY, true)
.childOption(ChannelOption.SO_KEEPALIVE, true)
.childHandler(webSocketChannelInitializer);
Channel channel = serverBootstrap.bind(properties.getPort()).sync().channel();
log.info("Websocket server run at port: " + properties.getPort());
channel.closeFuture().sync();
}
2、实现ChannelInitializer(暂时未考虑ssl)
@Autowired
private WebsocketProperties properties;
@Autowired
private HttpRequestHandler httpRequestHandler;
@Autowired
private TextWebSocketFrameHandler textWebSocketFrameHandler;
@Override
protected void initChannel(SocketChannel channel) throws Exception {
ChannelPipeline pipeline = channel.pipeline();
SslContext sslContext = configureSslContext();
if (sslContext != null) {
pipeline.addLast(sslContext.newHandler(channel.alloc()));
}
pipeline
.addLast(new WebSocketIdleStateHandler())
.addLast(new HttpServerCodec())
.addLast(new HttpObjectAggregator(65536))
.addLast(httpRequestHandler)
.addLast(PingWebSocketFrameHandler.INSTANCE)
.addLast(textWebSocketFrameHandler)
.addLast(CloseWebSocketFrameHandler.INSTANCE);
}
配置的空闲检测为读15秒钟,客户端心跳请求为10秒钟一次,需要注意的是&#x