当用户连接到我的套接字时 我添加到 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/