netty4.x 数据发送问题

发布于 2021-12-05 13:28:01 字数 4683 浏览 844 评论 8

大家好:

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

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

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

服务端任然在正常发送数据,并且当我把客户端断开连接后,服务器并无响应,并且发送数据不报任何错误,服务器任然能正常发送错误,但实际上客户端已经断开连接了。而且发送数据的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.<init>(String.java:443)
at java.lang.String.<init>(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 这种情况该如何处理呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

乞讨 2021-12-08 15:28:36

引用来自“坤艮”的评论

楼主,请问你用的tcp工具叫什么?

策马西风 2021-12-08 15:28:25

楼主,请问你用的tcp工具叫什么?

无声静候 2021-12-08 15:28:03

楼主,请问你用的tcp工具叫什么?看起来很好用的样子!

妖妓 2021-12-08 15:28:00

楼主,请问我用netty写的服务端但是,用tcp工具发送消息服务端无法收取,但是用netty写的客户端发送数据就可以收到,这是为什么?

小情绪 2021-12-08 15:27:45

引用来自“loyal”的评论

居然都是猫的头像哈 ~~~全都是~

丢了幸福的猪 2021-12-08 15:23:15

居然都是猫的头像哈 ~~~全都是~

初见你 2021-12-08 14:58:28

引用来自“Grrrr”的评论

代码没有问题,但是这种写法值得怀疑,你在server端的handler里面while(true)

那么这个handler的channelRead方法永远不会返回,那么也就是说在整个pipe line中,都会卡在这个handler里面,传递不到下一个handler。

最后导致的结果就是整个pipeline永远不会执行完成。

坐在坟头思考人生 2021-12-08 08:32:46

代码没有问题,但是这种写法值得怀疑,你在server端的handler里面while(true)

那么这个handler的channelRead方法永远不会返回,那么也就是说在整个pipe line中,都会卡在这个handler里面,传递不到下一个handler。

最后导致的结果就是整个pipeline永远不会执行完成。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文