pomelo 多 connector 剔除 session
发布于 6 年前 作者 linkenliu 3707 次浏览 来自 问答
比如有多个connector(connector-1,connector-2)。
1.场景是这样的,用户用多个设备登陆同一个账号的时候 ,剔除掉之前登陆设置的session。
2.我现在的做法是这样的,登陆之前先检查 session 是否存在;做法是遍历所有的connector ,根据玩家ID 找出存在的session ,然后剔除掉
3.但现在出现的问题时,当玩家A用a设备登陆(connector-1),然后玩家A用b设备登陆(connector-1),这个时候剔除的时候,会将2个设备的session都剔除掉。ps:如果玩家A用b设备登陆到connector-2  就没有问题,是的,这里很清晰了,因为session在登陆之前就已经挂载到pomelo里面了。但现在知道问题却不知道如何解决。
  • 代码
	//获取session
	 private getSessionByUid(uid, next) {
        var connectors = this.app.getServersByType('connector');
        var backendSessionService = this.app.get('localSessionService');
        for (let i = 0; i < connectors.length; i++) {
            backendSessionService.getByUid(connectors[i].id, uid, function (err, sessions) {
                if (sessions) {
                    let session = sessions[0];
                    if (session && uid == session.uid) {
                        next(session);
                        return;
                    } else {
                        if (i == connectors.length - 1) {
                            next(null);
                            return;
                        }
                    }
                } else {
                    if (i == connectors.length - 1) {
                        next(null);
                        return;
                    }
                }
            })
        }
    }
	
	
	//剔除session
	private async checkSession(playerId) {
        return new Promise(async (resolve, reject) => {
        	this.getSessionByUid(playerId, async (session) => {
                if (session) {
                    let serverId = session.frontendId;
                    console.log("##=======" + serverId)
                    let opts = {
                        playerId: playerId,
                        msg: '你的账号正在另一个设备上登录,你被迫下线。'
                    };
                    this.channelService.pushMessageByUid(config.channelRoute.onKick, serverId, playerId, config.redisRoom.ChessWord, opts);
                    setTimeout( () => {
                        session.__sessionService__.kickByUid(serverId, playerId);
                        resolve('ok');
                    },200)
                } else {
                    resolve('ok');
                }
            })
        })
    }
1 回复

问题很明显,你用kickByUid当然就是把某个connector上的用户ID相同的都给踢掉。 看看kickBySid 这个方法,sid在单个connector上是唯一的,你需要把sid传到bankend server并保存好。

回到顶部