Netty4.0学习笔记系列之六:多种通讯协议支持

本文深入探讨了如何使用Netty构建一个Server,以同时支持Person和String两种通讯协议。Person协议涉及将二进制流转换为Person对象,而String协议则涉及固定格式的String与Person对象的转换。通过定制PersonDecoder和StringDecoder实现不同协议的解码,再结合BusinessHandler处理业务逻辑。
摘要由CSDN通过智能技术生成

上文介绍了如何应用Netty开发自定义通讯协议,本文在此基础上进一步深化,研究如何同时支持不同的通讯协议。

此处所谓的通讯协议,指的是把Netty通讯管道中的二进制流转换为对象、把对象转换成二进制流的过程。转换过程追根究底还是ChannelInboundHandler、ChannelOutboundHandler的实现类在进行处理。ChannelInboundHandler负责把二进制流转换为对象,ChannelOutboundHandler负责把对象转换为二进制流。

接下来要构建一个Server,同时支持Person通讯协议和String通讯协议。

  • Person通讯协议:二进制流与Person对象间的互相转换。
  • String通讯协议:二进制流与有固定格式要求的String的相互转换。String格式表示的也是一个Person对象,格式规定为:name:xx;age:xx;sex:xx;
这时候,来自客户端的请求,会依次传递给两个通讯解析接口进行解析,每个通讯接口判断是否是匹配的协议,如果是则进行解析,如果不是则传递给其它通讯接口进行解析。

实体类:Person
[java]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.guowl.testobjcoder;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class Person implements Serializable{  
  6.     private static final long   serialVersionUID    = 1L;  
  7.     private String  name;  
  8.     private String  sex;  
  9.     private int     age;  
  10.   
  11.     public String toString() {  
  12.         return "name:" + name + " sex:" + sex + " age:" + age;  
  13.     }  
  14.   
  15.     public String getName() {  
  16.         return name;  
  17.     }  
  18.   
  19.     public void setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.   
  23.     public String getSex() {  
  24.         return sex;  
  25.     }  
  26.   
  27.     public void setSex(String sex) {  
  28.         this.sex = sex;  
  29.     }  
  30.   
  31.     public int getAge() {  
  32.         return age;  
  33.     }  
  34.   
  35.     public void setAge(int age) {  
  36.         this.age = age;  
  37.     }  
  38. }  

Server端的类为:Server PersonDecoder StringDecoder BusinessHandler
1、Server 开启Netty服务
[java]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.guowl.testobjcoder;  
  2.   
  3. import io.netty.bootstrap.ServerBootstrap;  
  4. import io.netty.channel.ChannelFuture;  
  5. import io.netty.channel.ChannelInitializer;  
  6. import io.netty.channel.ChannelOption;  
  7. import io.netty.channel.EventLoopGroup;  
  8. import io.netty.channel.nio.NioEventLoopGroup;  
  9. import io.netty.channel.socket.SocketChannel;  
  10. import io.netty.channel.socket.nio.NioServerSocketChannel;  
  11.   
  12. // 测试coder 和 handler 的混合使用  
  13. public class Server {  
  14.     public void start(int port) throws Exception {  
  15.         EventLoopGroup bossGroup = new NioEventLoopGroup();  
  16.         EventLoopGroup workerGroup = new NioEventLoopGroup();  
  17.         try {  
  18.             ServerBootstrap b = new ServerBootstrap();  
  19.             b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)  
  20.                     .childHandler(new ChannelInitializer<SocketChannel>() {  
  21.                         @Override  
  22.                         public void initChannel(SocketChannel ch) throws Exception {  
  23.                             ch.pipeline().addLast(new PersonDecoder());  
  24.                             ch.pipeline().addLast(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值