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

Posted

技术标签:

【中文标题】Node.js:socket.io 关闭客户端连接【英文标题】:Node.js: socket.io close client connection 【发布时间】:2013-08-10 04:54:21 【问题描述】:

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

我正在使用:

socket.io 0.9 node.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();
;

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

【问题讨论】:

你如何处理getInitData事件? getInitData 从我自己编写的节点插件返回一些值。这些值是在表单中设置的(复选框、文本字段等),但我刚刚发现服务器上的连接已启动多次。每次我重新加载页面时,都会添加一个新连接,即使连接正在关闭。 服务器端和浏览器端没有连接。只有一个连接。如果其中一方将其关闭,则它已关闭(并且您无法将数据推送到明显关闭的连接)。现在浏览器会在您离开页面时关闭连接(它不依赖于您正在使用的库),这至少对于 WebSockets 是正确的。如果发生这样的问题,那么我很确定您自己的代码中存在错误(在服务器端)。可能你在不应该的地方堆放了一些事件处理程序。 你可能是对的,怪胎。断开连接后是否有可能清理/删除处理程序?在主帖中,您可以看到我每次重新加载页面时都会向io 添加一个新的处理程序。 @baam 是的,这是最常见的问题之一。我已经发布了我的评论作为答案,所以你可以接受它。 :) 【参考方案1】:

你试过了吗:

socket.disconnect() 

在客户端?

【讨论】:

不,我没有。我认为这只会触发服务器端的断开连接事件?我什么时候会触发这个? 我想念你的问题,但是你什么时候想关闭客户端上的连接? 每次关闭服务器连接。 (重新加载/刷新和页面卸载/离开) 我更新了主帖。客户端的socket.disconnect() 确实触发了断开事件,但它并没有解决我的问题:/ socket.disconnect() 是否在同一行触发断开事件?例如:如果下一行是“console.log('i am after dc')。该行将在断开事件之前执行,还是之后?谢谢!@MilanBabuškov【参考方案2】:

对于 socket.io 版本 1.4.5:

在服务器上:

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

在客户端:

var socket = io();
socket.emit('end');

【讨论】:

嗨。它有效,谢谢。但它是否也会从连接的用户数组中删除用户? 它应该删除,但我不确定。关闭连接后尝试打印用户数组。 完成。如何打印用户数组?在此之前,我使用这个来删除断开连接的用户。删除用户[socket.nickname]【参考方案3】:

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

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

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

【讨论】:

“如果一侧关闭它,则它已关闭” - 如何以编程方式从每一侧关闭它..?我找不到任何文档 其实,当你离开页面或通过链接跳转到另一个页面时,你的websocket的连接会自动关闭,这是因为支持页面的worker已经中止了。尝试shared worker,你可以在其中初始化你的连接并持久化套接字对象。【参考方案4】:
socket.disconnect()

仅在客户端重新启动连接触发断开事件。但再次连接。

socket.close()

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

【讨论】:

【参考方案5】:

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

【讨论】:

thx,socket.destroy() 的同义词是什么?【参考方案6】:

我正在尝试在 1.0 版本中关闭用户连接,发现这个方法:

socket.conn.close()

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

【讨论】:

【参考方案7】:

尝试关闭连接:

socket.close();

如果你想再次打开它:

socket.connect();

【讨论】:

【参考方案8】:

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

【讨论】:

真正的 arg 应该做什么? disconnect(close?: boolean): Socket 如果为真,则关闭底层连接断开此客户端。

以上是关于Node.js:socket.io 关闭客户端连接的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 客户端在长 Node.js 函数中自动断开连接

客户端和服务器端(React/Node.js)之间的 Socket.io 连接失败

os x 上的 node.js socket.io 服务器无法连接超过 120 个客户端

Socket.io 无法在 nginx + node.js + php 应用程序中连接

express,用于浏览器客户端和 node.js 客户端的 socket.io 服务器

Node.js + socket.io 确定每个实例的最大客户端数量