0

我有多个客户端和一台服务器。每个客户端都有一些命令可供他们使用,例如:

public interface Command {
    public int run();
}

public class CommandOne implements Command {
    // ...
}

public class CommandTwo implements Command {
    // ...
}

这些命令可以在客户端(在他们的机器上)执行 - 或者它们可以“传递”到服务器执行,然后将返回结果。

在 Java 中实现客户端和服务器的最简单方法是什么?

以下是我想出的:

  • 序列化命令,将其传递给服务器,让服务器对其进行反序列化,运行命令并返回结果。(这不起作用,因为方法不能被序列化。)
  • 将命令的名称(作为字符串)传递给服务器,让服务器运行一条switch语句,实例化一个相同类型的新命令,运行它并返回结果。这意味着如果我添加一个新的命令类,我将不得不同时更新客户端和服务器。
  • 将必要的方法逻辑序列化为某种结构(JSON、XML 等),将其传递给服务器,让服务器将其反序列化为自定义类,运行方法逻辑,然后返回结果。这似乎有点矫枉过正,需要编写 DSL。

有什么我想念的吗?

编辑

每个请求都必须以某种方式进行线程化——因为多个客户端可以同时与服务器通信。不过,这可能不是上述问题的问题。

4

2 回答 2

0

在一个丑陋的世界里,你可以做的简单的事情就是让你的服务器暴露一个接口,比如

/commands?run=CommandOne

并传递一些参数(在正文或查询字符串中)来保存命令参数。

然后使用一些 HTTP 客户端向该 URI 提交 HTTP 请求。服务器将实例化并分派一些命令来执行您想要的。

在更加结构化的世界中,您应该研究 RPC 调用或 RESTful 架构风格。

于 2013-07-29T20:58:32.717 回答
0

我发现一个非常优雅和有趣的解决方案。

如果您打开一个端口并且有一个侦听器正在等待“Runnable”进入,您可以执行 run 方法。变量都将被传递,无论 run 方法做什么都将完成。

最好有一个“runOnServer()”和“runOnClient()”方法。客户端创建对象,将其传递给服务器并继续前进,服务器执行 runOnServer() 方法(针对变量,因为它们已被序列化)然后该类自动序列化回客户端,其中 runOnClient()东西被执行。

使得在服务器上执行某些东西真的很流畅。

如果您想更高级,请查看 Hazlecast,它已经这样做了。

于 2013-07-29T21:29:34.530 回答