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

我正在使用:

  • 插座io 0.9
  • node .js 0.10.15
  • 快报3.3.4

即.:

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();
};

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

推荐答案

服务器端和/或浏览器端没有连接.只有一个连接.如果其中一方关闭了它,那么它就关闭了(并且您不能将数据推送到明显关闭的连接).

当您现在使用的是操作系统/服务器时,它会关闭浏览器端的连接.这至少适用于WebSocket(对于长轮询可能不适用,因为有keep-alive个,但hopofuly socket.io可以正确处理这个问题).

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

Node.js相关问答推荐

NodeJS缓冲区大小逻辑:为什么默认是8KB,而不仅仅是数据大小?

如何解决无法获得本地颁发者证书的问题

node 上的磁盘压力

@nuxtjs/站点 map 错误提示:找不到包';NitroPack';

如何防止Socket-io实例化React/Next.js中的两个套接字(当前在服务器*和*客户端实例化)

当 Got 包因错误 JSON 崩溃时如何获取响应文本?

如何在套接字对象中存储或添加数据?

suppress AWS SDK v2 弃用消息

我应该转译我的 TypeScript 应用程序吗?

我误解了外键的工作原理吗?使用续集

只要我在后端正确验证所有内容,就可以将这些数据存储在本地存储中吗?

我怎样才能让`git`失败而不是要求提供凭据

使用 node.js 执行一个 exe 文件

在 Node.js 与 Cron 作业(job)中设置间隔?

如何使用 Node.js、Express 和 Mongoose 进行身份验证?

Node.js, require.main === 模块

使用 node.js 循环 JSON

Node.js - 判断是否安装了模块而不实际需要它

使用 Monit 而不是基本的 Upstart 设置有什么好处?

Npm postinstall 仅用于开发