【问题标题】:Node.js: socket.io close client connectionNode.js:socket.io 关闭客户端连接
【发布时间】: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


【解决方案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 如果为真,则关闭底层连接断开此客户端。
        猜你喜欢
        • 2013-08-13
        • 1970-01-01
        • 1970-01-01
        • 2015-03-01
        • 2021-03-25
        • 1970-01-01
        • 2015-09-20
        • 2019-11-05
        • 2016-04-04
        相关资源
        最近更新 更多