2013-04-07 37 views
3

我正在用JavaScript,jQuery,MySQL和PHP构建聊天应用程序,我只是想知道客户端从服务器检索聊天消息的最佳方式是什么?我目前潜在的候选人是轮询,长轮询,HTML5服务器发送的事件(EventSource)和WebSockets。其中哪些是最快的(即时消息)和最有效的方法(如果可能的话解释为什么)?或者如果有更好的方法来做到这一点,请在答案中详细说明。客户端从服务器检索聊天消息的最佳方式?

此外,我还查看了Node.js + Socket.IO,但是我发现的文档和代码示例并没有让我觉得有点意思。

最后,我使用XAMPP作为本地服务器和MySQL作为我的数据库用于此应用程序。

任何帮助,将不胜感激。

+0

IRC是要走的路。 – hakre 2013-04-08 00:06:14

+0

@hakre恐怕我无法理解IRC的意思。快速搜索它会告诉我它是“互联网中继聊天”,但我无法得到任何进一步的。我似乎无法找到任何关于此技术/协议的文档/无论它是什么。你能否通过链接指向正确的方向? – 2013-04-08 00:20:53

+0

@kpsuperplane:IRC确实是互联网中继聊天。这是一个协议。当然有[维基百科文章](https://en.wikipedia.org/wiki/Internet_Relay_Chat)。对于技术细节,有[RFC](https://tools.ietf.org/html/rfc1459)。有各种各样的实现;没有指定的“官方”。你必须看看你的选择是什么,就像你可能会看到不同的Web或邮件服务器一样。 – icktoofay 2013-04-08 00:27:45

回答

4

巧合的是,您列出的选项按效率排列,从最低到最高。

轮询效率最低。它将轮询是否有消息,并在其他客户端发送和接收的消息之间引入延迟。

长查询更好;那么您可以在发送消息时收到消息,但重新连接可能会稍微延迟。在这段延迟期间,邮件将不会被传送,但除此之外,它几乎是瞬间的。

COMET(未提及)比长轮询更好,但比Server-Sent Events更糟。由于大多数Web服务器和浏览器都有超时连接,所以它也必须偶尔重新连接,但无论何时发送消息都不需要重新建立连接。像长时间轮询一样,重新连接可能会有延迟,但除此之外,通常是瞬时的。

服务器发送的事件与COMET类似,但是当它不被刷新时,它具有来自浏览器的本地支持,所以它可以绕过超时限制并且只需要在其整个生命周期内建立一个连接(只要连接不是坏了)。另一个优点是,如果连接断开而不需要客户端代码,它会自动重新连接。这是即时的。

WebSockets是迄今为止所有这些选项中最好的;它只需要一个连接,而且它是双工的:不仅可以通过它接收消息,而且还可以通过它发送消息,而不是在每次发送消息时都需要分别连接到服务器。与服务器发送的事件不同,它需要更多的代码:如果连接中断,服务器端实现通常更复杂,它不会自动重新连接。我也不确定你是否可以在Apache/XAMPP中使用它。这是即时的。 (几乎?)所有这些和一些(例如,Flash套接字)并将它抽象为一个漂亮的API后面的库,所以你不必处理浏览器支持的特性为他们每个人。它与它选择使用的传输速度一样快,这取决于它运行的浏览器。它也可以减少你必须编写的代码量。但是,如果它对你来说太复杂,而且你不关心旧版浏览器,那肯定没有必要。另外,它真的很喜欢自己运行。您可能可以让XAMPP代理它,但是我不知道Apache 是否可以配置以将WebSocket转发给它。

+0

谢谢您的详细解答,我的问题的70%被回答。另外30%是速度(即时 - 延迟/超时)方面的简单选项列表,如果可能则进行说明。如果你可以添加,我将它标记为答案。 – 2013-04-08 00:18:30

+0

谢谢修改后的答案 - 看起来我正在和SSE一起去。 – 2013-04-08 00:46:48

相关问题