前段时间用netty3.x做了一个pipe的功能,读的速度很快,写的速度很慢,结果读总是把内存耗光(来不及写写到pipe的另一端),后面解决了这个问题。
原来的pipe的代码:
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { inboundChannel.write(e.getMessage()); }
inboundChannel是一个很慢的连接,而当前连接很快(messageReceived调用很频繁),inboundChannel的写缓冲区很快满了(inboundChannel.isWritable() =false),继续写很容易就OOM了,
修改后的代码是:
private Object trafficLock = new Object(); public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { synchronized (trafficLock) { inboundChannel.write(e.getMessage()); if (!inboundChannel.isWritable()) { e.getChannel().setReadable(false); } } } @Override public void channelInterestChanged(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { synchronized (trafficLock) { if (e.getChannel().isWritable()) { inboundChannel.setReadable(true); } } }
必须给双方的channel都添加包含上述代码的handler,才能生效;
上面的代码可以理解成:
1,如果对方channel不可写时,把当前channel的读操作禁用;
2,如果当前的channel可写了,把对方channel的读操作启用;
两个handler是对等的,恰好可以解决这个问题。
注意:两个handler必须共享锁trafficLock,具体原因,参见讨论:
http://markmail.org/message/x7jc6mqx6ripynqf
以及另外一个实例:
http://searchco.de/codesearch/view/16958454
相关推荐
springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合 netty做心跳检测 springboot整合...
Netty是一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 Netty是一个NIO客户端、服务端框架。允许快速简单的开发网络应用程序。...
它支持预读和后写,可以在不复制数据的情况下进行读写操作,从而提高了性能。 书中的代码案例会涵盖如何创建服务器、建立连接、处理各种网络事件,如连接建立、数据接收、连接关闭等。还会介绍如何定义自定义的编码...
它允许客户端向服务器请求播放、暂停、快进等操作,从而实现对远程媒体源的交互式控制。 2. Netty与RTSP服务器: 使用Netty构建RTSP服务器的优势在于其高度可定制性和高并发能力。Netty的NIO(非阻塞I/O)模型使得...
总结,利用 Netty 实现文件传输是一个涉及网络编程、多线程、I/O 操作以及内存管理的综合实践。通过 Netty 的强大功能,我们可以构建高效、可靠的文件传输系统。在实际应用中,还需要考虑到性能优化、安全性以及异常...
3. **ByteBuf**:Netty提供了自己的ByteBuf类,作为缓冲区,它比Java的ByteBuffer更易用且高效,支持直接内存和堆内存操作,避免了频繁的内存复制。 4. **零拷贝**:Netty通过使用FileRegion实现零拷贝,减少了CPU...
2. **ByteBuf**:Netty 提供了 ByteBuf 作为缓冲区,相比传统的 ByteBuffer 更加高效,支持零拷贝,方便进行数据读写操作。 3. **ChannelHandler**:这是 Netty 中的核心组件,负责处理网络事件,如连接、读写、...
在IT行业中,Netty是一个非常流行的高性能、异步事件驱动的网络应用框架,主要用于快速开发可维护的高性能协议服务器和客户端。在这个场景中,我们关注的是如何使用Netty来实现服务端支持SSL协议,以便实现WebSocket...
【基于Netty封装的快速分布式任务开发框架】是一种高效、轻量级的解决方案,它将Netty的强大功能与分布式任务处理的灵活性相结合。Netty是一个高性能的异步事件驱动的网络应用程序框架,常用于构建高度可扩展的网络...
《Netty实战》这本书是针对Java网络编程框架Netty的一本深入实践教程,旨在帮助读者掌握Netty的核心特性和实际应用。Netty是一款高性能、异步事件驱动的网络应用程序框架,广泛应用于各种分布式系统、微服务架构以及...
例如,使用FileRegion进行大文件传输时,可以直接将文件通道的数据发送到网络,而无需先读入到缓冲区。 3. **丰富的协议支持**:Netty 提供了对多种网络协议的支持,包括TCP、UDP、HTTP、WebSocket、FTP等,还支持...
在Netty中,EventLoop(事件循环)负责处理I/O事件,而Channel(通道)则代表网络连接,它们是进行数据传输的基础。ChannelHandler(通道处理器)是业务逻辑的载体,通过ChannelPipeline(通道管道)组织成处理链,...
这个“最新Netty中文文档CHM版”为中国的开发者提供了一个方便的中文学习资源,解决了阅读英文原版文档时的语言障碍,使学习过程更为轻松。 Netty 的核心特性包括: 1. **高性能**: Netty 使用了Java NIO(非阻塞I...
- Netty 的 ByteBuf 提供了高效的内存管理,避免了频繁的字节数组拷贝。 2. **WebSocket 协议** - WebSocket 协议通过 HTTP/HTTPS 协议握手建立连接,之后即可在连接上进行双向数据传输,无需重复的 HTTP 请求/...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个压缩包包含的是Netty 4.0.0.CR3版本的相关资源,包括源码、示例以及API文档,对于学习和理解Netty的工作...
这个压缩包“netty_learn_netty_源码.zip”显然包含了Netty框架的源代码,这对于深入理解Netty的工作原理、优化网络应用或者进行二次开发非常有帮助。下面将详细探讨Netty的一些核心概念和关键组件。 1. **NIO (非...
2. **零拷贝**:Netty支持零拷贝技术,减少了数据在内存中的复制次数,提高了系统效率。 3. **丰富的组件库**:Netty提供了大量预定义的协议解码器和编码器,简化了网络编程的复杂性。 4. **线程模型**:Netty的...
10. **最佳实践**:学习Netty的最佳实践,包括如何编写可重用的代码、如何进行测试,以及如何避免常见的陷阱和误区。 通过这个全面的教程,你不仅可以掌握Netty的基础知识,还能深入了解其高级特性和实战技巧,为你...
此外,Netty的ByteBuf类是高效内存管理的关键,它提供了缓冲区的读写操作,避免了不必要的数据拷贝。 在高级特性部分,书籍会涉及Netty的编解码器,如LineBasedFrameDecoder用于处理以换行符分隔的协议,以及...
ByteBuf相比Java的ByteBuffer,提供了更丰富的API,避免了直接操作原始缓冲区可能导致的内存溢出问题。另一个重要组件是EventLoop,它是Netty的事件循环,负责处理I/O事件并调度任务。 ChannelPipeline是Netty的...