socketIO - 将套接字映射到连接

时间:2014-12-15 02:59:10

标签: javascript node.js sockets socket.io

这个问题的标题确实错误,但我不知道如何说出来。如果有人想编辑它,请随意。

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

var connectedPlayers = {};

创建连接后,我创建一个新的播放器,如下所示:

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脚本,它只是一个基本的原型脚本,它向所有玩家发送有关登录玩家的信息,这一切都正常。

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
     }
}

编辑:由于评论请求而添加整个套接字。('连接')。

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

});

2 个答案:

答案 0 :(得分:1)

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

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。在您的代码中,当邮件到达时,此邮件的socket变量位于您的父范围内且可访问,以便您可以获取playerplayerId

答案 1 :(得分:0)

我在存储"对象"时遇到过这种情况几次。在C哈希。我使用32位散列函数专门指针。

我不确定您可以使用什么来唯一标识套接字实例,并建议您查看为此目的存在的基础字段。如果您确实找到了唯一标识套接字的内容,则可以将其提供给哈希算法以生成密钥。当然,你需要一个哈希实现(最常见的是JavaSCript的外观)。我发现了这个:http://www.timdown.co.uk/jshashtable/

祝你好运!