1

有两种实现 Comet 的技术。一种使用 HTTP 流,它使用单个持久 TCP 连接在客户端/服务器之间发送和接收多个 HTTP 请求/响应。第二种是 HTTP 长轮询,它使服务器保持连接打开,并且一旦发生事件,响应被提交并且连接被关闭。然后,客户端立即重新打开一个新的长轮询连接,等待新事件的到来。

我正在使用 Faye ruby​​ gem,我注意到它使用了开箱即用的 Comet/Bayeux。但我不知道它使用了哪种彗星技术。我只是收集到 Bayeux 是发布-订阅协议。我很想知道它是否存在与 HTTP 流和长轮询相同的缺点。它是否允许全双工通信(双向通信,并且与半双工不同,它允许同时发生。)?

4

1 回答 1

3

您对 HTTP 流和长轮询的定义不正确。

在 HTTP 流中,客户端向服务器发送请求,服务器以包含小块数据(消息)的“无限”响应进行回复,通常使用分块传输编码。此机制已被标准化为EventSource(又名服务器发送事件)。它是仅服务器到客户端的事件推送。为了让客户端向服务器发送另一条消息,它必须打开一个新连接。

在 HTTP 长轮询中,客户端发送一个由服务器持有的请求,直到发生事件(或超时),然后提交响应但连接没有关闭。连接保持打开状态,并且可以在该连接上发送其他请求,包括正常或长轮询请求(当然,一次一个)。

Bayeux 协议是在HTTP 或 WebSocket 等传输协议之上的应用协议。

HTTP 是在单个请求/响应交换的上下文中的全双工协议。多个 HTTP 交换被序列化(即一个接一个地执行)。HTTP 请求/响应交换是序列化的单元。

WebSocket 是 WebSocket 消息上下文中的全双工协议。WebSocket 消息可以同时发送和接收。WebSocket 消息是序列化的单元。

Bayeux 继承了传输协议的特点。Bayeux 协议本身不具有任何“双工”特性,您可以将其视为一种将消息格式化为特定文本形式的方法。

CometDFaye都在 WebSocket 和 HTTP 长轮询上使用 Bayeux。

于 2015-07-10T08:05:16.800 回答