node.js - socket.io xhr-轮询断开事件

标签 node.js websocket socket.io

我有一个 socket.io Node 脚本:

socket.on('disconnect', function(data) {    
  console.log('disconnect!');
});

当我连接 Chrome/Safari 并关闭页面时,我看到“断开连接!”在我的服务器控制台中。

但是,当我连接 iPhone 并关闭页面时,我没有看到此消息。我看到调试 - xhr-polling 由于超出持续时间而关闭

如何接收 iOS 的断开连接事件?

最佳答案

当您在 iPhone 中查看页面时,Socket.io 会切换到 xhr 轮询传输。这可能是由 socket.io 的配置引起的,或者是因为您的 iPhone 中的浏览器不(完全)支持 websockets。

socket.io 中的 xhr-polling 实现在连接关闭时不会发出断开连接事件,请参阅 github issue #431 。您可以通过强制 socket.io 服务器仅使用 xhr-polling 传输来在 Chrome 浏览器中重现此问题:

// the server side
var io = require('socket.io').listen(httpServer);
io.set('transports', ['xhr-polling']);

好消息:您可以要求 socket.io 的客户端通过打开卸载时同步断开标志来通知服务器有关断开连接的信息:

// the browser (HTML) side
var socket = io.connect('http://localhost', {
  'sync disconnect on unload': true
});

警告:当网络和/或服务器速度缓慢时,此选项可能会恶化用户体验,请参阅此 pull request了解更多信息。

更新

根据socket.io force a disconnect over XHR-polling ,设置卸载时同步断开连接可能不足以解决 iPhone/iPad 上的问题。

正如您在socket.io-client source code 中看到的那样, sync disconnect on unloadbeforeunload 事件设置监听器,iOS Safari 不支持该事件。

解决方案可能是修复 socket.io-client 以监听 unloadpagehide 事件,因为 卸载事件可能无法按预期进行前后优化。请改用 pageshow 和 pagehide 事件。 [Apple Web Content Guide] .

关于node.js - socket.io xhr-轮询断开事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17987182/

相关文章:

node.js - 连接到 Azure 移动服务上托管的 Socket.IO 服务器返回错误

python - 如何在 Discord Gateway Websocket 上发送 JSON 有效负载识别

networking - websocket 是否保证单个消息的完整性?我应该为 websocket 消息实现我自己的 header 吗?

node.js - Derbyjs:如何使用无浏览器 socket.io-client 连接到它

node.js - 无法在 docker 容器中列出 pm2

node.js - 如何在亚马逊 EC2 Linux 实例上托管我的应用程序 (MEAN)?

javascript - 如何从 NodeJS API 上传图片到谷歌驱动器

c# - IIS WebSocket 模块未启用

mysql - 当有新的 mysql 记录插入表中时创建 Node.js 事件监听器(用于通知提要)

node.js - 无法在 Windows 上启动 RabbitMQ 集群的多个 Node