我正在使用socket.io并且设置很快(感谢其使用页面上的示例),但我想了解更多关于封面下究竟发生了什么以及使其工作的技术是什么。
socket.io的确切机制是什么?
是在80端口还是单独的端口?
它是真的保持开放还是被模拟的部分?
有没有办法分析每个套接字事件? (有点像使用fiddler查看ajax调用中发生的事情)
答案 0 :(得分:38)
要进行调试,您可能需要试用Theseus。
以下是socket.io SPEC的简短概述:
Socket.IO旨在为许多浏览器带来类似WebSocket的API 设备,具有一些特定功能,以帮助创建 现实世界的实时应用和游戏。
- 多种传输支持(旧用户代理,移动浏览器等)。
- 同一连接下的多个套接字(名称空间)。
- 通过心跳断开检测。
- 可选的附件。
- 带缓冲的重新连接支持(适用于移动设备或坏网络)
- 位于HTTP之上的轻量级协议。
Socket.IO套接字解剖
Socket.IO客户端首先决定要用于连接的传输。
Socket.IO套接字的状态可以是
disconnected
,disconnecting
,connected
和connecting
。传输连接可以是
closed
,closing
,open
和opening
。简单的HTTP握手发生在Socket.IO的开头 连接。握手,如果成功,将导致客户端 接收:
- 将为传输打开连接提供的会话ID。
- 预期心跳(
的秒数heartbeat timeout
)- 传输连接关闭后的几秒钟,如果传输连接,则认为套接字已断开连接 没有重新开放(
close timeout
)。此时套接字被认为是连接的,传输是 发出信号以打开连接。
如果传输连接关闭,则两端都要缓冲 消息,然后适当地框架它们,以便它们作为一个发送 连接恢复时批处理。
如果连接未在协商超时内恢复,则 套接字被视为断开连接此时客户可能会 决定重新连接套接字,这意味着新的握手。
如果您需要更多详细信息,可以阅读规范的其余部分here
答案 1 :(得分:30)
JAM的帖子很好地总结了socket.io 是什么;我想专门解答你的其他一些问题。
Socket.io附加到http.Server
的实例并向其添加处理程序。它不会自己监听网络端口;它只是将socket.io特定的处理程序添加到现有的HTTP服务器。 (但是,如果使用数字调用io.listen()
,它会在内部创建一个新的HTTP服务器,该服务器将侦听指定的端口并附加到该端口。)
如果使用WebSockets传输,它确实保持打开状态。它还包括使用传统(长期)轮询ajax请求的回退机制。所以答案取决于浏览器支持的API。 (您可以选择配置您要使用的回退,如果有的话。)
Fiddler现在支持websockets,Chrome的开发者工具也是如此: