RPC远程过程调用之 RMI实现
1)RMI(remote method invocation)是java原生支持的遠(yuǎn)程調(diào)用,RMI采用JRMP(java RemoteMessageing Protocol)作為通信協(xié)議。可以認(rèn)為是純java版本的分布式遠(yuǎn)程調(diào)用解決方法。
2)RMI的核心概念
3)RMI實(shí)現(xiàn)步驟
1、創(chuàng)建遠(yuǎn)程接口,并繼承java.rmi.Remote接口
2、實(shí)現(xiàn)遠(yuǎn)程接口,并繼承:UnicastRemoteObject
3、創(chuàng)建服務(wù)器程序,createRegistry() 方法注冊遠(yuǎn)程對象
4、創(chuàng)建客戶端程序,(獲取注冊信息,調(diào)用接口方法)
RMI_SERVER
?
RMI_CLIENT
package com.itheima.service;import java.rmi.Remote; import java.rmi.RemoteException;public interface UserService extends Remote {String sayHello(String name) throws RemoteException; } package com.itheima.client;import com.itheima.service.UserService;import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException;public class ClientMain {public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {UserService userService = (UserService) Naming.lookup("rmi://127.0.0.1:8888/UserServer");String s = userService.sayHello("客戶端");System.out.println(s);} }注意:
client中Naming.lookup需要強(qiáng)轉(zhuǎn)成UserService? 此時的package路徑要與server中的Userserver中的路徑一致:
否則出現(xiàn)報錯:
"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" "-javaagent:D:\ruanjian\ideaiu14\ideaiu14\idea\IntelliJ IDEA 2020.1\lib\idea_rt.jar=63728:D:\ruanjian\ideaiu14\ideaiu14\idea\IntelliJ IDEA 2020.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;F:\RPC\RMI\rmi_client\target\classes" com.itheima.client.ClientMain Exception in thread "main" java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.lang.ClassNotFoundException: com.itheima.service.UserService (no security manager: RMI class loader disabled)at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)at java.rmi.Naming.lookup(Naming.java:101)at com.itheima.client.ClientMain.main(ClientMain.java:12) Caused by: java.lang.ClassNotFoundException: com.itheima.service.UserService (no security manager: RMI class loader disabled)at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:556)at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:646)at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:311)at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:265)at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1758)at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1710)at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2000)at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)... 3 moreProcess finished with exit code 1運(yùn)行結(jié)果:
需要先啟動服端:
服務(wù)端啟動中………………
客戶端結(jié)果:
客戶端調(diào)用了服務(wù)端的sayHello方法
?說明:在兩個項(xiàng)目中,客戶端成功的調(diào)用了服務(wù)器的sayHello()方法
總結(jié)
以上是生活随笔為你收集整理的RPC远程过程调用之 RMI实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis非阻塞I/O多路复用机制
- 下一篇: RPC远程过程调用之Hessian 基于