1

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

4

1 回答 1

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 设置更短的超时,看看会发生什么,b。或尝试通过某种方式强制套接字上的错误,即在读取循环中的读取之间(因为您可能正在使用非阻塞套接字,您必须这样做),尝试写入套接字。
于 2012-10-11T10:06:58.197 回答