50

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

我在用:

  • 套接字.io 0.9
  • 节点.js 0.10.15
  • 表达 3.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();
};

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

4

8 回答 8

82

Did you try:

socket.disconnect() 

on client?

于 2013-08-08T12:59:21.933 回答
22

对于 socket.io 版本 1.4.5:

在服务器上:

socket.on('end', function (){
    socket.disconnect(0);
});

在客户端:

var socket = io();
socket.emit('end');
于 2016-03-19T19:59:33.773 回答
12

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

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

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

于 2013-08-09T12:58:26.363 回答
7
socket.disconnect()

仅在客户端重新启动连接触发断开事件。但是又重新连接了。

socket.close()

断开与客户端的连接。客户端将继续尝试连接。

于 2015-07-11T18:50:34.293 回答
4

socket.disconnect()socket.close()手动断开套接字的同义词。

当您输入客户端时:

const socket = io('http://localhost');

这将打开一个与 的连接autoConnect: true,因此当您从服务器断开套接字时,lib 将尝试再次重新连接,以禁用自动连接:

const socket = io('http://localhost', {autoConnect: false});
socket.open();// synonym to socket.connect()

如果你愿意,你可以手动重新连接:

socket.on('disconnect', () => {
  socket.open();
});
于 2019-03-30T22:55:48.067 回答
2

我正在尝试在 1.0 版本中关闭用户连接并找到此方法:

socket.conn.close()

此方法与 disconnect() 之间的区别在于客户端将不断尝试重新连接到服务器。

于 2015-02-09T17:07:45.027 回答
1

试试这个来关闭连接:

socket.close();

如果你想再次打开它:

socket.connect();
于 2015-04-17T23:31:18.963 回答
0

只需socket.disconnect(true)通过从客户端发出任何事件来尝试在服务器端。

于 2015-12-30T13:05:29.633 回答