【问题标题】:Java server-client modelJava 服务器-客户端模型
【发布时间】:2011-04-14 04:59:40
【问题描述】:

这个问题更关心程序的总体设计。我手头有一个问题,其中一个中心分别与一组客户端进行通信(客户端不直接相互交互)。

中心与客户之间的通信内容完全是数字,即来回发送一堆数字。客户端在单独的计算机上运行,​​并且中心可以托管在另一台机器上(或其他)。从某种意义上说,通信方式是迭代和同步的,即中心向每个单独的客户端发送请求/问题消息,客户端的用户在每次迭代的时间限制内向中心提供答案/回复,并且这种交互重复多次直到结束。

中心根据从客户收到的响应进行一些计算,客户只需提供该计算的输入。

我想知道使用 Java 解决这个问题的优雅设计是什么?非常感谢任何意见或建议。非常感谢。

【问题讨论】:

  • 哪些因素阻碍了您保持简单——一些基本的 TCP/IP 通信?您是否希望重用现有的库?试图与大量客户沟通?您对服务器地址方面的发现感兴趣吗?容错?什么是最重要的——高效的资源使用/延迟/吞吐量?
  • 中心是否需要启动通讯?服务器通常具有由客户端调用的服务。您如何描述您的架构,将您的客户端变成服务器(它们必须监听请求),将您的中心变成客户端。
  • @Dilum Ranatunga:考虑到应用程序的上下文,我实际上希望它尽可能简单。客户端的数量并不多 - 一次最多将有 10 个客户端连接到服务器。您能否详细说明 TCP/IP 的实现?
  • @Puce:也许我应该澄清一下,中心不会调用在客户端上编程的任何服务。更像是中心提出一个问题(由算法得出),该问题被发送给客户端,客户端回复使用客户端与中心交互的用户提供的答案。
  • 你描述的仍然是一种服务:客户端(这里是中心)提出一个问题,然后发送给服务器(这里是客户端)。服务器(这里是客户端)监听传入的问题并提供响应。 “监听”部分将客户端变成服务器。

标签: java model client-server


【解决方案1】:

我会使用KryoNet,它可以通过 RMI 调用(远程方法调用)有效地序列化您的数据集。我自己使用它,效果很好。有 UDP 和 TCP,没有任何麻烦。从网站上的示例开始,然后从那里开始工作。您可以轻松地让连接的双方都使用 RMI。

【讨论】:

  • 嗨,克里斯,我看过 KryoNet。它看起来很有希望,但是其首页上的简单示例在说明其功能方面是相当基本的。特别是,我想知道基于 KryoNet 的服务器如何处理(并且还能够识别)多个连接的客户端。识别是这里的关键,因为服务器对于不同的客户端可能会有不同的行为。谢谢。
  • 识别将由服务器发起,该服务器持有一个 OID 为 0 的登录对象,客户端将连接到该登录对象。客户端将使用所需角色调用服务器上的登录方法。如果成功,则在此登录功能中,服务器将创建一个允许客户端与服务器交互的对象,并将其存储并返回一个包含交互对象信息(服务器对象 ID、客户端对象 ID)的对象。客户端和服务器的对象将根据客户端类型进行定制。
  • 如此有效,服务器使用与客户端交互的对象(由服务器创建)来识别客户端?我可以假设这些对象的行为会根据交互的客户端而有所不同吗?但是第二个对象“包含交互对象信息(服务器对象ID,客户端对象ID)”的目的是什么?你能举一个简短的例子吗?谢谢。
  • 服务器有一个递增的 oid 计数器,它存储并用作自己的 ID。计数器再次递增以生成客户端 oid。两个 oid 都被发送,客户端采用给定的 oid 作为其对象,同时存储服务器对象 oid。在从服务器发送和由客户端接收时,这两个 ID 都需要在两端适当地注册。根据远程连接信息,可以在客户端和服务器上确定远程对象的类型。您应该在可以覆盖的类中使用“getRemoteClass(Connection c)”函数或类似函数。
【解决方案2】:

听起来MPI 适合您。这是Java version

祝你好运和问候。

【讨论】:

    【解决方案3】:

    纯 Java 中最简单的解决方案可能是使用 RMI。只需通过 RMI 公开一个对象并让客户端远程调用它的方法。

    如果您想要异步行为,您可以使用 JMS 实现或使用上面提到的套接字和 TCP/IP 滚动您自己的实现。

    如果您不喜欢其中任何一个,上面提到的 MPI 可能适合您。或者Apache Hadoop 可能适合你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 2017-07-27
      相关资源
      最近更新 更多