【发布时间】: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 是的,这是最常见的问题之一。我已经发布了我的评论作为答案,所以你可以接受它。 :)
标签: javascript node.js express socket.io