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

标签 javascript node.js socket.io

当用户连接到我的套接字时 我添加到 session 映射:

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

我的 session map

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));

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

这是我的 Angular 色,它选择两个玩家并创建一场战斗:

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 秒执行一次此功能

但我的难点在于如何将这场战斗的数据发送到相应的套接字上

我与玩家的关系套接字

当玩家进入我的事件时,我通过 socket id 创建一个玩家 我还制作了这个套接字的 session 映射 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;

最佳答案

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 的一个正在进行的解决方案,应要求发布。

关于javascript - socket.io 将数据发送到匹配的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59116882/

相关文章:

c++ - 使用 socket.io 将应用程序连接到 Node 服务器

javascript - 在 socket.io 中为特定房间设置变量

javascript - 如何在通过 HTTP 下载期间指定文件名

javascript - 如何将选中的复选框值存入数据库?

javascript - 如何使用 HTML5 在标题中添加文本

javascript - Passport 不将子文档保存到 req.user

javascript - 不用 CSS 定位 DOM 元素

javascript - 无法从子进程获取输出

JavaScript:如何将数据添加到 JSON 文件内的数组

python - 由于 session ,使用 gevent-socketio 的多个工作人员因 xhr-polling 传输而失败