转载

JDK RMI

什么是RMI

RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。

RMI远程调用步骤:

  1.  客户对象调用客户端辅助对象上的方法 
  2. 客户端辅助对象打包调用信息(变量,方法名),通过网络发送给服务端辅助对象  
  3. 服务端辅助对象将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象
  4.  调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象 
  5. 服务端辅助对象将结果打包,发送给客户端辅助对象  
  6. 客户端辅助对象将返回值解包,返回给客户对象 
  7.  客户对象获得返回值 
对于客户对象来说,步骤2-6是完全透明的 

JDK RMI

需要注意的是 调用的类和接口类要一致 在相同的目录下

服务端代码

接口代码

package com.boolib.rmi.server;
import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.RemoteException;
/** * 功能描述:* * @author NIER * @description * @since 2019/8/15 11:06 */
public interface UserService extends Remote, Serializable {  
  String hello(String name) throws RemoteException;
}复制代码

实现代码

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/** * 功能描述: * * @author NIER * @description * @since 2019/8/15 11:06 */

public class UserServiceImpl extends UnicastRemoteObject implements UserService {  
    protected UserServiceImpl() throws RemoteException {        
            super();  
    }  
  
    @Override    
    public String hello(String name) throws RemoteException {        return "nihao";    }
}复制代码

启动代码

package com.boolib.rmi.server;
import com.boolib.rpc.util.IpUtil;
import javax.naming.NamingException;
import java.net.*;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.util.Enumeration;
/** * 功能描述: * * @author NIER * @description * @since 2019/8/15 11:45 */
public class Server {    
        public static void main(String[] args) {     
               try {            
                        UserService service = new UserServiceImpl();   
                        LocateRegistry.createRegistry(8888);   
                        Naming.bind("rmi://localhost:8888/service", service);            
                        System.out.println(">>>>>INFO:远程IHello对象绑定成功!");        
                    } 
                catch (RemoteException e) {  
                          System.out.println("创建远程对象发生异常!");     
                          e.printStackTrace();       
                } catch (AlreadyBoundException e) {
                    System.out.println("发生重复绑定对象异常!"); 
                    e.printStackTrace();        
                } catch (MalformedURLException e) {            
                     System.out.println("发生URL畸形异常!");           
                     e.printStackTrace();       
                }   
 }
}复制代码

客户端代码

接口代码 与上面的一直

package com.boolib.rmi.server;
import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.RemoteException;
/** * 功能描述: * * @author NIER * @description * @since 2019/8/15 11:06 */
public interface UserService extends Remote, Serializable 
{   
 String hello(String name) throws RemoteException;
}复制代码

启动代码

package com.boolib.rmi.client;
import com.boolib.rmi.server.UserService;
import com.boolib.rpc.util.IpUtil;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
/** * 功能描述: * * @author NIER * @description * @since 2019/8/15 12:12 */

public class Client {    
      public static void main(String args[]) { 
          try {            
                    UserService userService = (UserService) Naming.lookup("rmi://" + IpUtil.getIP() + ":8888/service");
                    System.out.println(userService.hello("1"));        
            } catch (NotBoundException e) {            
                System.out.println("ni");        
            } catch (MalformedURLException e) {            
                e.printStackTrace();        
            } catch (RemoteException e) {            
                e.printStackTrace();       
             }    
        }
}复制代码

还有试验了一下直接new一个接口自己实现这种会导致server 直接运行  完毕后停止进程

原文  https://juejin.im/post/5d54d06451882508b528f839
正文到此结束
Loading...