我有一个套接字服务器(socket.io + nodejs)和一个套接字客户端(socket.io)。问题是当用户关闭浏览器时,客户端连接仍然打开,从而产生大量死连接。
例如,当我打开浏览器并运行此命令“lsof -i -n -P | grep node | grep'my ip address'”时,我有一个连接。当我关闭浏览器并再次运行该命令时,连接仍然打开。
非常感谢大家都想帮助我!
答案 0 :(得分:0)
尝试在客户端使用socket.disconnect()
,这应该可行。
一旦服务器或客户端触发断开连接,连接就不能 。服务器端的代码中必定存在其他问题。 尝试使用它来关闭服务器端的连接
socket.on('terminate', function (){
socket.disconnect(0);
});
这在客户端:
var io = io();
io.emit('terminate');
看看它是否适合你。 感谢
答案 1 :(得分:0)
制作乒乓功能,服务器将广播ping
个事件,客户端必须回复pong
。
如果在10秒内(在此示例中)服务器将不会获得pong
事件,那么垃圾清理功能将断开插座。
服务器端:
var aliveSockets = {};
// broadcasting ping
setInterval(function() {
io.emit('ping', {timestamp: (new Date()).getTime()});
}, 10000); // 10 seconds
// cleaning up stalled socket which does not answer to ping
setInterval(function() {
aliveSockets.forEach(function(aliveSocket, idx) {
if(!aliveSocket) {return;}
if(aliveSocket.lastPong + 10 < (new Date().getTime())/1000) {
aliveSocket.socket.disconnect(0);
delete aliveSocket[idx];
}
});
}, 1000); // 1 second
io.on('connection', function(socket) {
sockets[socket.id] = socket;
socket.on('pong', function() {
aliveSockets[socket.id] = {socket: socket, lastPong: ((new Date()).getTime()/1000)};
});
});
客户端:
io.on('ping', function() {
io.emit('pong', {timestamp: (new Date()).getTime()});
});
<强> P.S。想法只是解决方法,但我不想写ping-pong-ers,只信任socket.io库,它会在一段时间后删除它(~1分钟)
请阅读:https://github.com/socketio/engine.io#methods-1您可以看到它有pingTimeout
,这意味着socket.io会自动处理您的问题。
pingTimeout(Number):没有pong包要考虑多少ms 连接关闭(60000)