netty java 发送数据_netty4.x 数据发送问题

在使用Netty进行TCP通信时,遇到服务端不断向客户端发送数据,但客户端无法接收到,且服务器在客户端断开连接后未察觉,导致发送队列堆积引发内存溢出的问题。服务端代码在无限循环中发送数据,但未正确处理通道活性检查和异常监听。如何解决Netty服务端的数据发送异常和内存管理问题?
摘要由CSDN通过智能技术生成

大家好:

最近研究netty中遇到一个奇怪的问题,

客户端采用tcp工具模拟,服务端是netty编写,在handler中循环向客户端发送数据,一段时间后:

客户端讲收不到任何数据:

cd6f04c2b70d5b82871e9a794c89864b.png

服务端任然在正常发送数据,并且当我把客户端断开连接后,服务器并无响应,并且发送数据不报任何错误,服务器任然能正常发送错误,但实际上客户端已经断开连接了。而且发送数据的furture监听方法也不在执行!

服务端代码如下:

while(true){

String srcData = new String(bytes, "UTF-8");

if(!ctx.channel().isActive() )return ;

sendData(srcData);

}

/**

* 发送GPS数据至客户端

* @throws ClosedChannelException

*/

private void sendData(String srcData) {

//System.out.println(ctx.channel().isActive());

ChannelFuture future = ctx.channel().writeAndFlush(srcData);

boolean is = future.isSuccess();

//System.out.println(future.isSuccess());

/**

* 监听发送状态..

*/

//future.awaitUninterruptibly(5 * 1000);

future.addListener(new ChannelFutureListener() {

public void operationComplete(ChannelFuture future) {

if (future.isSuccess()) {

logger.debug(future.channel() + ",成功发送GPS数据.");

} else {

Channel channel = future.channel();

Throwable cause = future.cause();

logger.error("当前channel[{"+channel+"}]发送GPS数据包失败.",cause);

ctx.channel().close();

}

};

});

}

并且发送数据全部累积在netty的发送队列中,导致内存溢出:

2015-05-17 20:57:55.434 INFO  (MessageExecutor.java:80)-5s转发客户端[/192.168.220.1:59294] 137 条,累计发送 594595 条

2015-05-17 20:58:36.360 WARN  (SingleThreadEventExecutor.java:114)-Unexpected exception from an event executor:

java.lang.OutOfMemoryError: Java heap space

2015-05-17 20:58:36.360 ERROR (SenderHandler.java:67)-系统异常信息!

java.lang.OutOfMemoryError: Java heap space

at java.nio.ByteBuffer.wrap(ByteBuffer.java:350)

at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:137)

at java.lang.StringCoding.decode(StringCoding.java:173)

at java.lang.String.(String.java:443)

at java.lang.String.(String.java:515)

at com.palmgo.datasource.kafka.MessageExecutor.consumer(MessageExecutor.java:159)

at com.palmgo.datasource.handler.SenderHandler.channelActive(SenderHandler.java:32)

at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:183)

at io.netty.channel.AbstractChannelHandlerContext.fireChannelActive(AbstractChannelHandlerContext.java:169)

at io.netty.channel.ChannelInboundHandlerAdapter.channelActive(ChannelInboundHandlerAdapter.java:64)

at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:183)

at io.netty.channel.AbstractChannelHandlerContext.fireChannelActive(AbstractChannelHandlerContext.java:169)

at io.netty.channel.ChannelInboundHandlerAdapter.channelActive(ChannelInboundHandlerAdapter.java:64)

at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:183)

at io.netty.channel.AbstractChannelHandlerContext.fireChannelActive(AbstractChannelHandlerContext.java:169)

at io.netty.channel.ChannelInboundHandlerAdapter.channelActive(ChannelInboundHandlerAdapter.java:64)

at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:183)

at io.netty.channel.AbstractChannelHandlerContext.fireChannelActive(AbstractChannelHandlerContext.java:169)

at io.netty.channel.DefaultChannelPipeline.fireChannelActive(DefaultChannelPipeline.java:817)

at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:454)

at io.netty.channel.AbstractChannel$AbstractUnsafe.access$100(AbstractChannel.java:378)

at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:424)

at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:357)

at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357)

at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111)

at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)

at java.lang.Thread.run(Thread.java:662)

2015-05-17 20:58:39.728 WARN  (DefaultChannelPipeline.java:1035)-An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.

java.lang.OutOfMemoryError: Java heap space

请问netty 这种情况该如何处理呢?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值