Java Socket RPC协议

Joe*_*dev 3 java sockets

我一直在问一些关于调整命令协议以便在我的客户端服务器环境中使用的问题.然而,经过一些实验,我得出的结论是它对我不起作用.它不是为这种情况设计的.因此,我处于一个松散的结局.

在我有一个名为"Operation"的类之前,我已经实现了一种RPC机制.我还有一个名为"Action"的枚举,其中包含可以在服务器上调用的操作的名称.

现在,在我的旧项目中,每次客户端想要在服务器上调用操作时,它都会创建一个"Operation"实例,并使用"Action"枚举中的值设置action变量.例如

Operation serverOpToInvoke = new Operation();
serverOpToInvoke.setAction(Action.CREATE_TIME_TABLE);
serverOpToInvoke.setParameters(Map params);
ServerReply reply = NetworkManager.sendOperation(serverOpToInvoke);
...

在服务器端,我不得不通过加载'if/else'语句检查'Action'枚举值来执行确定调用哪个方法的可怕任务.找到匹配后,我会调用适当的方法.

这个问题是它很乱,很难维护,最终是糟糕的设计.

因此我的问题是 - 在java中的TCP套接字上实现一个漂亮,干净且可维护的rpc机制是否存在某种模式?由于客户端(android)不支持RMI,因此RMI对我不利.在这个阶段我已经筋疲力尽了所有的途径.唯一的其他选择可能是REST服务.任何建议都会非常有帮助.

非常感谢您的问候

biz*_*lop 8

可能最简单的解决方案是松散地遵循RMI的路径.

首先介绍一个接口和一个实现:

interface FooService  {
  Bar doThis( String param );
  String doThat( Bar param );
}

class FooServiceImpl implements FooService {
  ...
}
Run Code Online (Sandbox Code Playgroud)

您将接口部署到双方,并将实现部署到服务器端.

然后,要获取客户端对象,请创建动态代理.它的调用处理程序除了序列化服务类名,方法名和参数之外什么都不做,并将它发送到服务器(最初你可以使用,ObjectOutputStream但你可以使用替代的序列化技术,例如XStream).

服务器侦听器接受此请求并使用反射执行它,然后将响应发回.

实施相当容易,双方都是透明的,唯一的主要警告是您的服务实际上是单身人士.

如果需要,我可以包含一些更多的实现细节,但如果我必须实现类似的东西,这是我会遵循的一般想法.

话虽如此,我可能会搜索一下已经存在的解决方案,比如webservices或类似的东西.

更新:这是普通(本地)调用处理程序的功能.

class MyHandler implements InvocationHandler {

    private Object serviceObject;

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        return method.invoke(serviceObject, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

serviceObject您的服务实现对象在哪里包装到处理程序中.

这是你必须减少的一半,而不是调用方法,你需要将以下内容发送到服务器:

  1. 接口的全名(或唯一标识服务接口的其他值)
  2. 方法的名称.
  3. 方法所需的参数类型的名称.
  4. args阵列.

服务器端必须:

  1. 找到该接口的实现(最简单的方法是使用某种映射,其中键是接口名称,值是实现单例实例)
  2. 找到方法,使用 Class.getMethod( name, paramTypes );
  3. 通过调用执行该方法method.invoke(serviceObject, args);并返回返回值.