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

baa*_*aam 42 javascript node.js express socket.io

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

我在用:

  • 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
  });
});
Run Code Online (Sandbox Code Playgroud)

- 客户端

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
});
Run Code Online (Sandbox Code Playgroud)

如果我加载测试页面,我需要来自服务器的一些值(getInitData).
在第一页访问我获取数据一次,在重新加载或第二次访问我得到它两次,依此类推.

服务器端的连接在页面重新加载时自动关闭,如果您离开页面.
但在客户端,连接仍然是开放的.
如何在客户端关闭连接或检查是否已打开连接?

更新
我现在尝试以下内容:(客户端)

window.onbeforeunload = function(e) {
  socket.disconnect();
};
Run Code Online (Sandbox Code Playgroud)

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

Mil*_*kov 68

你试过了吗:

socket.disconnect() 
Run Code Online (Sandbox Code Playgroud)

在客户端?

  • 我更新了主要帖子.客户端的`socket.disconnect()`确实触发了disconnect事件,但它没有解决我的问题:/ (2认同)

Him*_*wal 19

对于socket.io版本1.4.5:

在服务器上:

socket.on('end', function (){
    socket.disconnect(0);
});
Run Code Online (Sandbox Code Playgroud)

在客户端:

var io = io();
io.emit('end');
Run Code Online (Sandbox Code Playgroud)


fre*_*ish 11

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

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

如果出现这样的问题,那么我很确定你自己的代码中有一个错误(在服务器端).可能你正在堆叠一些你不应该的事件处理程序.

  • *"如果其中一方将其关闭,则关闭"* - 如何从每一侧以编程方式关闭它?我找不到任何文件 (9认同)

Ali*_*har 7

socket.disconnect()
Run Code Online (Sandbox Code Playgroud)

仅重新启动客户端上的连接触发断开事件.但再次联系起来.

socket.close()
Run Code Online (Sandbox Code Playgroud)

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


Ahm*_*abi 6

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

当您在客户端输入:

const socket = io('http://localhost');
Run Code Online (Sandbox Code Playgroud)

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

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

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

socket.on('disconnect', () => {
  socket.open();
});
Run Code Online (Sandbox Code Playgroud)