2

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

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

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

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

4

4 回答 4

2

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

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

于 2009-09-28T22:40:53.483 回答
1

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

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

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

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

于 2009-09-28T22:22:56.537 回答
1
  1. 在“美好的过去”中,这很容易,因为在第一次连接时,服务器会获取客户端的 IP 号,因此它可以回调。如此简单,事实上,这就是 FTP 无缘无故地做它的方式......但现在我们几乎可以肯定客户端在某个 NAT 之后,所以你不能“回调”。

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

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

于 2009-09-28T23:01:28.283 回答
0

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

于 2009-09-28T22:57:38.930 回答