【问题标题】:socketIO - Mapping a socket to a connectionsocketIO - 将套接字映射到连接
【发布时间】:2014-12-15 13:50:41
【问题描述】:

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

基本上,我试图弄清楚如何通过数据来自的套接字获取玩家的特定实例,这将用于通过我的服务器为我的小型 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;
};

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

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

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

编辑:根据 cmets 的请求添加整个 sockets.on('connection')。

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

});

【问题讨论】:

  • socket连接时的代码在哪里?通常,您只需在可以访问其他数据的闭包中执行此操作,并将接收数据的其他函数也放入其中。或者,您也可以将任何您想要的属性添加到socket 对象,以便为您识别它。不需要单独的哈希。
  • @jfriend00 - 我把它加到了底部。
  • 那么,您的问题是想知道消息到达服务器还是客户端时是哪个播放器?
  • @jfriend00 - 我想知道消息到达服务器时是哪个玩家,而不需要从客户端发送任何信息。我想找到与套接字关联的播放器。

标签: javascript node.js sockets socket.io


【解决方案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

【讨论】:

    【解决方案2】:

    在将“对象”存储在 C 哈希中时,我曾多次遇到这种情况。我使用专门针对指针的 32 位哈希函数。

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 2013-11-14
      • 1970-01-01
      相关资源
      最近更新 更多