Pushlet、长轮询或轮询 - 我应该在我的聊天应用程序中使用哪一个?

Posted

技术标签:

【中文标题】Pushlet、长轮询或轮询 - 我应该在我的聊天应用程序中使用哪一个?【英文标题】:Pushlet, Long polling or polling - Which one should I use in my chat application? 【发布时间】:2011-12-15 19:15:59 【问题描述】:

我必须开发一个多用户聊天应用程序(如 msn)。我不使用任何框架来构建它,因为我想了解这些东西是如何工作的。

我正在用 Delphi 或 C# 开发它,但这并不重要。重要的是聊天客户端将成为应用程序,而不是浏览器。

问题是:处理客户端之间消息的最佳方式是什么?

到目前为止,我知道这些技巧:

推杆

轮询

长轮询

Link ***

【问题讨论】:

【参考方案1】:

看起来所有这些都对 HTTP 特别有用,因为 HTTP 并不允许永久打开连接。如果您正在编写一个使用 Ajax(或任何 REST 调用)的基于 Web 的聊天客户端,这就是您要走的路。

如果您自己编写聊天应用程序(P2P 或客户端/服务器),您可以创建一个永久保持打开状态的连接。

所以,服务器只监听给定的端口。客户端尝试连接到服务器 IP 地址上的该端口。如果连接成功,它将保持打开状态,直到客户端用户关闭程序(如果一切顺利)。

Delphi 确实有一个使用 Indy TCP 组件的聊天应用程序演示。你可以在那里偷偷摸摸,即使你以后要自己建造它。

【讨论】:

谢谢你指点我indys demo,但是太简单了。但我想我知道如何处理套接字。 @Rafael HTTP 1.1 仍然没有引入服务器发起的消息——它始终是请求/响应。 html5 中 HTTP 协议的 WebSockets 扩展引入了服务器发起的消息。【参考方案2】:

您是否需要支持(数万个)同时连接?如果是的话,我建议看看

IOCP(完成端口) asynchronous request processing(而不是每个请求一个线程)

用于应用服务器和 Servlet 3.0 等标准,以最大限度地减少工作线程的数量并加快网络操作

有一个用于 Delphi 的 IOCP 库 - 请参阅 Is there a I/O completion port based component for Delphi?

HTTP 也可以用作内部协议,新的 Microsoft http.sys 库提供了一个很好的基础,并且包含在新版本的 Windows 中。

为了给人留下一个印象,消息服务器的效率如何:在相对适中的硬件上,开源 ActiveMQ Apollo 服务器每秒可以处理 120 万条消息。 (它是用Java编写的)

【讨论】:

我不需要支持(数万个)同时连接。在这种情况下,我应该继续使用 Pushlet 吗? @Rafael 那么你可以只使用 Indy :) Pushlet = 长轮询 HTTP + javascript。 Telnet 之类的东西或 STOMP 或 MQTT 之类的简单消息传递协议会更容易实现。 好吧,我的客户端和服务器都不是基于 Web 的。他们我认为我应该使用 Pushlet = Indy TCP 客户端 + Indy TCP 服务器 + STOMP。应该没问题吧? @Rafael HTTP 对于非 Web 客户端来说也是一种流行的协议,例如大多数 SOAP 和 REST 服务都使用它。它的优点是大多数企业防火墙都允许 HTTP。因此,您的服务器不需要在用户端进行任何特殊配置。 HTTP 并不意味着使用 HTML。

以上是关于Pushlet、长轮询或轮询 - 我应该在我的聊天应用程序中使用哪一个?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3:支持 IE 9 的长轮询或套接字

ASP.NET 上的 WebSockets/长轮询 - 共享主机?

无需轮询或捎带将服务器端更新发送到浏览器

哪个更好?长 TCP 连接还是长轮询?

卡夫卡长轮询

Libevent + Comet(长轮询/Http-Stream)