如何在Java中将方法或对象从客户端传递到服务器?

时间:2013-07-29 20:49:45

标签: java client-server

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

public interface Command {
    public int run();
}

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

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

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

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

以下是我的想法:

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

我有什么遗失的吗?

修改

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

2 个答案:

答案 0 :(得分:0)

在一个丑陋的世界里,你可以做的简单事情是让你的服务器公开一个像

这样的界面
/commands?run=CommandOne

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

然后使用某个HTTP客户端向该URI提交HTTP请求。服务器将实例化并调度一些命令以执行您想要的操作。

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

答案 1 :(得分:0)

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

如果您打开一个端口并且只有等待“Runnable”进入的侦听器,则可以执行run方法。变量将全部传递,无论run方法做什么。

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

在服务器上执行某些操作非常灵活。

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