Netty实战教学(一)

项目需求


现有智能装备柜若干,需要一个平台系统对其进行统一管理。柜子主控和平台之间通过TCP协议进行通信,要求如下:

  • 心跳保持。柜子主控每隔30秒发一次心跳,平台回复相应心跳。

  • 柜子发送心跳的通信帧结构

    帧头2byte 帧长度2byte 通信类型2byte 端口1byte 柜号8byte 校验和1byte 帧尾2byte
    0x5A55 0x000E 0x1002 0x0F 0x6A69
  • 平台回复心跳的通信帧结构

    帧头2byte 帧长度2byte 通信类型2byte 端口1byte 校验和1byte 帧尾2byte
    0x5A55 0x0006 0x1002 0x0F 0x6A69

Netty 服务端


柜子主控通过TCP协议和平台进行通信,我们选用Netty来搭建服务端作为平台的通信模块。为什么选用Netty呢?这个我们后面再作介绍。

监听8090端口

作为TCP服务端,肯定需要监听相关端口。使用Netty构建Server服务并绑定相关端口的方法很简单,代码如下:

public class NettyServer {
   
  private static final Logger LOGGER = LoggerFactory.getLogger(NettyServer.class);

  private EventLoopGroup bossGroup = new NioEventLoopGroup();   //1
  private EventLoopGroup workerGroup = new NioEventLoopGroup();

  private int port = 8090;

  public void run() throws InterruptedException {
   
    ServerBootstrap b = new ServerBootstrap();                  //2
    b.group(bossGroup, workerGroup)
            .channel(NioServerSocketChannel.class)              //3
            .childHandler(new ChannelInitializer<SocketChannel>() {
   
              @Override
              public void initChannel(SocketChannel ch) throws Exception {
   
                ch.pipeline().addLast(new ServerHandler());     //4
              }
            })
            .option(ChannelOption.SO_BACKLOG, 128)
            .childOption(ChannelOption.SO_KEEPALIVE, true);

    // 绑定8090端口
    ChannelFuture f = b.bind(port).sync();

    if(f.isSuccess()){
   
      LOGGER.info("启动 Netty 服务端成功!");
    }

    // 阻塞线程一直到channel关闭
    f.channel().closeFuture().sync().channel();
  }
}

(1) NioEventLoopGroup 是用来处理I/O操作的多线程事件循环器,Netty提供了许多不同的EventLoopGroup的实现用来处理不同传输协议。在这个例子中我们实现了一个服务端的应用,因此会有2个NioEventLoopGroup会被使用。第一个经常被叫做‘boss’,用来接收进来的连接。第二个经常被叫做‘worker’,用来处理已经被接收的连接,一旦‘boss’接收到连接,就会把连接信息注册到‘worker’上。对于TCP连接,‘worker’是用来处理那些已经完成‘3次握手’的连接,而‘boss’是处理那些尚未完成的连接。
(2) ServerBootstrap 是一个启动NIO服务的辅助启动类。
(3) 这里我们指定使用NioServerSocketChannel类来举例说明一个新的Channel如何接收进来的连接。
(4) 这里的事件处理类经常会被用来处理一个最近的已经接收的ChannelChannelInitializer是一个特殊的处理类,他的目的是帮助使用者配置一个新的Channel。当你的程序变的复杂时,可能你会增加更多的处理类到pipline上,然后提取这些匿名类到最顶层的类上。这里,我们只配置了一个简单的ServerHandler处理类,下一节将介绍。
(5) 你可以设置这里指定的通道实现的配置参数。我们正在写一个TCP/IP的服务端,因此我们被允许设置socket的参数选项比如tcpNoDelay和keepAlive。请参考ChannelOption和详细的ChannelConfig实现的接口文档以此可以对ChannelOptions有一个大概的认识。
(6) 你关注过option()和childOption()吗?option()是提供给NioServerSocketChannel用来接收进来的连接。childOption()是提供给由父管道ServerChannel接收到的连接,在这个例子中也是NioServerSocketChannel

自定义处理类

上面的代码,除了ServerHandler类需要自己定义外,其他的Netty都已经帮我们封装好了。搭建一个Netty Server服务,我们只需要按照上面的模板,替换或者添加相关处理类。例子中的ServerHandler类功能很简单,就是将接受到的信息打印出来,代码如下:

public class ServerHandler extends 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值