实现Comet有两种技术。一种是使用HTTP流,它使用一个持久的TCP连接在客户端/服务器之间发送和接收多个HTTP请求/响应。第二种是HTTP长轮询,它使服务器保持打开连接,一旦发生事件,就提交响应并关闭连接。然后,等待新事件到达的客户端将立即重新打开一个新的长轮询连接。
我正在使用Faye红宝石宝石,我注意到它使用Comet/Bayeux开箱即用。但我不知道它使用的是哪一种Comet技术。我听说贝叶是发布-订阅协议。我很想知道它是否也有HTTP流和长轮询的缺点。它是否允许全双工通信(两个方向的通信,与半双工不同,它允许全双工通信同时发生)?
你对HTTP流和长轮询的定义是不正确的。
在HTTP流中,客户端向服务器发送请求,服务器用包含小数据块(消息)的"无限"响应进行响应,通常使用分块传输编码。这种机制已经被标准化为EventSource(即服务器发送的事件)。它是一个服务器到客户端的事件推送。对于客户端发送另一条消息到服务器,它必须打开一个新的连接。
在HTTP长轮询中,客户端发送一个请求,该请求由服务器保存,直到事件(或超时)发生,然后提交响应,但连接是而不是关闭。该连接保持打开状态,并且可以在该连接上发送其他请求,包括普通请求或长轮询请求(当然,一次一个)。
Bayeux协议是一个建立在传输协议(如HTTP或WebSocket)之上的应用协议。
HTTP是单请求/响应交换上下文中的全双工协议。多个HTTP交换被序列化(即一个接一个地执行)。HTTP请求/响应交换是序列化的单位。
WebSocket是WebSocket消息上下文中的全双工协议。WebSocket消息可以同时发送和接收。WebSocket消息是序列化的单位。
贝叶继承了传输协议的特性。贝叶协议本身并没有任何"双性"特征,你可以把它看作是一种以特定文本形式格式化消息的方法。
CometD和Faye都在WebSocket和HTTP长轮询上使用Bayeux。