用java实现基于Tcp协议系统间的简单RPC调用

    科技2022-09-07  104

    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地反射取得服务接口所需要调用地方法,执行后再将结果返回给服务地消费者。

    Processed: 0.012, SQL: 9