【问题标题】:How to interact with Web server using JavaScript如何使用 JavaScript 与 Web 服务器交互
【发布时间】:2011-08-10 01:26:00
【问题描述】:

我正在尝试使用 AppWeb 开源网络服务器开发交互式聊天应用程序。
我需要一些机制使 Web 服务器能够向客户端发送更新的消息,以便当远程用户发送消息时,客户端会自动更新。

有一些方法可以使用 HTML5 Web Sockets 和服务器发送的事件来做到这一点。
但是我们只需要在 HTML 和 JavaScript 中实现它,而不是 HTML5。

所以我需要一些池化机制来持续为新事件池化我的 Web 服务器。

那么我应该如何使用 Sockets 在 Javascript 中编写池机制。
服务端应该如何实现?

谢谢!

【问题讨论】:

    标签: javascript html serverside-javascript


    【解决方案1】:

    已经有一些示例...根据服务器端,您可以选择java-hello-worldphp-hello-world 或...

    如果你不能使用websocket,你不得不可以使用旧方法,通过window.setInterval 创建一个区间,并使用例如从服务器中提取数据。 $.ajax()我不知道双向连接(websocket)的任何其他替代方案...kayahrs answer

    正如您所要求的那样:
    $.ajax()jQuery 执行 xhr 的方式。基本上,它会向服务器发出一个异步请求,该请求返回 xml 或 json 或 text 或 ...(随便)。当此请求返回时,支持的 eventHandler 会被触发,您可以对响应做出反应。您也可以使用普通的 xhr,但处理原始 xhr 有点尴尬。
    jQuery 支持$.ajax() 的一些速记重载,例如。 $.getJSON(), $.get(), ...

    示例实现:

    $.get("test.cgi", function(data){
        alert("Data Loaded: " + data);
    });
    

    【讨论】:

    • 嗨,这两个链接都提供了使用只能在 Google Chrome 上运行的 websockets 的示例(截至目前,因为它在 HTML5 规范中)。我们需要我们的应用程序可以在任何浏览器上运行,因此正在寻找仅使用 HTML4 规范和 JavaScipts 的选项。
    • 顺便说一句,websockets 只能在 Chrome 上运行,这不是真的……你可以在任何 webkit 浏览器上运行 websocket,opera 10.70
    • 感谢您的回复,您能否提供$.ajax() 的示例,因为我对这个概念非常陌生。
    【解决方案2】:

    还有另一种技术可以将消息从服​​务器发送到客户端。为此,您必须使用 iframe 连接到不会关闭连接的 PHP 脚本(或您在服务器端使用的任何技术)。然后,每当必须通知客户端某事时,PHP 脚本就会发送 JavaScript 消息。在每条消息之后,服务器刷新输出流以强制数据真正找到到达客户端的方式,并且不会被某些输出缓冲区缓存。下面是在 iframe 中加载的 PHP 脚本的一个小示例代码(未经测试,不完整,只是为了展示基础知识):

    <html>
      <body>
        <script type="text/javascript">
    
          function receiveMsg(data)
          {
              // Do something with the data, for example send it to some function
              // in the parent frame (Where your chat application lives)
          }
    
          <?php
    
          while (true) // You may also implement some abort state which should
                       // be checked here
          {
              $data = waitForData(); // This is your magic function on the server
                                     // which waits for data to be send to the client
              echo "receiveMsg('" . $data . "');"; // Let's say data is just a string.
                                                 // You may want to use JSON instead
              flush();
          }
          ?>
        </script>
      </body>
    </html>
    

    这种方法的优点是不依赖轮询。因此,您不必每 x 秒向服务器发送一次请求。当你在服务器端做正确的事情时,一个用户发送的消息会尽快被其他用户接收,而不是 x 秒后。缺点是每个聊天用户都有一个永久的 HTTP 连接。但这可能需要更少的服务器资源,然后每个聊天用户每分钟有几十个完整的 HTTP 请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 2011-03-21
      相关资源
      最近更新 更多