繁体   English   中英

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

[英]Node.js: socket.io close client connection

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

我在用:

  • 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)。
在第一页访问我获取数据一次,在重新加载或第二次访问我得到它两次,依此类推。

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

UPDATE
我现在尝试了以下内容:(客户端)

window.onbeforeunload = function(e) {
  socket.disconnect();
};

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

你试过了吗:

socket.disconnect() 

在客户端?

对于socket.io版本1.4.5:

在服务器上:

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

在客户端:

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

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

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

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

socket.disconnect()

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

socket.close()

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

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

当您在客户端输入时:

const socket = io('http://localhost');

这将打开与autoConnect: true的连接,因此当您从服务器断开套接字时,lib将尝试再次重新连接,以禁用autoConnection:

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

如果您需要,可以手动重新连接:

socket.on('disconnect', () => {
  socket.open();
});

我试图关闭版本1.0中的用户连接,并找到此方法:

socket.conn.close()

此方法与disconnect()之间的区别在于客户端将继续尝试重新连接到服务器。

试试这个来关闭连接:

socket.close();

如果你想再次打开它:

socket.connect();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM