代码之家  ›  专栏  ›  技术社区  ›  Erik Escobedo

保持客户端浏览器了解事件(如新的聊天信息)的最佳方式是什么?

  •  4
  • Erik Escobedo  · 技术社区  · 16 年前

    我认为,常见的方法是定期对服务器进行“ping”,但我不太喜欢这种方式

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

    5 回复  |  直到 16 年前
        1
  •  5
  •   Bryan Kyle    16 年前

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

    因此,您必须使用手头的工具,这意味着客户机需要询问服务器是否有任何新数据——轮询。投票有两种类型: ,和 长轮询 . 当您在某个时间间隔进行轮询时,只需每隔一天向服务器发出一个请求 n

    关于长轮询的一点警告:在处理长轮询时,确保所有xhr都是异步运行的非常重要,否则您将看到浏览器的UI线程被锁定。


    如果您对使用AJAX不感兴趣,那么您可以始终使用经过测试的IFRAME,它永远不会完成加载。在本例中,您有一个带有聊天日志的IFRAME和另一个包含消息区域的IFRAME。在这种情况下,服务器永远不会关闭包含聊天日志的IFRAME的连接。相反,它只是不断地把聊天信息推到身体里。

        2
  •  3
  •   jigfox    16 年前

    WebSockets 如果某些浏览器无法使用它,如果您没事的话,这会很有帮助。

        3
  •  2
  •   Balint Pato    16 年前
        4
  •  2
  •   Alfred    16 年前

    选项

    • Long-Polling :保持请求打开,直到数据到达。接收数据并关闭连接。打开新连接以再次接收数据。为此,您需要具有非阻塞IO(用于所有通信)。这种方法是最简单的实现方法。如果服务器没有很多并发性,甚至可以使用阻塞I/O。
    • HTTP-Streaming :接收数据时不要关闭连接。为了使它在跨浏览器中工作,你必须做一些“黑客”使它在所有浏览器中工作。
    • XMPP over BOSH
    • Websockets :我想这将是未来,但目前的浏览器支持还不足以真正将其用于所有浏览器。
    • Server-Sent Events :也是非常酷的html5功能。我认为这个协议比websockets更简单。这也不是所有主流浏览器都广泛支持的。
    • Flash :如果您愿意,也可以通过flash进行通信。浏览器必须安装flash插件,但大多数情况下都是这样。

    1. 在我看来,长轮询是通过HTTP实现基于事件的消息传递的最简单/最好的方法。它肯定不是最快的替代方案,但每个主流浏览器都支持它,而且最容易实现。
    2. 我认为Websockets将是最好的技术(未来),但还没有在浏览器中被广泛采用。
    3. 尽管以上技术都很好。他们各有利弊。
        5
  •  0
  •   Aaron Butacov    16 年前