CometD(使用 Bayeux 协议的 Comet)使用 HTTP 流式传输还是 HTTP 长轮询?

Does CometD (Comet with Bayeux Protocol) use HTTP streaming or HTTP long polling?

有两种实现 Comet 的技术。一种使用 HTTP 流式传输,它使用单个持久化 TCP 连接在 client/server 之间发送和接收多个 HTTP requests/responses。第二种是 HTTP 长轮询,它保持连接由服务器打开,并且,尽快当事件发生时,响应被提交并且连接被关闭。然后,等待新事件到达的客户端立即重新打开一个新的长轮询连接。

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

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

在 HTTP 流中,客户端向服务器发送请求,服务器回复 "infinite" 包含小块数据(消息)的响应,通常使用分块传输编码。 此机制已标准化为 EventSource(a.k.a 服务器发送的事件)。 它是服务器到客户端的唯一事件推送。 客户端要向服务器发送另一条消息,它必须打开一个新连接。

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

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

HTTP 是在单个 request/response 交换上下文中的全双工协议。多个 HTTP 交换被序列化(即一个接一个地执行)。 HTTPrequest/responseexchange是序列化的单位

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

Bayeux 继承了传输协议的特点并进行了继承。 Bayeux 协议本身没有任何 "duplexness" 特性,您可以将其视为一种以特定文本形式格式化消息的方式。

两者CometD and Faye都在 WebSocket 和 HTTP 长轮询上使用 Bayeux。