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的状态可以
disconnected
,disconnecting
,connected
和connecting
。运输连接可以被
closed
,closing
,open
和opening
。一个简单的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的开发者工具一样: