NutzCN Logo
问答 websocket断线重连问题
发布于 2590天前 作者 小小小郑 2875 次浏览 复制 上一个帖子 下一个帖子
标签:

当用户断开链接并重新链接时会先执行三次onclose函数再重新join(room),我重写了onclose方法,计算当前在线人数,但是断线之后就会执行三次onclose,导致没有计算,请问大神是什么原因

@Override
    public void onClose(Session session, CloseReason closeReason) { 
		//人数-1
        subOnlineCount();  
        System.out.println("有一链接关闭!当前在线人数为" + getOnlineCount()); 
        //调用父类的onclose
  		super.onClose(session, closeReason);
    } 
openId_4加入房间roomId_1!当前在线总人数为2
2017-11-19 16:59:59,869 org.nutz.plugins.mvc.websocket.handler.AbstractWsHandler.join(AbstractWsHandler.java:50) DEBUG - session(id=4lpo6q02p2j9qoqqjtebatgird) join room(name=wsroom:roomId_1)
2017-11-19 16:59:59,870 org.nutz.dao.impl.sql.run.NutDaoExecutor.printSQL(NutDaoExecutor.java:388) DEBUG - SELECT * FROM game_user  where open_id ='openId_4' LIMIT 0, 1 
有一链接关闭!当前在线人数为1
2017-11-19 17:00:21,854 org.nutz.plugins.mvc.websocket.handler.AbstractWsHandler.left(AbstractWsHandler.java:59) DEBUG - session(id=4lpo6q02p2j9qoqqjtebatgird) left room(name=wsroom:roomId_1)
有一链接关闭!当前在线人数为0
有一链接关闭!当前在线人数为-1
10 回复

AbstractWsEndpoint的onError也是调用onClose,覆盖一下

这样覆盖吗 我已经覆盖了

@Override
	public void onError(Session session, java.lang.Throwable throwable) {
		//调用父类的onError
		
	    super.onError(session, throwable);
		//人数-1
        subOnlineCount();  
        System.out.println("有一链接关闭!当前在线人数为" + getOnlineCount());  
	}
	

不要调用super.onError了

断线的时候onERRor和onclose都会执行一次吗

onclose或者是onerror的触发情况是有分类的吗,还是只要是断开链接两个都执行

取决于是怎么断的, 如果客户端主动调用close的话, 是只触发onClose

关浏览器的话,首先是onError,然后onClose

何必自己统计呢, getRoomProvider().wsid(room).size() 就是在线人数啦

好的 没有仔细看文档,谢谢指出,我试一下

不过我是要算全部服务器在线人数的,有很多个房间我还得把房间遍历一遍

添加回复
请先登陆
回到顶部