RMI
1、概述
1.1 RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上;
1.2 RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本;
传统RPC并不能很好地应用于分布式对象系统;
Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用;
2、实例
===========Server
package com.an.rmi.server; import java.rmi.Remote; import java.rmi.RemoteException; /** * RMI要求服务器端的接口继承Remote接口, * 接口上的每种方法必须显式抛出RemoteException */ public interface Business extends Remote { String echo(String message)throws RemoteException; }
package com.an.rmi.server; import java.rmi.RemoteException; /** * 服务器端业务类通过实现服务器端接口提供业务功能 */ public class BusinessImpl implements Business { public String echo(String message) throws RemoteException { if ("quit".equalsIgnoreCase(message.toString())){ System.out.println("Server will be shutdown"); System.exit(0); } System.out.println("Message from client:"+message); return "Server response:"+message; } }
package com.an.rmi.server; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; /** * jdk1.6之前的RMI实现基于TCP/IP+BIO的方式 * * RMI服务器端通过启动RMI注册对象在一个端口上监听对外提供的接口, * 该接口的实现实例通过字符串的方式绑定到RMI注册对象上 * * RMI客户端通过proxy方式代理了对服务器端接口的访问 * * RMI客户端将要访问的 服务器端的对象字符串、方法、参数 封装成一个对象, * 序列化成流后通过TCP/IP+BIO传输到RMI服务器端 * * 服务器端接收到客户端的请求对象后,解析其中的对象字符串、方法、参数, * * 通过对象字符串 从RMI注册对象上找到提供业务功能的实例 * * 结合要访问的方法来反射获取到方法的实例对象,传入参数完成对服务器对象实例的调用 * * 返回的结果则序列化为流以TCP/IP+BIO方式返回给客户端 * * 客户端接收到此流后反序列化成对象,给调用者使用 * * **************************使用***************************** * * 调用UnicastRemoteObject.exportObject将实现服务器端接口对象绑定到某端口上 * * 将此对象注册到本地的LocateRegister上,此时形成一个字符串对应于对象实例的映射关系 */ public class Server { public static void main(String[] args)throws Exception{ int port=9527; String name="Business Demo"; Business business=new BusinessImpl(); UnicastRemoteObject.exportObject(business,port); Registry registry =LocateRegistry.createRegistry(1099); registry.rebind(name,business); } }
==================Client
package com.an.rmi.client; import com.an.rmi.server.Business; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; /** ****************使用***************** * * RMI客户端通过LocateRegistry.getRegistry来获取Registry对象 * * 通过registry.lookup字符串获取要调用的服务器端接口的实例对象 */ public class Client { public static void main(String[] args)throws Exception{ Registry registry =LocateRegistry.getRegistry("127.0.0.1"); String name="Business Demo"; Business business =(Business) registry.lookup(name); business.echo("hello111"); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)