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 {
}
@Override
public 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谢谢。