RMI入门HelloWorld
java RMI(Remote Method Invocation)是一种基于java远程调用技术,是对RPC的java实现,可以在不同主机上进行通信与方法调用。PRC通信原理如图:
方法调用从客户对象经占位程序(Stub)、远程引用层(Remote Reference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传 输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。 占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。 远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。传输层管理实际的连接,并且追追踪可以接受方法调用的远程对象。服务器端的骨干网完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,占位程序获得返回值。
1 package com.corearchi.rmi.api; 2 3 import java.rmi.Remote; 4 import java.rmi.RemoteException; 5 6 /** 7 * 远程接口HelloService 8 * 9 * @author DonnieGao 10 * @create 2018-01-29 上午10:14 11 **/ 12 public interface HelloService extends Remote { 13 14 /** 15 * 远程接口方法sayHello 16 * 17 * @param somebody 某个人 18 * @return 返回调用接口结果 19 * @throws RemoteException 抛出RemoteException异常 20 */ 21 String sayHello(String somebody) throws RemoteException; 22 }
远程接口实现:
package com.corearchi.rmi.impl; import com.corearchi.rmi.api.HelloService; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; /** * 远程接口HelloService的实现 * * @author DonnieGao * @create 2018-01-29 上午10:18 **/ public class HelloServiceImpl extends UnicastRemoteObject implements HelloService{ /** 父类构造抛出异常,子类也需抛出异常 */ public HelloServiceImpl() throws RemoteException { } /** * 远程接口方法sayHello * * @param somebody 某个人 * @return 返回调用接口结果 * @throws RemoteException 抛出RemoteException异常 */ @Override public String sayHello(String somebody) throws RemoteException { return "hello" + somebody; } }
客户端Server实现:
1 package com.corearchi.rmi.server; 2 3 import com.corearchi.rmi.api.HelloService; 4 import com.corearchi.rmi.impl.HelloServiceImpl; 5 6 import java.net.MalformedURLException; 7 import java.rmi.AlreadyBoundException; 8 import java.rmi.Naming; 9 import java.rmi.RemoteException; 10 import java.rmi.registry.LocateRegistry; 11 12 /** 13 * 远程Rmi服务端 14 * 15 * @author DonnieGao 16 * @create 2018-01-29 上午10:25 17 **/ 18 public class HelloServer { 19 20 public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException { 21 // 创建远程服务接口 22 HelloService helloService = new HelloServiceImpl(); 23 24 // 注册服务 25 LocateRegistry.createRegistry(1234); 26 Naming.bind("rmi://localhost:1234/helloService",helloService); 27 28 System.out.println("HelloServer has started and provide RPC service at the same time"); 29 } 30 }
1 package com.corearchi.rmi.client; 2 3 import com.corearchi.rmi.api.HelloService; 4 5 import java.net.MalformedURLException; 6 import java.rmi.Naming; 7 import java.rmi.NotBoundException; 8 import java.rmi.RemoteException; 9 10 /** 11 * 远程连接的客户端 12 * 13 * @author DonnieGao 14 * @create 2018-01-29 上午10:29 15 **/ 16 public class HelloClient { 17 18 public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException { 19 // 引入远程服务 20 HelloService helloService = (HelloService) Naming.lookup("rmi://localhost:1234/helloService"); 21 22 // 调用远程方法 23 System.out.println("RMI服务器结果是 "+helloService.sayHello("Kitty")); 24 } 25 }
一个简单的RMI通信Demo就完成了,先运行Server,在运行Client。
作者:撩琼不止
出处:https://www.cnblogs.com/codegeekgao/
github:https://github.com/codegeekgao
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步