SayHelloService接口
java
public interface SayHelloService { public String sayHello(String arg); }
SayHelloServiceImpl實現類網絡
public class SayHelloServiceImpl implements SayHelloService{ @Override public String sayHello(String arg) { return "Hello " + arg; } }
服務端 生產者併發
public class Provider { public static void main(String[] args) { try { ServerSocket server= new ServerSocket(10808); while (true) { Socket socket = server.accept(); //讀取服務信息 ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream()); String interfaceName = inputStream.readUTF();//接口名稱 String methodName = inputStream.readUTF();//方法名稱 Class<?>[] parameterTypes = (Class<?>[]) inputStream.readObject();//參數類型 Object[] parameters = (Object[]) inputStream.readObject();//參數對象 Class serviceInterfaceClass = Class.forName(interfaceName); // Object service = services.get(interfaceName); //服務端將事先實例化好的服務放在services這個Map中,經過interfaceName取出使用 Object service = new SayHelloServiceImpl();//演示代碼直接new了一個對象來使用 //獲取要調用的方法 Method method = serviceInterfaceClass.getMethod(methodName, parameterTypes); Object result = method.invoke(service, parameters); ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream()); //將執行結果返回給調用端 outputStream.writeObject(result); System.out.println("Parameters from comsumer: " + parameters); } } catch (Exception e) { e.printStackTrace(); }finally { //關閉資源... } } }
調用端 消費者socket
public class Consumer { public static void main(String[] args) { //接口名稱 String interfaceName = SayHelloService.class.getName(); try { //須要執行的遠程方法 Method method = SayHelloService.class.getMethod("sayHello", java.lang.String.class); //須要傳遞到遠程端的參數 Object[] agrs = {"world"}; Socket socket = new Socket("127.0.0.1", 10808); //將方法名稱和參數傳遞到遠端 ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream()); outputStream.writeUTF(interfaceName);//接口名稱 outputStream.writeUTF(method.getName());//方法名稱 outputStream.writeObject(method.getParameterTypes()); outputStream.writeObject(agrs); //從遠端讀取方法的執行結果 ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream()); Object result = inputStream.readObject(); System.out.println("Consumer result:" + result); } catch (Exception e) { e.printStackTrace(); }finally{ //關閉資源... } } }
基於TCP協議實現的RPC,能靈活地對協議字段進行定製,減小網絡傳輸字節數,下降網絡開銷,提升性能,實現更大的吞吐量和併發數。可是須要更多地關注底層複雜的細節,實現的代價更高,且因爲所定義協議自身的侷限性,難以獲得平臺廠商和開源社區的支持,較難實現跨平臺的調用。
ide