我有一个socket.io服务器和一个正确运行的客户端。每次服务器关闭时,客户端都会尝试每5秒再次连接一次。当服务器再次启动时,它们可以毫无问题地连接。
但是当我在服务器再次运行之前等待很长时间,当服务器启动时,问题就出现了,它崩溃了:
info - socket.io started
debug - client authorized
info - handshake authorized DqN4t2YVP7NiqQi8zer9
debug - setting request GET /socket.io/1/websocket/DqN4t2YVP7NiqQi8zer9
debug - set heartbeat interval for client DqN4t2YVP7NiqQi8zer9
debug - client authorized for
debug - websocket writing 1::
buffer.js:287
pool = new SlowBuffer(Buffer.poolSize);
^
RangeError: Maximum call stack size exceeded
客户端重新连接(未连接时每5秒执行一次):
function socket_connect() {
if (!socket) {
socket = io.connect('http://192.168.1.25:8088', { 'reconnect':false, 'connect timeout': 5000 });
} else {
socket.socket.connect();
}
socket.on("connect", function () {
clearInterval(connect_interval);
connect_interval = 0;
socket.emit('player', { refresh_data:true });
});
}
在服务器端,只有套接字实例,它崩溃了:
var io = require('socket.io').listen(8088);
我认为问题是:
当服务器启动时,它会重新接收客户端每5秒钟发出的所有连接,(15小时断开连接* 60米* 60秒/ 5秒重新连接)并且崩溃。
如何关闭服务器尝试的连接?
PS:如果我重新加载客户端,并在服务器启动后,它可以正常工作
答案 0 :(得分:1)
socket.io.js的主要思想是重用现有连接。 您应该只连接一次,然后使用socket.emit()
交换消息我不确定为什么要每隔5秒在客户端和服务器之间创建一个新连接。服务器可以创建的连接数有限制,但这应该足够了。如果你把它放在循环中,那么最终服务器将耗尽套接字。
io.connect必须在客户端执行一次,然后你可以每隔5秒就执行一次socket.emit()。删除{'reconnect':false,'connect timeout':5000},你会没事的。
答案 1 :(得分:0)
我找到了问题......
每次调用函数socket_connect()时,都会创建一个“socket.on(”connect“...”函数。因此,当服务器启动时,会创建一个新连接,但事件为“socket”。 on(“connect”被多次触发......
解决方案是:
function socket_connect() {
if (!socket) {
socket = io.connect('http://192.168.1.25:8088', { 'reconnect':false, 'connect timeout': 5000 });
} else {
socket.socket.connect();
}
}
socket.on("connect", function () {
clearInterval(connect_interval);
connect_interval = 0;
socket.emit('player', { refresh_data:true });
});