一尘不染

Node.js:socket.io关闭客户端连接

node.js

如何关闭客户端的套接字连接?

我在用:

  • socket.io 0.9
  • node.js 0.10.15
  • express3.3.4

即:呼叫localhost/test
-服务器端

var test = io
.of('/test')
.on('connection', function (socket) {

  console.log('open socket: ' + socket);

  socket.on('disconnect', function () {
    console.log('disconnected event');
    //socket.manager.onClientDisconnect(socket.id); --> endless loop with this disconnect event on server side
    //socket.disconnect(); --> same here
  });
});

- 客户端

var socket = io.connect('http://localhost:3000/test');
socket.on('disconnect', function () {
   console.log('disconnect client event....');
});

socket.emit('getInitData', function (data) {
  .. do something with data
});

如果加载测试页,则需要来自服务器的一些值(getInitData)。
在第一页上,我获取一次数据,在重新加载或第二遍上,我获取两次数据,依此类推。

重新加载页面以及离开页面后,服务器端的连接将自动关闭。
但是在客户端,连接仍然打开。
如何关闭客户端的连接或检查是否已经打开了连接?

更新
我现在尝试以下操作:(客户端)

window.onbeforeunload = function(e) {
  socket.disconnect();
};

这会在客户端触发断开连接事件,但我仍然会收到两次或三重响应。


阅读 646

收藏
2020-07-07

共1个答案

一尘不染

服务器端和/或浏览器端没有连接。只有一个连接。如果一侧关闭它,则它关闭(并且您无法将数据推送到明显关闭的连接)。

现在,当您离开页面时,浏览器将关闭连接(它不依赖于服务器端所使用的库/语言/操作系统)。至少对于WebSockets来说是这样(长轮询可能不是这样,因为keep- alivesocket.io 希望它能正确处理)。

如果发生这样的问题,那么我很确定您自己的代码中有一个错误(在服务器端)。可能您正在堆叠一些本不应该的事件处理程序。

2020-07-07