Socket.io 是怎么工作的?

我正在使用 socket.io,它的设置很快(感谢在他们的使用页面上的例子) ,但我想找到更多关于究竟是什么正在进行的掩盖和什么技术,使其工作。

Socket.io 的确切机制是什么?

是在80端口还是另一个端口?

它真的一直开着吗,还是那部分是模拟的?

有没有办法分析每个套接字事件? (有点像使用 Fiddler 查看 Ajax 调用中发生了什么)

21966 次浏览

为了进行调试,您可能需要尝试 忒修斯

以下是 socket.io SPEC 的简短概述:

IO 旨在为许多浏览器带来类似 WebSocket 的 API 设备,具有一些特定的功能,以帮助创建 实时应用程序和游戏。

  • 多种传输支持(旧用户代理、移动浏览器等)。
  • 同一连接下的多个套接字(命名空间)。
  • 通过心跳检测断开连接。
  • 可选的致谢。
  • 重新连接支持缓冲(适用于移动设备或坏网络)
  • 位于 HTTP 之上的轻量级协议。

Socket.IO 套接字的剖析

一个 Socket.IO 客户端首先决定要利用哪个传输进行连接。

Socket.IO 套接字的状态可以是 disconnected, disconnectingconnectedconnecting

传输连接可以是 closedclosingopenopening.

一个简单的 HTTP 握手发生在 Socket.IO 的开头 如果握手成功,则会导致客户端 接收:

  • 将为传输提供的用于打开连接的会话 ID。
  • 预期心跳的秒数(heartbeat timeout)
  • 如果传输连接被认为是断开连接,则在传输连接关闭后的若干秒 未有重开(close timeout)。

此时,套接字被认为是连接的,并且传输是 打开连接的信号。

如果传输连接关闭,则两端都是缓冲区 消息,然后对其进行适当的框架设计,以便将其作为 当连接恢复时批处理。

如果在协商超时内未恢复连接,则 套接字被认为是断开连接的。此时客户端可能 决定重新连接插座,这意味着一个新的握手。

如果您需要更多的细节,您可以阅读规范 给你的其余部分

JAM 的文章很好地总结了 socket.io 的内容; 我想特别解决您的一些其他问题。

  • Io 附加到 http.Server的实例并向其添加处理程序。它不会自己侦听网络端口; 它只是将特定于 socket.io 的处理程序添加到现有的 HTTP 服务器。(但是,如果使用数字调用 io.listen(),它会在内部创建一个新的 HTTP 服务器,该服务器将监听指定的端口并连接到该端口。)

  • 如果它使用的是 WebSockets传输,那么它确实是开放的。它还包括使用传统(长)轮询 Ajax 请求的回退机制。所以答案取决于浏览器支持哪些 API。(如果有的话,您可以选择配置要使用的回退。)

  • Fiddler 现在支持 websockets,Chrome 的开发工具也是如此:

enter image description here