本文仅适用与Netty4.0.32版本,其他版本是否适用表示并不清楚...
Netty服务器启动步骤:
1、创建线程池
创建处理连结的线程池:bossGroup
创建处理所有丑闻的线程池:workerGroup
EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup();
2、设定辅助启动类。ServerBootStrap
传入1中开辟的线程池
指定连结该服务器的channel类别
指定还要执行的childHandler
设置部份参数,如AdaptiveRecvByteBufAllocator缓存大小
.Option适于设置bossGroup相关参数
.childOption适于设置workerGroup相关参数
2.5、此处可处理一个问题:超长字符串在服务端handler难以被一次接收完
可通过此句进行设置:.childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, MAX_LENGTH_OF_MSG, 65536))
ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class)//设置channel类型 .childOption(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(64, MAX_LENGTH_OF_MSG, 65536)) .childHandler(new childChannelHandler());//选择执行handler
此处的MAX_LENGTH_OF_MSG应当为2的次幂微端服务器,不然肯定不会是你设置的哪个值,具体会弄成哪些,源码还没看,等看了再补充...
2.75、构建Handler处理步骤
样例如下:
public class childChannelHandler extends ChannelInitializer{ @Override protected void initChannel(SocketChannel ch) throws Exception { //TODO 添加各种功能handler 消息加解密,消息规范检测,构建返回码 ch.pipeline().addLast(new NettyServerHandler()); } }
当要添加多个handler时,就应当留意添加的次序。
这里的handler分为两种类别:
一种承继ChannelInboundHandler,用于处理来自客户端的消息微端服务器,比如对客户端的消息进行解码,读取等等。该类别在pipeline中的执行次序与添加次序一致。
一种承继ChannelOutboundHandler,用于处理正式发往客户端的消息,比如对该消息进行编辑,编码等等。该类别在pipeline中的执行次序与添加次序相反。
而且ChannelOutboundHandler的所有handler,放在ChannelInboundHandler下边是执行不到的。