通过几段 Java 代码带你掌握 RPC

这整个过程可以用一句话概括:机器 A 通过网络与机器B建立连接,A 发送一些参数给 B,B 执行某个过程,并把结果返回给 A。

“在写代码之前,先说一个前置背景,假设我们有一个商品类:


  1. public class Product implements Serializable { 
  2.  
  3.     private Integer id; 
  4.     private String name; 
  5.  
  6.     public Product(Integer id, String name) { 
  7.         this.id = id; 
  8.         this.name = name; 
  9.     } 
  10.  
  11.     //toString() 
  12.      
  13.     //get set 方法 

有一个商品服务接口:


  1. public interface IProductService { 
  2.  
  3.     Product getProductById(Integer id); 

服务端有商品服务接口的实现类:


  1. public class ProductServiceImpl implements IProductService { 
  2.     @Override 
  3.     public Product getProductById(Integer id) { 
  4.         //实际上这里应该去查询数据库获得数据,下面简化了 
  5.         return new Product(id, "手机"); 
  6.     } 

下面我们通过客户端发送一个商品 id 到服务端,服务端获得 id 后通过商品服务类获取商品信息,返回给客户端:


  1. public class Client { 
  2.  
  3.     public static void main(String[] args) throws Exception { 
  4.         //建立Socket 
  5.         Socket socket = new Socket("127.0.0.1", 8888); 
  6.         //获取输出流 
  7.         ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
  8.         DataOutputStream dos = new DataOutputStream(baos); 
  9.         //把商品Id通过网络传到服务端 
  10.         dos.writeInt(123); 
  11.  
  12.         socket.getOutputStream().write(baos.toByteArray()); 
  13.         socket.getOutputStream().flush(); 
  14.  
  15.         //读取服务端返回的商品信息 
  16.         DataInputStream dis = new DataInputStream(socket.getInputStream()); 
  17.         Integer id = dis.readInt();     //商品id 
  18.         String name = dis.readUTF();    //商品名称 
  19.         Product product = new Product(id, name);//通过服务端返回的商品信息生成商品 
  20.  
  21.         System.out.println(product); 
  22.          
  23.         //关闭流资源为了方便阅读,没有做try-catch处理 
  24.         dos.close(); 
  25.         baos.close(); 
  26.         socket.close(); 
  27.     } 
  28.  
  29. public class Server { 
  30.     private static boolean running = true
  31.  
  32.     public static void main(String[] args) throws Exception { 
  33.         //建立服务端Socket 
  34.         ServerSocket ss = new ServerSocket(8888); 
  35.         //不断监听,处理客户端请求 
  36.         while (running) { 
  37.             Socket socket = ss.accept(); 
  38.             process(socket); 
  39.             socket.close(); 
  40.         } 
  41.         ss.close(); 
  42.     } 
  43.  
  44.     private static void process(Socket socket) throws Exception { 
  45.         InputStream is = socket.getInputStream(); 
  46.         OutputStream os = socket.getOutputStream(); 
  47.         DataInputStream dis = new DataInputStream(is); 
  48.         DataOutputStream dos = new DataOutputStream(os); 
  49.  
  50.         //读取客户端发过来的id 
  51.         Integer id = dis.readInt(); 
  52.         //调用服务类生成商品 
  53.         IProductService service = new ProductServiceImpl(); 
  54.         Product product = service.getProductById(id); 
  55.         //把商品的信息写回给客户端 
  56.         dos.writeInt(id); 
  57.         dos.writeUTF(product.getName()); 
  58.         dos.flush(); 
  59.  
  60.         dos.close(); 
  61.         dis.close(); 
  62.         os.close(); 
  63.         is.close(); 
  64.     } 
【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章