socketIO – 将套接字映射到连接

这个问题的标题是不正确的措辞,但我不知道如何说话。 如果有人想编辑它,请随意。

基本上我想弄清楚如何通过数据来自的套接字来获取播放器的特定实例,这将被用于通过我的服务器传递移动到我的小2D项目。 目前我有一个对象,通过标识号码存储所有的玩家,有些人说这是一个对象,有些人说这是一个hashmap实现,有些人说这是一个数组,无论它是什么,我正在使用它。

var connectedPlayers = {}; 

当一个连接被创build时,我创build一个像这样的新玩家:

 var playerId = Math.floor(Math.random()*(50000-1+1)+1); var userId = Math.floor(Math.random()*(50000-1+1)+1); var player = new Player(playerId, "Guest"+userId, socket); connectedPlayers[playerId] = player; 

显然,这只是为了生成随机的名称/标识号码,但是这很好,这是在socket.on('connection', function()调用上执行的。

如果您需要查看Player.js脚本,它只是一个基本的原型脚本,它向所有玩家发送有关玩家login信息,这一切都正常工作。

 var playerId; var playerName; var socket; var positionX, positionY; function Player(playerId, playerName, socket) { this.playerId = playerId; this.playerName = playerName; this.socket = socket; this.positionX = 250; this.positionY = 250; socket.emit('login', { playerID: playerId, playerX: this.positionX, playerY: this.positionY, playerName: playerName}); socket.broadcast.emit('player-connected',{ playerID: playerId, playerX: this.positionX, playerY: this.positionY, playerName: playerName} ) } Player.prototype.getId = function() { return this.playerId; }; Player.prototype.getName = function() { return this.playerName; }; Player.prototype.getSocket = function() { return this.socket; }; Player.prototype.getX = function() { return this.positionX; }; Player.prototype.getY = function() { return this.positionY; }; 

我的问题是,当数据进入时,我需要能够找出哪个播放器属于一个套接字,因为我要权威地将动作发送到客户端。 要做到这一点,当涉及到包含哪个playerId时,我不需要给予客户任何控制,因为如果我让客户告诉服务器,我们可以让其他玩家随机移动。

我想过的唯一方法就是这样,但是效率不高。

 for(var i in connectedPlayers) { if(conntectedPlayers[i].getSocket() == socket) { // do stuff } } 

编辑:由于来自评论的请求,添加整个sockets.on('连接')。

 socketIO.sockets.on('connection', function(socket) { console.log("Connection maid."); socket.on('login', function(json) { sqlConnection.query('select * FROM Accounts', function(err, rows, fields) { if(err) throw err; for(var row in rows) { if(rows[row].Username == json.username) { var playerId = Math.floor(Math.random()*(50000-1+1)+1); var player = new Player(playerId, "Guest"+playerId, socket); connectedPlayers[playerId] = player; } } }); }); socket.on('move-request', function(json) { socket.emit('move-request', {x: json.x, y: json.y, valid: true}); }); }); 

您可以在连接时将一个或多个属性添加到套接字对象:

 socketIO.sockets.on('connection', function(socket) { console.log("Connection maid."); socket.on('login', function(json) { sqlConnection.query('select * FROM Accounts', function(err, rows, fields) { if(err) throw err; for(var row in rows) { if(rows[row].Username == json.username) { var playerId = Math.floor(Math.random()*(50000-1+1)+1); var player = new Player(playerId, "Guest"+playerId, socket); connectedPlayers[playerId] = player; // add custom properties to the socket object socket.player = player; socket.playerId = playerId; } } }); }); socket.on('move-request', function(json) { // you can access socket.playerId and socket.player here socket.emit('move-request', {x: json.x, y: json.y, valid: true}); }); }); 

所以,现在只要有一个套接字接收到消息,就可以访问playerIdplayer 。 在你的代码中,当一个消息到达时,这个消息的socketvariables在你的父范围内并且可以被访问,这样你就可以得到这个playerplayerId

在C哈希中存储“对象”时,我遇到过几次这种情况。 我使用了一个专门用于指针的32位散列函数。

我不知道你可以用什么来唯一标识套接字实例,并build议你看看有什么底层字段存在的目的。 如果你确实发现了一些能够唯一标识套接字的东西,那么你可以将它提供给一个散列algorithm来生成一个关键字。 当然,你会需要一个哈希实现(最有可能在JavaSCript的外观)。 我发现这个: http : //www.timdown.co.uk/jshashtable/ 。

祝你好运!