您好,匿名用户
随意问技术百科期待您的加入

netty4,异常断线的问题

+1 投票

我写了个消息转发程序,也加了心跳处理,1分钟没读写操作的用户自动被踢下线。可是现在遇到一个问题,如A用户要发送消息给B用户,通过服务器中转,服务器在接收到A的消息时,B用户实际已经断网了(我把B用户的网线拔掉了),这时服务器既然是不知道的。

ChannelFuture writeFuture = channel.write(msg);
			
final Channel sendChannel = ctx.channel();
			
writeFuture.addListener(new ChannelFutureListener() {
				
   @Override
   public void operationComplete(ChannelFuture future) throws Exception {
				
	if (future.isSuccess()){
	     sendChannel.write(JSONResult.getSuccess());
	     System.err.println("future.isSuccess()");
	}
	if (future.isDone()){
	     sendChannel.write(JSONResult.getSuccess());
	     System.err.println("future.isDone()");
	}
	if (future.isCancelled()){
	     sendChannel.write(JSONResult.getSuccess());
	     System.err.println("future.isCancelled()");
	}
					
    }
 });

operationComplete都会返回成功..只有到了1分钟的时候,服务器才回把B用户踢下线.我要怎么才能在服务端判断B用户实际已经掉线了?

用户头像 提问 2013年 1月14日 @ Tashigi 列兵 (90 威望)
分享到:

1个回答

+1 投票
 
最佳答案

你这种情况属于正常的,没有问题。 
客户端异常掉线,比如断开网线或者断电等情况下,客户端的channel对象不会自动关闭,所以才引入了心跳的机制,也就是服务器端通过监测在心跳期间内(1分钟)是否收到了客户端发过来的消息,来判断是否可以和客户端进行通信,如果没有收到任何消息,则视为客户端掉线。心跳机制就是为了解决你说的这个问题的。 

不光是netty,所有基于socket的通信都有这个问题,因为客户端和服务端是基于消息的协议,只有客户端主动发出断开的消息给服务端,服务端才能明确知道客户端断开了连接,直接拔掉网线或者断电的情况下,属于底层的异常,客户端程序是根本监测不到的,即使你的客户端程序能够监测到,也没有用,因为此时网线已经被拔掉了,根本没法给服务端发送消息。所以服务端才引入了心跳机制来对应这种异常情况,相当于超时机制,超过规定时间没有接到消息,就视为客户端掉线了,以释放服务端的资源。 

相当于两个人通话,对方突然把手机电池拔掉了,一点声音也没有,持续了1分钟,你这边肯定是不知道他那边出了什么状况,最后你肯定就挂机了,不可能傻等着,呵呵。 

用户头像 回复 2013年 1月14日 @ Cancer 上等兵 (211 威望)
选中 2013年 1月14日 @Tashigi
提一个问题:

相关问题

+1 投票
2 回复 272 阅读
用户头像 提问 2012年 12月1日 @ Annie 上等兵 (299 威望)
0 投票
0 回复 34 阅读
0 投票
1 回复 51 阅读
用户头像 提问 2013年 9月18日 @ Viktor 上等兵 (290 威望)
0 投票
1 回复 28 阅读
用户头像 提问 2014年 1月29日 @ Vi 上等兵 (121 威望)
0 投票
1 回复 45 阅读
用户头像 提问 2012年 12月1日 @ Fiddlesticks 上等兵 (242 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...