我一直在询问有关调整命令协议以在我的客户端服务器环境中使用的一些问题。然而,经过一些实验,我得出的结论是它对我不起作用。它不是为这种情况设计的。因此,我处于一个松散的结局。
我之前实现了一种RPC机制,之后我有了一个名为“Operation”的类。我还有一个名为“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服务。任何建议都会非常有帮助。
非常感谢你 此致
答案 0 :(得分:8)
可能最简单的解决方案是松散地遵循RMI的路径。
您从界面和实现开始:
interface FooService {
Bar doThis( String param );
String doThat( Bar param );
}
class FooServiceImpl implements FooService {
...
}
您将接口部署到双方,并将实施部署到服务器端。
然后,要获取客户端对象,请创建动态代理。它的调用处理程序除了序列化服务类名,方法名和参数之外什么都不做,并将它发送到服务器(最初你可以使用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);
}
}
其中serviceObject
是包含在处理程序中的服务实现对象。
这是你必须减少的一半,而不是调用方法,你需要将以下内容发送到服务器:
args
数组。服务器端必须:
Class.getMethod( name, paramTypes );
method.invoke(serviceObject, args);
执行该方法并返回返回值。答案 1 :(得分:2)
您应该从谷歌查看协议缓冲区:http://code.google.com/p/protobuf/
该库定义了一个IDL,用于生成类似于类的结构,可以从流/字节数组/等中读取和读取。它们还使用定义的消息定义RPC机制。
我已经将这个库用于类似的问题而且效果非常好。
答案 2 :(得分:0)
RMI是要走的路。
Java RMI是一个Java应用程序 执行的编程接口 面向对象的等价物 远程过程调用(RPC)。