用java实现基于Tcp协议系统间的简单RPC调用
Posted 村头卖假发的小郑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用java实现基于Tcp协议系统间的简单RPC调用相关的知识,希望对你有一定的参考价值。
1、第一步:用idea创建一个简单的demo
2、第二步:创建相应的包和类
(1)Server类实现:
package com.ctgu_zyj.rpc;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(1234);
Map<Object,Object> services = new HashMap<Object,Object>();
services.put(SayHelloService.class, new SayHelloServiceImpl());
while(true){
System.out.println("服务提供者启动,等待客户端调用…………");
Socket socket = serverSocket.accept();
//收到消息后进行解码
ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream());
String interfaceName = objectInputStream.readUTF();
String methodName = objectInputStream.readUTF();
Class<?>[] paramterTypes = (Class<?>[])objectInputStream.readObject();
Object[] argments = (Object[])objectInputStream.readObject();
System.out.println("客户端调用服务端接口"+interfaceName+"的"+ methodName+"方法");
//根据解码结果调用本地的服务
Class serviceClass = Class.forName(interfaceName);
Object serivce = services.get(serviceClass);
Method method = serviceClass.getMethod(methodName, paramterTypes);
Object result = method.invoke(serivce, argments);
//服务提供者发送result给服务调用者
ObjectOutputStream stream = new ObjectOutputStream(socket.getOutputStream());
stream.writeObject(result);
System.out.println("服务端返回结果为"+result);
}
}
}
(2)Server类的服务类的接口类SayHelloService类:
package com.ctgu_zyj.rpc;
public interface SayHelloService {
public String sayHello(String msg);
}
(3)接口实现类SayHelloServiceImpl:
package com.ctgu_zyj.rpc;
public class SayHelloServiceImpl implements SayHelloService {
@Override
public String sayHello(String msg) {
if("hello".equals(msg)){
return "hello client";
}else{
return "bye bye";
}
}
}
(4)创建用户类Consumer:
package com.ctgu_zyj.rpc;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.Socket;
public class Consumer {
public static void main(String[] args) throws Exception {
//构造需要调用的方法
String interfaceName = SayHelloService.class.getName();
Method method = SayHelloService.class.getMethod("sayHello",
java.lang.String.class);
Object[] argments = {"hello"};
//发送调用信息到服务器端,调用相应的服务
Socket socket = new Socket("127.0.0.1",1234);
ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
outputStream.writeUTF(interfaceName);
outputStream.writeUTF(method.getName());
outputStream.writeObject(method.getParameterTypes());
outputStream.writeObject(argments);
System.out.println("发送信息到服务端,发送的信息为:"+argments[0]);
//服务返回的结果
ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
Object object = inputStream.readObject();
System.out.println("服务返回的结果为"+object);
}
}
3、第三步:准备运行项目
4、第四步:总结
简单来讲整个过程就是,Server服务提供端运行,将服务实例化后放在Services的Map当中,然后通过一个while循环不断地接受到来地请求,得到接受到地参数,然后再通过Java地反射取得服务接口所需要调用地方法,执行后再将结果返回给服务地消费者。
以上是关于用java实现基于Tcp协议系统间的简单RPC调用的主要内容,如果未能解决你的问题,请参考以下文章