RMI的简单的应用
远程通信:不同的jvm之间进行通信,不同的虚拟机就是跨服务的通信。
RMI:jdk自带的远程通信的一个接口,java本身提供的远程通信框架,称不上rpc。RMI是依赖于jvm,不依赖于apache。
常见的rpc框架有:Dubbo,Thrift,WebService(WSDL)=>http+XML:而现在都替换成http+json的方式来进行通信了。
写一个RMI的实例:底层就是用的Socket来进行通信的,但是它不支持跨语言,基于JRMP协议的,rmi的性能很高的。
RMI是WebService的根基。
1、新建两个java工程,一个代表客户端,一个代表服务端:
2、在server端提供一个UserDao的接口,代码如下:
package dao;import java.rmi.RemoteException;/*** 接口里的方法必须抛RemoteException的异常*/public interface UserDao extends java.rmi.Remote {String addUser(String name) throws RemoteException;}
2.1、UserDao的实现类如下:
package dao;import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;//UnicastRemoteObject这个类用于RemoteImpl这个类发布出去做一个序列化的处理,继承这个类的话,会在主类的时候会开启一个线程public class UserDaoImpl extends UnicastRemoteObject implements UserDao {public UserDaoImpl() throws RemoteException {}@Overridepublic String addUser(String name) throws RemoteException {return "添加的用户名称为"+name;}}
2.2、server端的主类的代码如下:绑定的是接口,然后会生成一个代理,通过这个代理,然后和客户端的代理进行通信的去实现网络通信的操作。
package rmi;import dao.UserDao;import dao.UserDaoImpl;import java.net.MalformedURLException;import java.rmi.AlreadyBoundException;import java.rmi.Naming;import java.rmi.RemoteException;import java.rmi.registry.LocateRegistry;public class RmiServer {public static void main(String[] args) throws InterruptedException, RemoteException {//创建接口引用的实例UserDao remote=new UserDaoImpl();try {//注册要被客户端监听的端口LocateRegistry.createRegistry(8888);try {//rmi:是固定的写法Naming.bind("rmi://localhost:8888/user",remote);System.out.println("server starting...........");} catch (AlreadyBoundException e) {e.printStackTrace();} catch (MalformedURLException e) {e.printStackTrace();}} catch (RemoteException e) {e.printStackTrace();}}}
启动server端:
3、客户端的接口的代码和server端的接口是一样,因为需要把接口给暴漏出去,代码如下:
package dao;import java.rmi.RemoteException;/*** 接口里的方法必须抛RemoteException的异常*/public interface UserDao extends java.rmi.Remote {String addUser(String name) throws RemoteException;}
3.1、客户端的主类的代码如下Naming是命,lookup寻找地址是否存在。
package rmi.client;import dao.UserDao;import java.net.MalformedURLException;import java.rmi.Naming;import java.rmi.NotBoundException;import java.rmi.RemoteException;public class RmiClient {public static void main(String[] args) {try {UserDao userDao = (UserDao)Naming.lookup("rmi://localhost:8888/user");System.out.println(userDao.addUser("weizhaoyang"));} catch (NotBoundException e) {e.printStackTrace();} catch (MalformedURLException e) {e.printStackTrace();} catch (RemoteException e) {e.printStackTrace();}}}
启动客户端:
注意:如下,服务端的接口和客户端的接口的路径必须一样,否则也会报错。
因为需要 代理是实现类应该是一样的。
未完待续!!如果哪里写的有问题,请指出。xxxxxxxxxxxxxxxxxxx谢谢。