gpt4 book ai didi

javascript - 套接字IO : RangeError: Maximum call stack size exceeded

转载 作者:太空宇宙 更新时间:2023-11-04 00:33:58 24 4
gpt4 key购买 nike

每次客户端连接到我的 Nodejs 服务器时,我的服务器都会崩溃并出现错误“RangeError:超出最大调用堆栈大小”。我相信我一定在某个地方遇到了递归问题,但它却回避了我。

我的服务器:

require('monitor').start();
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});

var allClients = [];

io.on('connection', function(socket){
console.log('user joined: ' + socket.request.connection.remoteAddress + ':' + socket.request.connection.remotePort);
socket.address = socket.request.connection.remoteAddress;
socket.port = socket.request.connection.remotePort;
socket.name = '';
socket.xPos = 0;
socket.yPos = 0;
//io.emit('new user', socket.address + '_' + socket.port);

// Send current client list to new connection
socket.emit('client list', allClients);

// Only send 'new user' event to previously connected clients, not the new client.
var i = 0;
for(i=0;i<allClients.length;i++){
allClients[i].emit('new user', socket.address + '_' + socket.port);
}

// Push new socket into the client array after the array has been sent to all other users
allClients.push(socket);

socket.on('chat message', function(msg){
io.emit('chat message', socket.address + ':' + socket.port + ": " + socket.name + ' says: ' + msg);
console.log(socket.address + ":" + socket.port + ": " + socket.name + ' says: ' + msg);
});

socket.on('set_name', function(msg){
//io.emit('chat message', socket.address + ':' + socket.port + ': ' + msg);
socket.name = msg;
console.log(socket.address + ":" + socket.port + ' set name to: ' + msg);
});

socket.on('xPosUpdate', function(msg){
//io.emit('chat message', socket.address + ':' + socket.port + ': ' + msg);
console.log(socket.address + ":" + socket.port + ' set xPos to: ' + msg);
});

socket.on('yPosUpdate', function(msg){
//io.emit('chat message', socket.address + ':' + socket.port + ': ' + msg);
console.log(socket.address + ":" + socket.port + ' set yPos to: ' + msg);
});

socket.on('disconnect', function() {
io.emit('user disconnect', socket.address + '_' + socket.port);
io.emit('chat message', socket.address + ':' + socket.port + ": " + socket.name + ' disconnected.');
console.log('Got disconnect!');
socket = null;
var i = allClients.indexOf(socket);
allClients.splice(i, 1);
});
});

http.listen(3000, function(){
console.log('listening on *:3000');
});

然后在客户端处理套接字:

var users = [];
$('#chatInput').submit(function(){
socket.emit('chat message', $('#m').val());
$('#m').val('');
return false;
});
$('#nameInput').submit(function(){
socket.emit('set_name', $('#n').val());
$('#n').val('');
return false;
});
socket.on('client list', function(msg){
$('#messages').append($('<li>').text('Processing client list...'));
var i = 0;
for(i=0;i<msg.length;i++){
$('#messages').append($('<li>').text('Client ' + i + ': ' + msg[i].address + ':' + msg[i].port + ', Name: ' + msg[i].name));
}
});
socket.on('chat message', function(msg){
$('#messages').append($('<li>').text(msg));
});
socket.on('user disconnect', function(msg){
users[msg].unset();
});
socket.on('new user', function(msg){
users[msg] = [];
users[msg].xPos = 0;
users[msg].yPos = 0;
$('#messages').append($('<li>').text(msg));
});

最佳答案

感谢您的回复。

经过一些实验,我意识到由于我尝试在服务器上的以下行中发出的数据量而触发了溢出错误:

socket.emit('client list', allClients);

当新用户连接时,我会将整个连接对象推送到“allClients”数组中。连接对象中包含的数据量太大,无法通过 socket.emit 发送,并导致 RangeError。

我必须简化发送给每个新客户端的客户端列表数据,以避免这种情况......“堆栈溢出”......:)

关于javascript - 套接字IO : RangeError: Maximum call stack size exceeded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39917706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com