站务联系

Netty从没听过到入门 -- 服务器端详解

发布时间:2021-03-31   来源:网络整理    
字号:

本文仅适用与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下边是执行不到的。

图说天下

×
二维码生成