Socket.IO - 内部结构


在本章中,我们将讨论后备、使用 Socket.IO 的连接、事件和消息。

后备措施

Socket.IO 有很多底层传输机制,可以处理由于跨浏览器问题、WebSocket 实现、防火墙、端口阻塞等而产生的各种约束。

尽管 W3C 已经定义了 WebSocket API 的规范,但仍然缺乏实现。Socket.IO为我们提供了fallback机制,可以处理此类问题。如果我们使用本机 API 开发应用程序,我们必须自己实现回退。Socket.IO 按以下顺序涵盖了大量后备方案 -

  • WebSockets
  • FlashSocket
  • XHR 长轮询
  • XHR 多部分流式传输
  • XHR 轮询
  • JSONP 轮询
  • iframe

使用 Socket.IO 连接

Socket.IO 连接从握手开始。这使得握手成为协议的特殊部分。除了握手之外,协议中的所有其他事件和消息都通过套接字传输。

Socket.IO 旨在与 Web 应用程序一起使用,因此假设这些应用程序始终能够使用 HTTP。正是由于这个原因,Socket.IO 握手是使用握手 URI(传递给 connect 方法)上的 POST 请求通过 HTTP 进行的。

事件和消息

WebSocket 原生 API 仅发送消息。Socket.IO 在这些消息之上提供了一个附加层,它允许我们创建事件,并通过分离发送的不同类型的消息再次帮助我们轻松开发应用程序。

本机 API 仅以纯文本形式发送消息。这也由 Socket.IO 负责。它为我们处理数据的序列化和反序列化。

我们有一个官方的网络客户端 API。对于其他客户端,例如本机手机、其他应用程序客户端,我们也可以通过以下步骤使用Socket.IO。

  • 步骤 1 - 需要使用上面讨论的相同连接协议建立连接。

  • 步骤 2 - 消息的格式必须与 Socket.IO 指定的格式相同。这种格式使 Socket.IO 能够确定消息的类型以及消息中发送的数据以及一些对操作有用的元数据。

消息格式是 -

[type] : [id ('+')] : [endpoint] (: [data]

上述命令中的参数解释如下 -

  • Type是一位整数,指定消息的类型。

  • ID是消息 ID,是用于确认的增量整数。

  • 端点是消息要传递到的套接字端点...

  • 数据是要传递到套接字的关联数据。对于消息,它被视为纯文本,对于其他事件,它被视为 JSON。

在下一章中,我们将在 Socket.IO 中编写一个聊天应用程序。