netty常用内置Handler

本文深入探讨Netty框架中IdleStateHandler的超时机制,及多种自定义帧解码器如LengthFieldBasedFrameDecoder、DelimiterBasedFrameDecoder等的应用技巧。通过实例解析,帮助读者掌握大型文件传输的优化策略,以及序列化技术在提高数据处理效率中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、new IdleStateHandler(this.readerIdleTime, this.writerIdleTime, this.allIdleTime, this.timeUnit))

根据你设置的超时参数的类型和值,循环去检测channelRead和write方法多久没有被调用了,如果这个时间超过了你设置的值,那么就会触发对应的事件,read触发read,write触发write,all触发all

 

2、LengthFieldBasedFrameDecoder自定义长度解码器

公式: 发送数据包长度 = 长度域的值 + lengthFieldOffset + lengthFieldLength + lengthAdjustment

参考:https://blog.youkuaiyun.com/thinking_fioa/article/details/80573483

 

3、DelimiterBasedFrameDecoder

4、LineBasedFrameDecoder

5、FixedLengthFrameDecoder

大型文件传输

FileRegion

6、ChunkedWriteHandler异步写大型数据流,不会导致大量内存消耗

 7、序列化

JBoss Marshalling

protobuf

 

Netty 是一款基于 NIO 的高性能网络框架,广泛应用于构建高并发、低延迟的服务端程序。在 Netty 中处理 JSON 编解码时,通常会结合第三方库(如 Jackson 或 Gson),将 Java 对象序列化为 JSON 字符串或将 JSON 数据反序列化回 Java 对象。 以下是关于如何实现 Netty 的 JSON 编解码的一个简单介绍: --- ### 1. **JSON 编解码的基本原理** - **编码 (Encode)**:将自定义的对象转换成 JSON 格式的字符串数据,在发送到客户端之前完成此操作。 - **解码 (Decode)**:从接收到的字节流中读取并解析出原始的数据结构,并将其还原为目标对象。 通过引入 `Handler` 和 `Codec` 组件可以轻松地对消息进行预处理和后置加工,其中常用的方式包括: #### (1)**使用内置工具包实现** 如果不想依赖外部库的话,则需要手动编写一些辅助函数来进行 json 转换;但这往往不如直接采用流行的开源项目方便快捷高效稳定可靠等特性明显优越很多倍以上哦~ #### (2)**借助第三方库支持** 例如 jackson-dataformat-msgpack 就是一个不错的选择因为它不仅能够满足基本需求而且还兼顾了性能考虑所以非常适合用来做这类事情呢!当然啦除了它之外还有不少其它同样优秀的候选方案可供挑选比如 fastjson等等都是很不错的选择~ --- ### 2. **示例代码** 下面给出一段简单的例子展示怎样利用 Jackson 完成上述任务: ```java import com.fasterxml.jackson.databind.ObjectMapper; public class JsonUtil { private static final ObjectMapper objectMapper = new ObjectMapper(); // encode object to jsonString public static String toJson(Object obj) throws Exception{ return objectMapper.writeValueAsString(obj); } // decode jsonString back into specific type of Object @SuppressWarnings("unchecked") public static <T> T fromJson(String jsonStr, Class<T> clazz)throws Exception{ return objectMapper.readValue(jsonStr,clazz); } } ``` 然后可以在 pipeline 配置期间加入相应的 handler 来自动处理这些转化工作: ```java ChannelPipeline p = ch.pipeline(); p.addLast(new StringEncoder()); p.addLast(new StringDecoder()); // 自定义处理器 p.addLast(new SimpleChannelInboundHandler<String>() { ... }); ``` 注意这里假设传输层已经采用了文本形式交换信息因此添加了 string 类型相关的 encoder decoder 。实际应用当中可能还需要额外设置字符集等相关参数以保证兼容性和正确性。 --- ### 3. **注意事项** - 确保线程安全当频繁访问共享资源时候尤其重要; - 合理控制缓冲区大小避免内存溢出风险发生; - 妥善管理连接生命周期防止泄漏浪费系统开销增大运维难度等问题出现.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值