分布式通信框架RMI
1.什么是rpc?
Remote Procedure call protocal
prc协议其实是一个规范,Dubbo,Thrif,RMI,WebService,Hessain
网络协议和网络io对于调用者和服务来说是透明的
一个rpc应该包含的要素
RMI的概述:
RMI(remote method invocation)可以认为是java的rpc版本
RMI使用的是JRMP(Java Remote Method Protocal),JRMP是专门为java定制的通信协议,所以是纯java的分布式解决方案。
如何实现一个RMI程序
1 创建远程接口,并且继承 java.rmi.Remote 接口
public interface IsSayHello extends Remote{
public String sayHllo(String name) throws RemoteException;
}
2 实现远程接口,并且继承 UnicastRemoteObject 接口
public class SayHelloImpl extends UnicastRemoteObject implements IsSayHello{
public SayHelloImpl() throws RemoteException {
}
@Override
public String sayHllo(String name) throws RemoteException {
return "小明———》"+name;
}
}
3 创建服务器程序:createRegistry方法注册远程对象
public class HelloServer {
public static void main(String[] args){
try {
try {
IsSayHello sayHello = new SayHelloImpl();
LocateRegistry.createRegistry(8888);
Naming.bind("rmi://localhost:8888/sayhello",sayHello);
System.out.println("server start success");
} catch (AlreadyBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
4 创建客户端程序
public class HelloClient {
public static void main(String[] args){
try {
IsSayHello hello = (IsSayHello)Naming.lookup("rmi://localhost:8888/sayhello");
System.out.println(hello.sayHllo("hello 菲菲"));
} catch (NotBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
如果自已要实现一个RMI
1 编写服务器程序,暴露一个监听,可以用socket
2 编写客户端程序,通过ip和端口连接指定的服务器,并且将数据做封装(序列化)
3 服务端收到请求,先反序列化,在进行业务逻辑处理,把处理结果序列化返回。