Javascript Socket.io在多次刷新后停止工作
我有一个socket.io连接到https服务器,监听javascript向其发送信息。我发现当我刷新时,套接字正在记录连接-因此,如果我在('connection',function(socket){}代码的Javascript Socket.io在多次刷新后停止工作,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我有一个socket.io连接到https服务器,监听javascript向其发送信息。我发现当我刷新时,套接字正在记录连接-因此,如果我在('connection',function(socket){}代码的on('connection',function(socket){})部分中记录某个内容,我将在控制台中看到响应 但是我发现,在服务器端,socket.on()调用没有接收到任何内容 因此,如果我在Javascript中有一行代码是socket.emit('ping',msg),'ping
on('connection',function(socket){})部分中记录某个内容,我将在控制台中看到响应
但是我发现,在服务器端,socket.on()
调用没有接收到任何内容
因此,如果我在Javascript中有一行代码是socket.emit('ping',msg)
,'ping'将在服务器端工作,用于前9-10次刷新,然后在第11次刷新时它将停止工作-并且它将在所有设备和所有浏览器上停止工作。因此,如果我打开另一个浏览器并尝试加载它,它也不会工作
我已经检查过是否有多个连接正在建立或类似的情况,但我什么也没看到。知道为什么会发生这种奇怪的行为吗
服务器端
io.use(function(socket, next) {
// Authentication of the user is happening here - checking for cookies, sessions, etc.
}).on('connection', function(socket) {
// Setting up some variables and checking other stuff
var socketID = socket["id"];
var username = socketUsers[socketID];
locked[socketID] = {};
// Checking for the username
if(username == '' || typeof username == "undefined") {
// Emit some stuff back to Javascript
io.to(`${socketID}`).emit('criticalError', true);
return false;
}
else {
// We have a valid login, so connect to the server
++connected;
// This line will console log every time I refresh
console.log("Some text");
socket.on('ping', function(msg) {
// This line will console log for the first 9-10 refreshes, and then it suddenly stops working. Any ideas why?
console.log('Server was pinged by ' + username);
});
// This line will console log every time I refresh
console.log("Some other text");
}
});
var socket = io('https://example.com:1337');
$(document).ready(function() {
socket.emit('ping', true);
});
客户端
io.use(function(socket, next) {
// Authentication of the user is happening here - checking for cookies, sessions, etc.
}).on('connection', function(socket) {
// Setting up some variables and checking other stuff
var socketID = socket["id"];
var username = socketUsers[socketID];
locked[socketID] = {};
// Checking for the username
if(username == '' || typeof username == "undefined") {
// Emit some stuff back to Javascript
io.to(`${socketID}`).emit('criticalError', true);
return false;
}
else {
// We have a valid login, so connect to the server
++connected;
// This line will console log every time I refresh
console.log("Some text");
socket.on('ping', function(msg) {
// This line will console log for the first 9-10 refreshes, and then it suddenly stops working. Any ideas why?
console.log('Server was pinged by ' + username);
});
// This line will console log every time I refresh
console.log("Some other text");
}
});
var socket = io('https://example.com:1337');
$(document).ready(function() {
socket.emit('ping', true);
});
这是您面临的一个有趣的问题。有多个问题需要检查-但是我建议的第一个问题是以下代码:
var socket = io('https://example.com:1337');
$(document).ready(function() {
socket.emit('ping', true);
});
如果这是客户端的确切代码,则很可能在连接握手之前调用了socket.emit
。这可能是随机的,因为有时文档就绪事件可能会延迟。请尝试为emit事件设置超时-
var socket = io('https://example.com:1337');
$(document).ready(function() {
setTimeout(function(){socket.emit('ping', true);},2000);
});
然后试一试。如果这样做有效,您就发现了问题。下一步是确保身份验证正常工作-如果没有完整的代码,就很难提出建议。如果您的问题没有得到解决,请随意编辑问题并共享代码。这是您面临的一个有趣的问题。有多个问题需要解决eck on-但是我建议的第一个问题是以下代码:
var socket = io('https://example.com:1337');
$(document).ready(function() {
socket.emit('ping', true);
});
如果这是客户端的确切代码,则很可能在连接握手之前调用了socket.emit
。这可能是随机的,因为有时文档就绪事件可能会延迟。请尝试为emit事件设置超时-
var socket = io('https://example.com:1337');
$(document).ready(function() {
setTimeout(function(){socket.emit('ping', true);},2000);
});
然后试一试。如果这样做有效,您就发现了问题。下一步是确保身份验证正常工作-如果没有完整的代码,就很难提出建议。如果您的问题没有得到解决,请随意编辑问题并共享代码。似乎与您的身份验证中间件有关代码的t位?您处理与套接字相关的变量的方式也有点有趣,在您的身份验证中,您应该在哪里设置这些变量并将它们放在套接字上(套接字只是普通对象,所以
socket.id==socket['id']
)和socket.user={}
一旦断开套接字连接,跟踪和删除就会容易得多。正如Nicholas提到的,问题似乎与您如何进行身份验证(然后将套接字数据存储在socketUsers中)有关。您甚至没有收到严重错误吗?问题是我在某个地方使用了一个使用createPool的SQL查询-我的SQL连接空间不足,这会破坏代码。谁会想到这可能是我认为代码中最直接的部分。谢谢你们两位的输入通过将数据附加到套接字本身,它实际上帮助我更好地组织事情。看起来这与您的身份验证中间件共享这段代码有关?另外,您处理与套接字相关的变量的方式也有点有趣,在您的身份验证中,您应该设置软管变量并将它们放在套接字上(套接字只是普通对象,所以socket.id==socket['id']
)和socket.user={}
在套接字断开连接后将更容易跟踪和删除。正如Nicholas提到的,问题似乎与您如何进行身份验证有关(然后将套接字数据存储在socketUsers中)。您甚至没有收到严重错误吗?问题是我在某个地方使用了一个使用createPool的SQL查询-我的SQL连接空间不足,这会破坏代码。谁会想到这可能是我认为代码中最直接的部分。谢谢你们两位的输入通过将数据附加到套接字本身,它实际上帮助我更好地组织事情。嘿,谢谢你的回答,原来这与使用mySQL的createpool和耗尽sql连接空间有关。谁会想到这会是一个问题?我最近遇到了一个问题:谢谢你的回答,原来这与使用mySQL的createpool并耗尽sql连接空间。谁会想到这会是一个问题?我最近遇到了一个问题:D