跳至主要内容
版本: 4.x

常见问题解答

以下是关于 Socket.IO 的一些常见问题

有些东西无法正常工作,请帮忙?

请查看 故障排除指南.

它是如何在幕后工作的?

Socket.IO 连接可以使用不同的底层传输建立

Socket.IO 将根据以下因素自动选择最佳可用选项

  • 浏览器的功能(参见 这里这里
  • 网络(某些网络会阻止 WebSocket 和/或 WebTransport 连接)

您可以在 "工作原理" 部分 中找到更多详细信息。

与纯 WebSocket 相比,Socket.IO 提供了哪些功能?

WebSockets 太棒了!不,真的。它们为在客户端和服务器之间传输数据提供了一种高效的方式。优点包括

  • 您无需依赖定期轮询从服务器获取数据
  • 您无需在向服务器发送数据时重复发送所有 HTTP 标头

这使得它们非常适合低延迟和数据密集型应用程序,例如游戏、聊天、协作解决方案...

话虽如此,WebSockets 也是相当低级的,使用 WebSockets 开发实时应用程序通常需要在它们之上添加一层

  • 回退到 HTTP 长轮询,以防 WebSocket 连接无法建立
  • 自动重新连接,以防 WebSocket 连接断开
  • 确认,用于发送一些数据并期望从另一方收到响应
  • 广播到所有连接的客户端或连接的客户端子集
  • 扩展到服务器的多个实例
  • 连接恢复,用于短时间断开连接

您可能已经猜到,这层额外的功能是由 Socket.IO 库实现的。

什么是 WebTransport?

简而言之,WebTransport 是 WebSocket 的替代方案,它修复了困扰 WebSockets 的几个性能问题,例如 首行阻塞

如果您想了解更多关于这个新的 Web API(它于 2022 年 1 月包含在 Chrome 中,并于 2023 年 6 月包含在 Firefox 中)的信息,请查看以下链接

注意

Socket.IO 中默认情况下未启用对 WebTransport 的支持,因为它需要安全上下文 (HTTPS)。如果您想使用 WebTransport,请查看 专用教程

Socket.IO 是否存储消息?

Socket.IO 服务器不会存储任何消息。

您的应用程序有责任将这些消息持久化到某个地方,以便当前未连接的客户端可以使用。

提示

话虽如此,如果您启用了 连接状态恢复功能,Socket.IO 会在短时间内存储消息。

Socket.IO 的交付保证是什么?

Socket.IO 保证消息排序,无论使用哪种底层传输(即使在两种传输之间切换)。

此外,默认情况下,Socket.IO 提供最多一次交付保证(也称为“开火即忘”,这意味着在某些情况下,消息可能会丢失,并且不会尝试重试)。

有关此内容的更多信息,请参见 这里

如何识别特定用户?

Socket.IO 中没有用户的概念。

您的应用程序有责任将给定的 Socket.IO 连接链接到用户帐户。

对于 Node.js 应用程序,您可以例如

  • 重用由 Passport 提供的用户上下文(查看 本教程
  • 或在客户端使用 auth 选项发送用户凭据,并在 中间件 中验证它们

在哪里可以找到变更日志?

请参见 这里