服务端如何主动断开与客户端的连接?

大神大神,我这边遇到一个问题,我的处理逻辑是这样子滴: 用户发送一个 login 请求过来,我会将其 session 绑定一个到当前用户对应的 uid ,但如果当前用户再发一个 login 过来, 我会判断当前 用户是否已经有session了,如果有,那么我要主动断开之前 的用户的连接。代码大概如下:

const sessionService = _self.app.get('sessionService');
const oldSession = sessionService.getByUid(user.userId);
// 重复登录处理
if (oldSession) {
  sessionService.kickBySessionId(oldSession.id, '当前用户已在其他地方登录', function() {

    console.log('------- callback ', arguments);
    // 赋值用户信息
    session.bind(user.userId);
    session.set('rid', user.roomId || 0);
    sendRpc();
  });
} else {
  // 赋值用户信息
  session.bind(user.userId);
  session.set('rid', user.roomId || 0);
  sendRpc();
}

可是目前的问题在于, 我 调用 kickBySessionId 成功了,也确实有走进回调, 但是问题在于:
- 原来的连接根本没有断掉
- 给客户端发送的消息都是重复发送了

求大神支招。

标签: pomelo 开发求助
zernmal 在 2-15 22:56发布
zernmal 在 2-15 22:57重新编辑 分享到 weibo
2 回复
#1 {2} xymeng 2-15 23:44 回复

pomelo stop

zernmal 2-16 11:10 回复

额,我不希望中止服务的喔,我只希望断开旧连接。

xymeng 2-23 23:30 回复

@zernmal 我开个玩笑~

#2 {8} fantasyni 2-16 12:57 回复

sessionService.kickBySessionId 掉了这个就是客户端断开连接了

zernmal 2-16 13:52 回复

那我现在调用了后,不但没断,反而还重复给所有当前这个 uid 的用户发了消息,可能是什么原因呢?

fantasyni 2-16 13:54 回复

@zernmal 客户端监听kick事件,收到后调用 disconnect

zernmal 2-16 13:56 回复

@fantasyni 还需要客户端配置的呀? 服务端不能主动断掉,无须客户端监听的那种?

zernmal 2-16 13:59 回复

@fantasyni 我这边场景是这样的: 我这边连接客户端,都是在 connector.entry 这一个入口, 用户每次请求都会带 token 过来,如果 我发现这个用户在当前机器上还没登录的我就会将当前 session bind 一下 uid, 如果这台机器上已经有 bind 过了,为了避免多个客户端重复连接,我需要将旧的连接断掉, 所以我需要的是直接断掉,不需要经过客户端的那种。

zernmal 2-16 14:17 回复

@fantasyni 另外,刚才看了一下,前端没有收到任何 kick 事件,我代码是这样写的

pomelo.on('kickBySessionId', function() {
    console.log('kickBySessionId', arguments);
  });

  pomelo.on('kick', function() {
    console.log('kick', arguments);
  });
fantasyni 2-16 17:20 回复

@zernmal pomelo.on('onKick')

zernmal 2-16 18:08 回复

@fantasyni onKick 也没有收到 。。。

zernmal 3-6 01:04 回复

@fantasyni 最终收到了,原因是我那个 oldSession 获取出来的是一个数组。。。

没看清楚,不好意思哈。。。

回到顶部