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 应用程序中连接