Comet 和 Websockets 中的开放连接差异
Posted
技术标签:
【中文标题】Comet 和 Websockets 中的开放连接差异【英文标题】:Open connection difference in Comet and Websockets 【发布时间】:2015-08-12 14:51:42 【问题描述】:我试图了解 Websocket 和 Comet 模型的区别。据我了解,
在彗星模型中,连接保持打开状态,直到服务器有东西要推送给客户端。一旦服务器将数据推送到客户端,连接就会关闭,并为下一个请求建立新的连接。 这不是一个好方法,因为连接可能会长时间保持打开状态(导致大量使用服务器资源)或超时。
另一方面,websockets 以握手连接开始,一旦客户端和服务器都同意交换数据,连接就会保持打开状态。
因此,在这两种情况下,连接都会长时间保持打开状态(尤其是 websocket)。 所以这不是 websocket 保持连接打开的一个缺点吗?我想在 asp.net 中参考 SignalR 来讨论这个概念。 p>
【问题讨论】:
【参考方案1】:首先,让我们澄清一下 Comet 有两种形式:HTTP 流式处理和 HTTP 长轮询。你指的是长轮询。 (有关术语,请参阅this other answer)。
在所有三种情况下(WebSocket、HTTP 流和 HTTP 长轮询),底层 TCP 套接字都保持打开状态。这实际上是这种技术的主要特点,而不是副作用。您希望套接字保持永久打开状态(我现在过于简单化了),以便可以异步推送数据并降低延迟。
正如您所说的,这意味着服务器必须能够处理大量打开的套接字而不浪费资源。这是选择好的 Comet/WebSocket 服务器的关键要素之一。
【讨论】:
我从这个链接了解到:***.com/questions/9107384/…,当你在队列中有消息要从服务器发送到客户端时,在这种情况下,彗星将轮询将不得不等到你发送请求(因为它不是全双工的 - 如果我错了,请纠正我)。但是作为全双工,websocket 将继续发送排队的消息,即使它正在满足您当前的请求。如果我在这里错了,请纠正我。 在长轮询中,如果底层 TCP 连接保持打开状态,则在发送下一个长轮询请求时它确实会关闭??? 全双工并不意味着流水线。全双工意味着能够在同一个套接字上同时双向发送消息(从服务器到客户端以及从客户端到服务器)。流水线意味着能够流式传输消息,而无需等待某种应用程序级别的确认或来自客户端的新请求来获取下一条消息。 WebSocket 是带有流水线的全双工。 HTTP 流不是全双工的,但有流水线。 HTTP 长轮询不是全双工的,也没有流水线。在长轮询中,底层 TCP 套接字通常在请求之间保持打开状态。 所以我终于可以得出结论,底层的 tcp 连接保持打开状态。在长轮询的情况下,在收到响应和新请求后结束的请求将再次发送。因此,正如@Alessandro 所指出的那样,由用户决定使用哪种技术以上是关于Comet 和 Websockets 中的开放连接差异的主要内容,如果未能解决你的问题,请参考以下文章