我正在使用JavaScript,jQuery,MySQL和PHP构建聊天应用程序,我只是想知道客户端从服务器检索聊天消息的最佳方式是什么?我目前的潜在候选人是轮询,长轮询,HTML5服务器发送事件(EventSource
)和WebSockets。哪一个是最快的(即时消息)和最有效的方法(如果可能的话,解释为什么)?或者,如果有更好的方法,请在答案中详细说明。
此外,我还查看了Node.js + Socket.IO,但是我找到的文档和示例代码对我来说没有任何意义。
最后,我使用XAMPP作为本地服务器,使用MySQL作为此应用程序的数据库。
任何帮助都将不胜感激。
答案 0 :(得分:4)
巧合的是,您列出的选项按效率排列,从最少到最多。
轮询效率最低。它将轮询是否存在消息,并在其他客户端发送和接收消息之间引入延迟。
长轮询更好;然后你可以在发送消息时收到消息,但是重新连接可能会有轻微的延迟。在那段延迟期间,不会传递信息,但除此之外,它几乎是即时的。
COMET(未提及)优于长轮询,但比服务器发送事件更糟糕。由于大多数Web服务器和浏览器在连接上都有超时,因此它也必须偶尔重新连接,但无论何时发送消息,都不需要重新建立连接。像长轮询一样,重新连接时可能会有延迟,但除此之外,它通常是即时的。
服务器发送事件类似于COMET,但是当没有填充时,它具有来自浏览器的本机支持,因此它可以绕过超时限制,并且只需要在其生命周期内建立一个连接(只要连接不是'破了)另一个优点是,如果连接中断而没有您需要的任何客户端代码,它会自动重新连接。这是瞬间的。
WebSockets是所有这些选项中最好的;它只需要一个连接,它是双工的:你不仅可以通过它接收消息,而且还可以通过它发送消息,而不是每次要发送消息时都需要单独连接到服务器。与Server-Sent Events不同,它确实需要更多代码:如果连接断开且服务器端实现通常更复杂,它不会自动重新连接。我也不确定你是否可以在Apache / XAMPP上使用它。这是瞬间的。
Socket.io是一个支持(几乎?)所有这些以及更多(例如,Flash套接字)并在一个不错的API后面抽象的库,因此您不必处理浏览器支持的特性他们每个人。它与它选择使用的传输速度一样快,这取决于它运行的浏览器。它还可以减少您必须编写的代码量。但是,如果它对你来说太复杂而你不关心旧浏览器,那肯定没必要。此外,它真的喜欢自己运行。您可能能够让XAMPP代理它,但我不知道Apache 是否可以配置为将WebSockets转发给它。