| 1) public abstract class ReplayingDecoder<S> extends ByteToMessageDecoder |
| 2) ReplayingDecoder扩展了ByteToMessageDecoder类,使用这个类,我们不必调用readableBytes()方法。 |
| 参数S指定了用户状态管理的类型,其中Void代表不需要状态管理 |
| 3) 应用实例:使用ReplayingDecoder 编写解码器,对前面的案例进行简化 |
| public class MyByteToLongDecoder2 extends ReplayingDecoder<Void> { |
| @Override |
| protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { |
| |
| System.out.println("MyByteToLongDecoder2 被调用"); |
| |
| out.add(in.readLong()); |
| } |
| } |
| |
| # 修改如下 |
| public class MyServerInitializer extends ChannelInitializer<SocketChannel> { |
| |
| @Override |
| protected void initChannel(SocketChannel ch) throws Exception { |
| ChannelPipeline pipeline = ch.pipeline(); |
| |
| |
| |
| pipeline.addLast(new MyByteToLongDecoder2()); |
| |
| pipeline.addLast(new MyLongToByteEncoder()); |
| |
| pipeline.addLast(new MyServerHandler()); |
| } |
| } |
| |
| # 修改如下 |
| public class MyClientInitializer extends ChannelInitializer<SocketChannel> { |
| @Override |
| protected void initChannel(SocketChannel ch) throws Exception { |
| |
| ChannelPipeline pipeline = ch.pipeline(); |
| |
| |
| pipeline.addLast(new MyLongToByteEncoder()); |
| |
| |
| |
| pipeline.addLast(new MyByteToLongDecoder2()); |
| |
| pipeline.addLast(new MyClientHandler()); |
| |
| } |
| } |
| |
| MyByteToLongDecoder2 被调用 |
| 从客户端/127.0.0.1:63500 读取到long 123456 |
| MyLongToByteEncoder encode 被调用 |
| msg=98765 |
| |
| |
| MyClientHandler 发送数据 |
| MyLongToByteEncoder encode 被调用 |
| msg=123456 |
| MyByteToLongDecoder2 被调用 |
| 服务器的ip=localhost/127.0.0.1:7000 |
| 收到服务器消息=98765 |
| 4) ReplayingDecoder使用方便,但它也有一些局限性: |
| • 并不是所有的 ByteBuf 操作都被支持,如果调用了一个不被支持的方法,将会抛出一个UnsupportedOperationException。 |
| • ReplayingDecoder 在某些情况下可能稍慢于 ByteToMessageDecoder,例如网络缓慢并且消息格式复杂时,消息会被拆成了多个碎片,速度变慢 |
| |
- LineBasedFrameDecoder:这个类在Netty内部也有使用,它使用行尾控制字符(\n或者\r\n)作为分隔符来解析数据。
- DelimiterBasedFrameDecoder:使用自定义的特殊字符作为消息的分隔符。
- HttpObjectDecoder:一个HTTP数据的解码器
- LengthFieldBasedFrameDecoder:通过指定长度来标识整包消息,这样就可以自动的处理黏包和半包消息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
2021-08-09 错误处理
2021-08-09 spring boot文件上传