JavaScript订阅WebSockets

3
我一直在用Javascript探索WebSockets,并且基本功能已经实现,比如发送和接收数据。
然而,当我查看一些连接到websocket数据源的实际案例时,总会涉及到通过发送特定的JSON对象来“订阅”频道的概念。
这背后的机制是什么?服务器端需要什么来处理这样的订阅?订阅是一种发送和请求数据的花式方式还是还有更多的方法?

我找不到使用订阅模式的示例,大多数针对Node.js WebSockets的示例和教程都使用简单的on.message()指令。 - mbilyanov
例如,当客户端发送此 { "event": "subscribe", "pair": [ "XBT/USD","XBT/EUR" ], "subscription": { "name": "ticker" } } 时,服务器端可能发生什么?来源:https://www.kraken.com/features/websocket-api#message-subscribe - mbilyanov
1个回答

0

我觉得这是一个很大的问题,我可能无法提供完整的答案。但我会尽力而为 -

首先,WebSocket 只是一个没有 socket close 的标准 Web 请求。因此,您维护的双向套接字上的输入/输出允许推送数据。

通过 WebSocket 发送内容的两种方法是二进制和文本。因此,当您发送一组数据时,另一端将接收到一条消息。根据您的实现或库,您可能会收到一个完成的消息。

由于发送文本相当便宜且通常使用情况下您希望发送结构化格式(例如传输语言 JSON),因此您的接收器(客户端)只需使用 JSON.parse(message) 即可完成任务。

当然,您可以发送任何格式的文本 - 例如 [my content:"my custom format"],但那是您自己的实现。

最后,WebSocket 连接非常基础 - 没有框架可以利用。一个回显或广播服务器是一个例子,即“对于任何传入的消息,发送到所有连接的客户端”。发布者/订阅者是另一个常见概念,或称为 WebSocket 术语中的“通道”。当用户连接到您的主服务器时,他们提供一些凭据来进行身份验证和/或标识自己为唯一实体。

TL:DR;

因此,“订阅”更多地是一个概念,允许用户连接并分配到消息流。对于许多现成的库来说,这是免费的。这可以通过格式化的传输文本(如 JSON)来完成。

在服务器上,您处理套接字并构建自己的例程协议。这可以简单地作为具有 ID 的套接字列表。


https://Pusher.com长期以来一直是一个Websocket服务提供商,他们提供了一些关于这个主题的优秀文档。

https://pusher.com/docs/channels

但它总是格式化文本或二进制流。您的服务器将处理任何复杂逻辑。

希望能有所帮助。


那么,这是否只是客户端向服务器发送{"subscribe": "updates"},然后服务器在后端发送与updates相关的任何数据,如果客户端消息是{"subscribe": "news"},则发送与news相关的数据位?- 因此,这只是在服务器端评估客户端消息并相应地组织回复吗? - mbilyanov
@mbilyanov 正确。服务器将根据您存储在“更新”或“新闻”中的套接字列表来管理向谁发送消息。实际上,用户正在对适用套接字数组进行“追加”和“删除”操作。 - Glycerine
我知道这可能有点老了,但我仍然希望能够更深入地了解一下:首先,这些订阅通常是通过REST请求处理的,还是应该使用同一Websocket连接进行处理。我之所以问这个问题,是因为我听说混合使用两者可能是不好的做法,而且每个客户端使用多个Websocket连接也是如此。因此,第二个问题,我认为一个连接应该用于例如updatesnews。我对吗? - FabZbi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接