基于TCP的RPC调用
来源:互联网 发布:linux查看log日志命令 编辑:程序博客网 时间:2024/05/22 17:05
RPC即远程过程调用,被广泛使用,面向接口的编程。
consumer ———— provider
通过反射实现类的实例化
</pre></p><p>java代码如下:</p><p></p><p><h2>provider端</h2></p><p>接口类:<pre style="background-color:#c7edcc;color:#000000;font-family:'宋体';font-size:12.0pt;">SayHelloService
public interface SayHelloService { public String sayHello(String helloArg);}
接口实现类:SayHelloServiceImp
public class SayHelloServiceImp implements SayHelloService { public String sayHello(String helloArg) { if(helloArg.equals("good")){ return "good"; }else{ return "bad !!"; } }}
服务类:
ServerSocketTest
public class ServerSocketTest { private static ConcurrentHashMap<String,Object> services = new ConcurrentHashMap<String, Object>(10); static{ //类路径自己定义 services.put("com.jc.rpc.SayHelloService",new SayHelloServiceImp()); } public static void main(String[] args) { ServerSocket server = null; try { server = new ServerSocket(1234); while (true){ Socket socket = server.accept(); //读取服务信息 ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); String interfaceName = input.readUTF();//接口名称 String methodName = input.readUTF();//方法名称 Class<?>[] parameterTypes = (Class<?>[])input.readObject();//参数类型 Object[] arguments = (Object[])input.readObject();//参数对象 //执行调用 Class<?> serviceInterfaceClass = Class.forName(interfaceName); Object service = services.get(interfaceName);//取得服务实现的对象 Method method = serviceInterfaceClass.getMethod(methodName,parameterTypes); System.out.println("interface:"+interfaceName+",method:"+methodName+"arguments:"+ Arrays.toString(arguments)); Object result = method.invoke(service,arguments); ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); output.writeObject(result); } } catch (IOException e) { e.printStackTrace(); }catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } }}
consumer端
客户端调用类:
public class SocketCilent { public static void main(String[] args) throws NoSuchMethodException, IOException, ClassNotFoundException { //接口名称 String interfaceName = SayHelloService.class.getName(); //需要传递到远端的参数 Object[] arguments = {"1"}; //需要远程执行的方法 Method method = SayHelloService.class.getMethod("sayHello", String.class); Socket socket = new Socket("127.0.0.1",8888); ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); output.writeUTF(interfaceName); output.writeUTF(method.getName()); output.writeObject(method.getParameterTypes()); output.writeObject(arguments); //从远端读取执行结果 ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); Object result = input.readObject(); System.out.println(result); }}
该方式采用的是阻塞式IO实现,下一篇会采用NIO方式实现,并且加入动态代理。
0 0
- 基于TCP的RPC调用
- 基于TCP的RPC
- Java实现简单的RPC调用(基于TCP协议)
- 基于TCP协议的RPC
- 开发基于TCP的RPC服务
- 基于TCP的RPC简单实现
- 基于TCP实现的最简单RPC demo
- 基于TCP和HTTP协议的RPC简单实现
- 系统间通信:基于TCP协议的RPC实现范例
- 基于TCP和HTTP协议的RPC简单实现
- 系统间通信:基于TCP协议的RPC实现范例
- facebook的thriff 基于rpc的远程调用实现
- 基于XML-RPC的远程调用(Python,Java)
- 基于XML-RPC的远程调用(Python,Java)
- RabbitMQ学习之基于spring-rabbitmq的RPC远程调用
- RabbitMQ学习之基于spring-rabbitmq的RPC远程调用
- 基于openstack oslo_messaging的python rpc远程调用
- RabbitMQ学习之基于spring-rabbitmq的RPC远程调用
- 多态
- 从头到尾彻底理解KMP
- Java网络编程第二章-流
- 语句 数组 String类常用操作方法
- 欢迎使用CSDN-markdown编辑器
- 基于TCP的RPC调用
- 素数筛法算法(C#)
- REST笔记(二):有CRUD与URI的服务就是RESTful Service吗?
- 显示当月日历-Java实现
- 洛谷 P1417 烹调方案
- java.sql.SQLException: Parameter metadata not available for the given sta
- 第1章 对象导论
- std::size_t在Linux下是8字节,在Windows下是4字节
- C++面试题--string类的实现