我正在制作一个简单的HTML5游戏,在套接字连接时,服务器发送一个初始化信息包,为每个客户端生成对象,特别是瓦片,播放器和misc对象列表。
当我调用 socket.emit(“init”,initPacket())时,发送的数据包将在客户端(在客户端上定义)实例化新的JS对象。
如果我的服务器只有1000个磁贴,那么现在对象被实例化了。但是,当我转到1001或1002个磁贴,或者更多时,服务器将生成initPacket,尝试通过上面的方法发出它,并以某种方式创建一个新的SOCKET ,并尝试在那上面调用 socket.emit(“init”,initPacket())。同样奇怪的是前一个套接字没有断开连接(因为我在用户断开连接时记录)。
以下是客户端连接和断开连接时应该发生的情况的屏幕截图VERSUS如果我的磁贴太多会发生什么:http://imgur.com/a/gJgot
具体导致无限循环?我假设降级initPacket所以它发送更少的数据会使它更好,但我需要先找到根本原因。
供参考,使用Node.js和socket.io作为websocket。每当我打开一个新的localhost到正确的端口号时,我都会打开一个新的客户端。
对于initPacket():
var initPacket = function () {
var ret = {};
var playerPacket = [];
var tilePacket = [];
for (var i in PLAYER_LIST) {
var currPlayer = PLAYER_LIST[i];
playerPacket.push({
id: currPlayer.id,
name: currPlayer.name,
x: currPlayer.x,
y: currPlayer.y
})
}
for (var j = 0; j < TILE_ARRAY.length; j++) {
for (k = 0; k < TILE_ARRAY[j].length; k++) {
var currTile = TILE_ARRAY[j][k];
tilePacket.push({
id: currTile.id,
x: currTile.x,
y: currTile.y,
length: currTile.length,
color: currTile.color
});
count ++;
}
}
ret['tilePacket'] = tilePacket;
ret['playerPacket'] = playerPacket;
return ret;
};
基本上,套接字发出一个字典,其中包含'tilePacket'键和每个图块的图块信息列表值。
TILE_ARRAY是一个2层的Tile对象数组,我在这里定义:
const entityConfig = require('./entityConfig');
function Tile(x, y) {
var randomId = Math.random();
this.id = randomId;
this.x = x;
this.y = y;
this.owner = null;
this.color = "#FFFFFF";
this.health = 0;
this.length = entityConfig.WIDTH / Math.sqrt(entityConfig.TILES);
}
module.exports = Tile;
编辑:澄清一下,如果我删除上面的 ret ['tilePacket'] = tilePacket; 行,服务器就不再循环套接字了。我已经记录了TILE_ARRAY for循环中的项目数,它给了我1024个项目,这是32 x 32,这是正确的。这里的播放器包在错误方面无关紧要。