socket.io将数据发送到匹配的套接字

时间:2019-11-30 14:01:21

标签: javascript node.js socket.io

当用户连接到我的插座时 我添加到会话映射:

io.on('connection', function (socket) {
      sessionMap.set(socket.id,socket);
}

我的会话地图

var SessionMap = {};
module.exports = {
    set: function(key,value){
        SessionMap[key] = value;
    },
    get: function(key){
        return SessionMap[key]
    },
    delete: function(key){
        delete SessionMap[key]
    },
    all: function(){
        return SessionMap
    }
}

还将我的用户套接字ID保存在类播放器中

  socket.on('addPlayer-Queue', (result) => {
      sessionMap.set(socket.id,socket);
      queue.addPlayer(new Player({
        id: result.id,
        name: result.name,
        mmr: result.mmr
      }, socket.id));

我有一个功能,可以选择两个相连的玩家(我保存在一个阵列中)并创建一个“战斗”,然后我想发送到为此战斗选择/匹配的套接字 战斗骰子

这是我选择两个玩家并进行战斗的角色:

searching() {
    const firstPlayer = this.getRandomPlayer();

    const secondPlayer = this.players.find(
      playerTwo =>
        playerTwo.mmr < this.calculateLessThanPercentage(firstPlayer) &&
        playerTwo.mmr > this.calculateGreaterThanPercentage(firstPlayer) &&
        playerTwo.id != firstPlayer.id
    );

    if (!secondPlayer) {
      return null;
    }

    const matchedPlayers = [firstPlayer, secondPlayer];
    this.removePlayers(matchedPlayers);
    return new Match(matchedPlayers);
  }
}

而且在连接时,我使用设定的间隔每1秒执行一次此功能

但是我的困难是如何将这场战斗中的数据发送到相应的套接字上

我与播放器的关系套接字

当玩家进入我的活动时,我会通过查看套接字ID来创建玩家 我也为此套接字创建了一个会话映射 sessionMap.set(socket.id,socket);

我的班级球员:

class Player {
    constructor(player,socketId) {
      this.id = player.id
      this.socketId = socketId
      this.name = player.name
      this.mmr = player.mmr
    }

  }

  module.exports = Player;

2 个答案:

答案 0 :(得分:1)

const getMatchConfigurationFor = player => {
    /* configure and return the payload notifying the player of the match */
}

const configurePlayersForNewMatch = () =>  matchedPlayers.forEach(player => 
    sessionMap.get(player.socketid)
        .broadcast.to(player.socketid)
        .emit(messageTags.MATCH_CONFIGURATION, 
            getMatchConfigurationFor(player)))
关于在何处进行这项工作<。> single responsibility principle说,一个功能应该有一个明确的目的。因此, search 方法应搜索匹配的球员,而不是配置比赛。您应该在配置匹配项时调用另一个函数来完成这项工作,该函数本身将在搜索成功返回之后被调用。我在这里提供了包装函数:它的编写方式希望相关的部分都在范围之内。如果愿意,可以使用参数将其重写为适当的函数。

这是Felipe的正在进行中的解决方案,应要求发布。

答案 1 :(得分:0)

找到比赛之后,您可能想向两个客户端发出MatchFound对象,详细说明有关比赛的信息(包括有关对手的信息)。客户获得此权限后,您可以启动客户匹配所需的任何操作(加载关卡,显示名称或大厅)。