socket.io如何工作?

我使用的是socket.io,安装起来很快(感谢他们的使用页面上的例子),但是我想了解更多关于封面的内容以及使其工作的技术。

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

是在端口80上还是单独的?

它真的保持开放还是模拟的部分?

有没有办法来分析每个套接字事件? (有点像使用小提琴来看看在Ajax调用中会发生什么)

为了debugging,你可能想试用Theseus

这里是对socket.io SPEC的简要介绍:

Socket.IO旨在将类似WebSocket的API带入许多浏览器和设备,并具有一些特定function来帮助创build真实世界的实时应用程序和游戏。

  • 多个传输支持(旧用户代理,移动浏览器等)。
  • 相同连接下的多个套接字(名称空间)。
  • 通过心跳断开检测。
  • 可选的acknoledgments。
  • 重新连接支持与缓冲(理想的移动设备或坏的networking)
  • 位于HTTP之上的轻量级协议。

一个Socket.IOsockets的解剖

Socket.IO客户端首先决定使用一个传输来连接。

Socket.IOsockets的状态可以disconnecteddisconnectingconnectedconnecting

运输连接可以被closedclosingopenopening

一个简单的HTTP握手发生在Socket.IO连接的开始。 握手如果成功,将导致客户端收到:

  • 一个会话标识,将被传递给打开连接。
  • 预计heartbeat timeout的秒数( heartbeat timeout
  • 如果传输连接未重新打开( close timeout ),则认为传输连接closures了几秒钟。

在这一点上,sockets被认为是连接的,并且运输信号被用来打开连接。

如果传输连接已closures,则两端都要缓冲消息,然后适当地进行构build,以便在连接恢复时将它们作为批处理发送。

如果在协商的超时时间内没有恢复连接,则认为套接字已断开连接。 在这一点上,客户端可能会决定重新连接套接字,这意味着一个新的握手。

如果你需要更多的细节,你可以在这里阅读其余的规范

JAM的文章在总结socket.io的工作方面做得很好, 我想专门解答一些其他问题。

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

  • 如果使用WebSockets传输,它确实保持打开状态。 它还包括使用传统(长)轮询Ajax请求的后备机制。 所以答案取决于浏览器支持的API。 (如果有的话,您可以selectconfiguration您要使用的回退。)

  • 现在,Fiddler支持websockets,就像Chrome的开发者工具一样:

在这里输入图像说明