同一客户端多次登录后,会收到重复推送的消息

问题如下:
我在chatofpomelo的基础上修改,对connector的entryHandler的enter方法,从原来同一uid不能登录,改成kick掉旧的session,再把新的session绑定上uid。如下:

var sessionService = self.app.get('sessionService');
if (!!sessionService.getByUid(uid)) {
sessionService.kick(uid, function (err, result) {
console.debug('some other is kicked' );
if (err == null) {
code = CODES.CONNECT.KickOldSessionSuccess;
} else {
console.error('kick failed : %j', err);
code = CODES.CONNECT.KickOldSessionFailed;
next(err, {
code: code,
error: true
});
return;
}
});
}

修改后,浏览器打开三个标签页(A、B、C),用两个uid(u1、u2)测试。
A用u1登录后,B再用u1登录成功,此时A触发“WebSocket is already in CLOSING or CLOSED state.”和“server heartbeat timeout”。C用u2登录后,向u1发送消息,B收到消息,A没反应。一切正常。
然后,B再用u1登录一次,查看服务器的debug,有执行kick操作,但没有触发“WebSocket is already in CLOSING or CLOSED state.”和“server heartbeat timeout”。用C向u1发送消息,此时B收到了两条相同的消息。

总结一下:这个问题就是同一个客户端,在没有断开服务器的情况下,再次登录,kick方法没有生效,客户端会被推送两次消息。

PS:
我觉得原因可能是这两个:
1、同一个uid绑定了多个session,而这多个session都是指向同一个客户端的,所以同一个客户端收到多条推送消息。
2、session只有一个,但是channel中重复add了。因为每次登录都有执行以下代码:
self.app.rpc.chat.chatRemote.add(session, uid, self.app.get('serverId'), rid, true, function (users) {
next(null, {
users: users
});
});

麻烦大神帮帮忙,谢谢!

标签: 开发求助
kezhaoyuan 在 2015-7-29 12:39发布 分享到 weibo
4 回复
#1 kezhaoyuan 2015-7-30 12:49 回复

补充一下:
我跟踪到ChatRemote里面,发现channel是正常触发了onLeave方法的。就是说之前怀疑channel中多次绑定session是错的。
然后我再跟踪到pomelo的框架代码里面,查看了channelService和channelRemote里面被调用的方法,发现也没有被调用多次。
再看回客户端,与正常情况下(标签页B踢掉标签页A的情况)相比,标签页A自己重复登录的时候,没有触发“WebSocket is already in CLOSING or CLOSED state.”。因此,我想,是不是同一标签页多次登录的时候,虽然socket断开了,旧的session被踢掉了,但是websocket没有断掉,在多次登录的情况下,建立了多个websocket,都对应新的session,因此收到多条信息。
麻烦大神帮帮忙,谢谢!

#2 {6} py8765 2015-7-31 12:36 回复

可以先查一下channel里是不是有多个uid

binboo 2015-8-4 14:36 回复

@py8765 channel中相同的uid有两个,这是什么原因造成的

kezhaoyuan 2015-8-11 16:21 回复

可以确定,uid没有重复。

kezhaoyuan 2015-8-11 16:43 回复

我甚至已经追踪到源码channelRemote.js里面的Remote.prototype.pushMessage = function(route, msg, uids, opts, cb) 方法,确认了session只有一个,方法只被调用了一次。

实在是搞不懂,为什么同一客户端用同一uid登录多次,会收到多个推送(新session绑定前会根据uid把旧的kick掉,而且我跟踪是kick成功,同一时间段uid只对应一个session)

binboo 2015-8-17 16:27 回复

@kezhaoyuan 这么久才看到
我也发现有用户出现这种情况
但是我是通过日志发现uid有重复

[2015-07-03 08:58:54.504] [DEBUG] pomelo - [/data/sevenga-chat/game-server/node_modules/pomelo/lib/common/remote/frontend/channelRemote.js] [connector-server-1] pushMessage uids: ["**1048643*10016.1.1.kingdom_1_1**","1052481*10016.1.1.kingdom_1_1","1048654*10016.1.1.kingdom_1_1","1075065*10016.1.1.kingdom_1_1","1094679*10016.1.1.kingdom_1_1","**1048643*10016.1.1.kingdom_1_1**"],  sids: [**41551**,41519,41525,41547,41549,**41551**]
kezhaoyuan 2015-8-18 10:10 回复

@binboo 我已经查过了,我的情况跟你不同,不是uid重复。服务端也确认只推送了一次,但客户端就是收到多次。我现在准备用wireshark来看看究竟是怎么回事。

tinytinysun 9-5 17:32 回复

@kezhaoyuan 最终解决了吗?我好像也遇到类似的问题了。

#3 {1} binboo 2015-8-3 19:04 回复

我也发现过该问题,同一用户接到两条重复消息,查看channel,发现该uid的确出现了两次,但我不清楚该问题是怎么生成的

tinytinysun 9-17 22:22 回复

最后解决了吗?

#4 nextzeus 9-5 17:58 回复

建议:不要只看服务器端,看下客户端是否有问题

回到顶部