我认为,常见的方法是对服务器进行定期“ping”,但我不喜欢它看起来太像

"Is there anything new? - No"
"Is there anything new? - No"
"Is there anything new? - No"
"Is there anything new? - No"
"Is there anyt..."

我见过另一种方法,客户端请求消息,服务器“保留”请求(例如,使用 sleep 循环)直到有新消息。这很酷,但我真的很想听听其他选择。

最佳答案

不幸的是,实际上并没有任何跨浏览器机制将数据从服务器推送到浏览器。例如,早在 1995 年,Netscape 就发布了一种服务器推送技术,它使用一种特殊的内容类型——multipart/x-mixed-replace,但据我所知,IE 不支持它。 WebSockets 是一个新的,但现在才支持。

所以你不得不使用手头的工具,这意味着客户端需要询问服务器是否有任何新数据——轮询。轮询有两种形式:间隔轮询和长轮询。当您按时间间隔轮询时,您只需每 n 秒向服务器发出一次请求以获取数据。如果没有要返回的新数据,这是相当健谈的(请原谅双关语)。当你说“投票”时,人们会想到这一点。

另一个选项,长轮询,类似于客户端向服务器发出请求以查看是否有新数据。但在这种情况下,服务器不会发送响应,直到它有话要说。在这种情况下,客户端会在不确定的时间内等待响应。当客户端最终得到它的响应时,它会解析响应并立即发出另一个请求,该请求将保持挂起直到有数据。

这两种轮询方法都会消耗大量 HTTP 开销,但如果您想使用 XHR,这大概是唯一的方法。

关于长轮询的警告:使用长轮询时,确保所有 XHR 异步运行很重要,否则您会看到浏览器的 UI 线程被锁定。

如果您对使用 AJAX 不感兴趣,那么您始终可以使用久经考验的 IFRAME-that-never-finishes-loading。在这种情况下,您有一个带有聊天记录的 IFRAME 和另一个包含您的消息区域的 IFRAME。在这种情况下,服务器根本不会关闭包含聊天日志的 IFRAME 的连接。相反,它只是不断地将聊天消息推送到正文中。

关于javascript - 让客户端浏览器了解事件(例如新的聊天消息)的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3119047/

10-12 07:37