且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-10-25 09:07:40

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



当您浏览器关闭连接时离开页面(它不依赖于您在服务器端使用的库/语言/操作系统)。这对于WebSockets至少是这样的(由于 keep-alive 但希望socket.io正确处理这种情况,长时间轮询可能不是这样)。



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


How can I close the socket connection on the client side?

I am using:

  • socket.io 0.9
  • node.js 0.10.15
  • express 3.3.4

i.e.: call localhost/test
-- server side

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
  });
});

-- client side

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
});

If I load the test-page I need some values from the server (getInitData).
On the first page visit I get the data once, on a reload or second visit I get it twice and so on.

The connection on the server side is beeing closed automatically on page reload and if you leave the page.
But on the client side the connection is still open.
How can I close the connection on the client side or check if there is already a open connection?

UPDATE
I tried now the following: (client side)

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

This triggers on the client side the disconnect event, but I still get the twice or tripple response.

There is no such thing as connection on server side and/or browser side. There is only one connection. If one of the sides closes it, then it is closed (and you cannot push data to a connection that is closed obviously).

Now a browser closes the connection when you leave the page (it does not depend on the library/language/OS you are using on the sever-side). This is at least true for WebSockets (it might not be true for long polling because of keep-alive but hopefuly socket.io handles this correctly).

If a problem like this happens, then I'm pretty sure that there's a bug in your own code (on the server side). Possibly you are stacking some event handlers where you should not.