【问题标题】:Socket.IO Failure DetectionSocket.IO 故障检测
【发布时间】:2012-10-15 17:22:19
【问题描述】:

如果 node.js 服务器和客户端之间的链接断开,并且断开连接事件还没有被超时触发,有没有办法检测客户端发出的特定事件是否不能通过 Socket.IO 传递到服务器端?

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    我对此进行了更深入的研究,因为我不是 socket.io 或 node.js 方面的专家。

    1. 哪种类型的插座?

    sockets.io 根据浏览器的功能抽象出它使用哪种方法连接到服务器。默认使用 WebSockets (HTML5)。

    服务器端的sockets.io 连接到node.js 的网络服务器,所以它总是使用TCP,因为HTTP 就是在上面运行的。因此,无论客户端使用哪种方法,它都将始终在下面使用 TCP。所以你不必担心 UDP 套接字。

    1. socket.io 是否发出错误?

    TCP 理论上会检查每个数据包是否到达,因此 TCP 应该将连接错误冒泡到 socket.io 库。因此,您可以尝试以下方法:

    <script>
      var socket = io.connect('http://localhost/');
    
      socket.on('error', function (message) { 
        alert( 'error in transport: ' + message );
      });
    

    顺便说一句,我自己没有尝试过,但是我阅读了 socket.io.js 的代码(您应该通过浏览器找到它,因为它是由 socket.io 根据传输配置动态创建的,看起来对我来说)查看使用 publish() 发出了哪些事件。错误还应该触发断开连接,重新连接序列,但是“关闭”直到它完全关闭(在我看来)才会触发,这可能需要一些时间。但看起来error 应该立即触发。

    1. 否则我有两个想法:
      一个。使用 node.js socket.setTimeOut 设置更短的超时,看看会发生什么, 湾。或尝试通过某种方式强制套接字上的错误,即在读取循环中的读取之间(您必须这样做,因为您可能使用的是非阻塞套接字),尝试写入套接字。

    【讨论】:

    • 如何确保 Socket.IO 始终使用 net.Socket() ?
    • 好吧...我将通过socket.io.js代码告诉你我想出什么。
    • 好的......所以我花了几个小时试图了解事情是如何运作的......你的回答似乎非常合理。但显然我们俩都错过了一些东西,因为当我按照你上面粘贴的代码行尝试一些东西时,事情没有奏效。我使用 Chrome JavaScript 控制台pastebin.com/PnsNVkqM 检查了 Socket 对象,发现事件似乎分为 2 个类...内部类和外部类。
    • 我已经等了很久,希望我的connect_failed 的函数会被调用,但是什么也没发生,我已经超过了maxAttempts
    • 问题出在操作系统 TCP 堆栈中,根据您的操作系统和连接中断的方式,它的行为会有所不同。你知道吗 - github.com/LearnBoost/socket.io/issues/844 - 我在帖子中添加了更多建议。
    猜你喜欢
    • 1970-01-01
    • 2012-12-05
    • 2018-01-23
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多