【问题标题】:JSON Asynchronous Application server?JSON 异步应用服务器?
【发布时间】:2009-09-28 22:06:01
【问题描述】:

首先解释一下我需要的数据流

Client connects and registers with server
Server sends initialization JSON to client
Client listens for JSON messages sent from the server

现在所有这些都可以简单直接地手动完成,但我想利用某种服务器来处理所有连接内容、保持活动状态、死客户端等。

做这种事情有什么先例吗?客户端在哪里从服务器异步连接和接收 JSON 消息?不使用手动套接字编程?

【问题讨论】:

    标签: json web-applications sockets application-server


    【解决方案1】:

    一种可能的解决方案称为Comet,它涉及客户端打开与长时间保持打开状态的服务器的连接。然后服务器可以在数据可用时立即将数据推送到客户端,并且客户端几乎可以立即获取它。最终,Comet 连接超时,并创建了另一个。

    不确定您使用的是哪种语言,但我已经看到了其中几种用于 Java 和 Scala 的语言。在 Google 中搜索彗星框架和您的语言名称,您应该会找到一些东西。

    【讨论】:

    • 我知道 Comet,但我只见过用 JS 编写的强大的客户端解决方案。
    • 我听说过一个 Flash 应用程序,它可以让您通过端口连接而不是使用 JS 进行通信,但我不记得它叫什么了。
    • Jetty 有一个彗星应用程序。我想还有几个其他的应用服务器(例如 Tomcat、JBoss 等)也有等效的实现。
    【解决方案2】:
    1. 在“美好的旧时光”中,这很容易,因为在第一次连接时,服务器会获取客户端的 IP 号,因此它可以回调。如此简单,事实上,这就是 FTP 无缘无故地做它的方式......但现在我们几乎可以确定客户端在某个 NAT 后面,所以你不能“回调”。

      • 然后你可以保持 TCP 连接打开,因为它是双向的,只需让客户端等待数据出现。服务器会尽可能发送它想要的任何东西......但是现在每个人都希望每个应用程序都在 Web 浏览器上运行,这意味着 HTTP,它是由客户端发起的严格的“请求/响应”。

      • 所以,当前的答案是彗星。简而言之,JavaScript 客户端发送请求,但服务器在很长一段时间内没有响应。如果连接超时,客户端会立即重新打开它,因此总是有一个打开的管道在等待服务器的响应。该响应将包含服务器想要发送给客户端的任何消息,并且仅在相关时。客户端收到它,并立即发送一个新的查询以保持通道打开。

    【讨论】:

      【解决方案3】:

      问题在于 HTTP 是一种请求响应协议。除非客户端提交请求,否则服务器无法发送任何数据。

      试图通过发出请求来规避这种情况,然后不断地在相同的原始请求上发回响应是有缺陷的,因为该行为不符合 HTTP 并且它不能很好地与各种中介(代理、路由器等)配合使用) 和浏览器行为(Ajax 完成)。它也不能很好地扩展,在服务器上保持一个套接字打开是非常耗费资源的,并且套接字是非常宝贵的资源(通常只有几千个可用)。

      试图通过反转流程来规避这一点(即,服务器在它有要推送的内容时连接到客户端)甚至是有缺陷的,因为随之而来的安全/身份验证问题(响应很容易被劫持、拒绝)或欺骗),还因为客户端经常无法访问(位于代理或 NAT 设备后面)。

      AFAIK 大多数 RIA 客户只是在计时器上轮询。不理想,但这就是 HTTP 的工作原理。

      【讨论】:

      • 当您说“计时器上的池”时,您的确切意思是什么?你是说民意调查吗?
      • 是的,轮询 :) 每 N 秒发送一个 HTTP 请求,检查状态是否有任何变化。
      • 嗯,客户端的开销可能太大了。
      • 许多较新的 RIA 客户端使用 Comet/Ajax Push 而不是轮询/Ajax Pull,因为 Comet 具有更新速度更快、请求更少的优点。 Comet 是 Gmail 和 Facebook 聊天使用的。
      • 没错,开销变得太大了。我在实现轮询 Ajax 国际象棋 Web 应用程序时亲身体验过,在您知道之前,客户端发送了大量请求以保持最新状态。
      【解决方案4】:

      GWT 为这类东西提供了一个框架并与 Comet 集成(至少对于 Jetty)。如果您不介意用 Java 编写至少部分 JavaScript,那么这可能是更简单的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-13
        • 2019-01-16
        • 2012-04-15
        • 2020-02-06
        • 2011-10-08
        • 1970-01-01
        • 2014-06-18
        • 1970-01-01
        相关资源
        最近更新 更多