当前位置: 首页 > news >正文

netty的编解码器,以及内置的编解码器

一、编码器和解码器
1、什么是编码和解码
解码常用于入站操作,将字节转换为消息。编码用于出站,将消息转换为字节流
2、解码器ByteToMessageDecoder和ReplayingDecoder,ReplayingDecoder扩展了ByteToMessageDecoder类,使得我们不必使用readableBytes()方法,下面是两类测试代码

public class ToIntegerDecoder extends ByteToMessageDecoder {@Overridepublic void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<Object> list) throws Exception {if(in.readableBytes() >=4) {list.add(in.readInt());}}
}
public class ToIntegerDecoder2 extends ReplayingDecoder<Void> {@Overrideprotected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {list.add(byteBuf.readInt());}
}

3、编码器MessageToByteEncoder和MessageToMessageEncoder,其中T是原始消息的类型,这两个类分别代表将消息转换为字节流和将消息转换为其他类型的消息。下面代码分别为这两种的示例代码

public class ShortToByteEncoder extends MessageToByteEncoder<Short> {@Overrideprotected void encode(ChannelHandlerContext channelHandlerContext, Short aShort, ByteBuf byteBuf) throws Exception {byteBuf.writeShort(aShort);}
}
public class IntegerToStringEncoder extends MessageToMessageEncoder<Integer> {@Overrideprotected void encode(ChannelHandlerContext channelHandlerContext, Integer integer, List<Object> list) throws Exception {list.add(String.valueOf(integer));}
}

4、抽象的编解码器
ByteToMessageCodec:对编码和解码的整合,可以理解为对消息解码后再次编码。
MessageToMessageCodec:原理和ByteToMessageCodec同理。

二、内置的编码器和解码器
1、通过SSL/TTL保护的netty程序,通常是将SslHandler放在ChannelPipeline的头部,示例代码如下:

public class SslChannelInitializer extends ChannelInitializer<Channel> {private final SslContext sslContext;private final boolean startTls;public SslChannelInitializer(SslContext sslContext, boolean startTls) {this.sslContext = sslContext;this.startTls = startTls;//如果设置为true,第一个被写入的消息将不会被加密}@Overrideprotected void initChannel(Channel channel) throws Exception {SSLEngine sslEngine = sslContext.newEngine(channel.alloc());channel.pipeline().addFirst("ssl", new SslHandler(sslEngine,startTls));}
}

2、构建netty基于http/https协议的:客户端和服务器分别用HttpClientCodec和HttpServerCodec类即可。

public class HttpInitializer extends ChannelInitializer<Channel> {private final SslContext sslContext;private final boolean isClient;public HttpInitializer(SslContext sslContext, boolean isClient) {this.sslContext = sslContext;this.isClient = isClient;}@Overrideprotected void initChannel(Channel channel) throws Exception {//如果是https协议,则需要在通道下的管道头部追加SslHandlerChannelPipeline pipeline = channel.pipeline();SSLEngine engine = sslContext.newEngine(channel.alloc());pipeline.addFirst("ssl", new SslHandler(engine));if(isClient){pipeline.addLast("codec", new HttpClientCodec());}else {pipeline.addLast("codec", new HttpServerCodec());}}
}

3、websocket:websocket的WebSocketFrame类型通常包括BinaryWebSocketFrame(数据帧,二进制数据)、TextWebSocketFrame(数据帧,文本数据)、CloseWebSocketFrame(控制帧,一个Close请求、关闭的状态码及关闭的原因)、PingWebSocketFrame(控制帧,请求一个PongWebSocketFrame)和PongWebSocketFrame(控制帧,对PingWebSocketFrame进行响应)。
示例代码
websocket的处理类

public class TextFrameHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {@Overridepublic void messageReceived(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception{//处理数据}
}
public class WebsocketServerInitializer extends ChannelInitializer<Channel> {@Overridepublic void initChannel(Channel ch) throws Exception {ch.pipeline().addLast(new HttpServerCodec(),new HttpObjectAggregator(65536),new WebSocketServerProtocolHandler("/websocket"),new TextFrameHandler());}
}

4、空闲的连接和超时
IdleStateHandler:当连接空闲时间太长会触发事件。ReadTimeoutHandler读超时处理器,WriteTimeoutHandler写超时处理器
用法也是将他们的对象注册到通道里的管道中去。

channel.pipeline().addLast(new IdleStateHandler(0, 0, 60, TimeUnit.SECONDS));
http://www.dtcms.com/a/292969.html

相关文章:

  • Linux系统权限全面解析:掌握你的数字王国钥匙
  • Python 链接各种中间件[Mysql\redis\mssql\tdengine]
  • 数据结构01:链表
  • FashionAI / 智尚衣橱 / TryFit / 智能时尚搭配平台
  • 面试150 N皇后Ⅱ
  • Docker环境搭建RabbitMq集群详解
  • 【CAN】2.帧格式
  • ReasonFlux:基于思维模板与分层强化学习的高效推理新范式
  • Python接口自动化实战 ( 第一阶段) - 封装接口请求类和异常处理
  • Ubuntu 虚拟机配置 与Windows互传文件
  • react19相关问题和解答
  • 【技术新闻】OpenAI发布GPT-5,AI编程助手迎来革命性突破
  • React集成百度【BMap Draw】教程(001):实现距离测量和面积测量
  • dubbo源码分析之请求调用异步化原理
  • Pandas核心数据结构详解
  • 第3章通用的服务可用性治理手段——3.2 重试
  • Kotlin 作用域函数 let 的实现原理
  • 大疆视觉算法面试30问全景精解
  • 基于Java+MySQL实现(Web)文件共享管理系统(仿照百度文库)
  • Java自动拆箱机制
  • 云祺容灾备份系统阿里云对象存储备份与恢复实操手册
  • List<UserInfo> list = new ArrayList<>();为什么要这样创建数组?
  • 智能文本抽取在法院卷宗管理应用剖析
  • 力扣-139.单词拆分
  • Qt 网络编程如何采用Http进行通信
  • 碳化硅缺陷分类与原因
  • C++的lambda表达式原理
  • 【RK3576】【Android14】MIC开发调试
  • 【iOS】SideTable
  • [学习] 笛卡尔坐标系的任意移动与旋转详解