4
回答
netty 长连接的问题

android 客户端里面实现一个推送功能,客户端采用netty 客户端连接服务端(也是netty),

每当客户端和服务端连接上后,建立一个信道,如果信道断开,再次发起请求建立新的信道

但是,通过日志来分析看,好像我的程序建立了多个信道在同时发起心跳,请问这是怎么回事?

客户端部分代码

如果客户端和服务端断开,就往下走过这段代码

    ChannelFuture future =b.connect(host, port).sync();
    future.channel().closeFuture().sync();

然后在finally中,过10秒后,再次发起重新连接服务端请求
conntent();//再次连接

图1,打印信道,见标红的地方

打印日志,从日志上看,貌似建立了多个信道,

感觉客户端多次成功连接服务端

   ChannelFuture future =b.connect(host, port).sync();
    future.channel().closeFuture().sync();

如果这样说,上面的代码根本就没有关闭和服务端的连接呀


举报
共有4个答案 最后回答: 2年前

很明显

错误就出在“如果信道断开,再次发起请求建立新的信道”, 你的信道没有真正的断开, 你却建立了新的信道

另外,Netty服务端的的心跳检测是用IdlestateHandler做的, 没听说这东西要自己写逻辑

引用来自“兮风古道”的评论

很明显

错误就出在“如果信道断开,再次发起请求建立新的信道”, 你的信道没有真正的断开, 你却建立了新的信道

哪我怎么判断信道有没有断开

引用来自“兮风古道”的评论

很明显

错误就出在“如果信道断开,再次发起请求建立新的信道”, 你的信道没有真正的断开, 你却建立了新的信道

引用来自“天王盖地虎626”的评论

哪我怎么判断信道有没有断开

大概的代码是这样的

public class TimeoutHandler extends ChannelDuplexHandler {
	@Override
	public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
		if (evt instanceof IdleStateEvent) {
			IdleState state = ((IdleStateEvent) evt).state();

			if (state == IdleState.ALL_IDLE) {
				ctx.close();
			}
		} else {
			super.userEventTriggered(ctx, evt);
		}

	}
}

再把这个handler添加到你的pipeline中去

顶部