客户端从服务器检索聊天消息的最佳方法是什么?

3
我正在使用JavaScript、jQuery、MySQL和PHP构建聊天应用程序,我想知道客户端从服务器检索聊天消息的最佳方法是什么?我当前的潜在候选人是轮询、长轮询、HTML5服务器发送事件(EventSource)和WebSockets。哪种方法是最快的(即时消息)和最有效的(如果可能,请解释原因)?或者如果有更好的方法,请在答案中详细说明。
此外,我还看了Node.js + Socket.IO,但是我找到的文档和示例代码对我来说毫无意义。
最后,我正在使用XAMPP作为本地服务器,MySQL作为应用程序的数据库。
任何帮助都将不胜感激。

IRC是正确的选择。 - hakre
@hakre,恐怕我无法理解你所说的IRC。快速搜索告诉我它是“Internet Relay Chat”,但我无法进一步了解。我似乎找不到任何关于这种技术/协议/任何东西的文档。你能否给我提供一个链接,指引我正确的方向? - Kevin Pei
@kpsuperplane:IRC确实是Internet Relay Chat,它是一种协议。当然,有维基百科文章。关于技术细节,可以参考相关RFC。有各种不同的实现方式,没有指定的“官方”实现方式。你需要看看有哪些选项,就像你可能会在不同的Web或邮件服务器中寻找一样。 - icktoofay
@icktoofay 谢谢你的评论。它帮助我更好地理解IRC。hakre 我并不特别相信IRC会对我有多大好处。除了像icktoofay指出的那样有一些实现之外,它是一个完整的聊天系统,而不是客户端和服务器之间的通信方法。此外,这个IRC似乎需要几个服务器,而我目前没有这些服务器可供使用。还是谢谢你的建议。 - Kevin Pei
@kpsuperplane:http://en.wikipedia.org/wiki/Internet_Relay_Chat - 它是使用TCP/IP完成的,就像HTTP一样。 - hakre
1个回答

4
巧合的是,你列出的选项按效率从低到高排序。
轮询是最低效的。它会不断地轮询是否有消息,这会在消息被发送和其他客户端接收之间引入延迟。
长轮询更好;然后你可以在消息发送时获取到消息,但是重新连接可能会有轻微的延迟。在此期间,消息将无法传递,但除此之外,它几乎是瞬间的。
COMET(未提及)比长轮询更好,但比服务器推送事件更差。由于大多数Web服务器和浏览器都有连接超时,因此它也必须偶尔重新连接,但每次发送消息时无需重新建立连接。与长轮询类似,在重新连接时可能会有延迟,但除此之外,通常是瞬间的。
服务器推送事件类似于COMET,但如果没有模拟,则浏览器具有本地支持,因此它可以绕过超时限制,并且只需要在其生命周期内建立一个连接(只要连接没有断开)。另一个优点是,如果连接中断,它会自动重新连接,无需在您的部分编写任何客户端代码。这是瞬间的。
WebSocket是所有选项中最好的;它只需要一个连接,并且是双向的:不仅可以通过它接收消息,还可以通过它发送消息,而不需要每次想要发送消息时都需要单独连接到服务器。与服务器推送事件不同,它确实需要一些更多的代码:如果连接中断,它不会自动重新连接,并且服务器端实现通常更复杂。我也不确定您是否可以将其与Apache / XAMPP一起使用。这是瞬间的。
Socket.io是一个库,支持(几乎?)所有这些以及更多内容(例如Flash套接字),并在一个漂亮的API后面进行抽象,因此您不必处理每个浏览器对它们的支持的特异性。它的速度取决于它选择使用的传输方式,这取决于它运行的浏览器。它还可以减少您需要编写的代码量。但是,如果它对您来说太复杂,而且您不关心旧版浏览器,则肯定不是必需的。此外,它真的很喜欢独立运行。您可能能够让XAMPP代理它,但再次,我不知道Apache是否可以配置为将WebSocket转发给它。

感谢您详细的回答,我的问题已经得到了70%的解答。另外30%是一个关于速度选择(即时-延迟/超时)的简单列表,如果可能的话,请加上解释。如果您能补充这部分内容,我会将其标记为答案。 - Kevin Pei
谢谢您修改后的答案 - 看起来我会选择SSE。 - Kevin Pei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接