【问题标题】:how does socket.io work? [closed]socket.io 是如何工作的? [关闭]
【发布时间】:2013-05-19 03:05:46
【问题描述】:

我正在使用 socket.io,它的设置速度很快(感谢他们使用页面上的示例),但我想了解更多关于幕后究竟发生了什么以及使它工作的技术是什么。

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

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

它真的保持打开状态还是那部分是模拟的?

有没有办法分析每个套接字事件? (有点像使用 fiddler 来查看 ajax 调用中发生的情况)

【问题讨论】:

  • 嗯?我的问题非常具体。
  • 嗯,有些问题相当广泛(“确切的机制是什么”?),另外,一个问题通常不是一个好主意。尝试阅读 socket.io/docsgithub.com/Automattic/engine.io 上的文档(socket.io 使用 Engine.io)。然后问一个更有针对性的问题。
  • 即使在阅读了 socket.io 网站上的文档后,也不清楚它在内部是如何工作的。
  • 同意,所以应该在一定数量的支持后自动打开这些帖子。
  • @SonicSoul 投票支持重新开放

标签: javascript node.js socket.io


【解决方案1】:

为了调试,你可能想试试Theseus

这里是socket.io SPEC的简短概述:

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

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

Socket.IO 套接字剖析

Socket.IO 客户端首先决定要使用的传输连接。

Socket.IO套接字的状态可以是disconnecteddisconnectingconnectedconnecting

传输连接可以是closedclosingopenopening.

一个简单的 HTTP 握手发生在 Socket.IO 的开头 联系。握手,如果成功,结果是客户端 接收:

  • 为打开连接的传输提供的会话 ID。
  • 预计心跳的秒数 (heartbeat timeout)
  • 传输连接关闭后的秒数,如果传输连接断开,则认为套接字已断开连接 未重新打开 (close timeout)。

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

如果传输连接关闭,两端都要缓冲 消息,然后将它们适当地框起来,以便将它们作为 连接恢复时进行批处理。

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

如果您需要更多详细信息,可以阅读规范的其余部分here

【讨论】:

  • 这太棒了!谢谢@JAM。欣赏它
  • HTTP 握手?
【解决方案2】:

JAM 的帖子很好地总结了 socket.io 是什么;我想专门解决您的其他一些问题。

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

  • 如果它使用WebSockets 传输,它确实保持打开状态。它还包括使用传统(长)轮询 ajax 请求的后备机制。所以答案取决于浏览器支持哪些 API。 (如果有的话,您可以选择配置您想使用的后备。)

  • Fiddler 现在支持 websocket,Chrome 的开发者工具也支持:

【讨论】:

    猜你喜欢
    • 2016-11-13
    • 2017-08-23
    • 2013-05-05
    • 2010-11-07
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多