1. 什么是RPC
RPC(Remote Procedure Call)即远程过程调用,指的是不同机器间系统方法的调用,这和
同机器动态链接库(DLL)有点类似,只不过RPC是不同机器,通过网络通信来访问远程的资源。
2. Java RMI技术
RMI(Remote Method Invocation)即远程方法调用,是Java原生的RPC技术。
* 使用了原生的序列化机制(序列化对象实现java.io.Serializable接口)
* 底层通信基于BIO(Block IO)实现的Socket来完成
* 性能较差
例子:
2-1) 首先,定义远程对外服务接口
//必须继承Remote接口
public interface HelloService extendsRemote {
String sayHello(String someOne)throwsRemoteException;
}
2-2) 远程接口的实现
//UnicastRemoteObject定义了服务调用方与提供方对象实例,并建立一对一连接
public class HelloServiceImpl extends UnicastRemoteObject implementsHelloService {protected HelloServiceImpl() throwsRemoteException {super();
}
@Overridepublic String sayHello(String someOne) throwsRemoteException {return "hello," +someOne;
}
}
2-3) 服务端远程服务启动
//创建和注册服务
public classServiceMain {public static void main(String[] args) throwsException {
LocateRegistry.createRegistry(8801);//指定通讯端口,防止被防火墙拦截
RMISocketFactory.setSocketFactory(newCustomerSocketFactory());
HelloService helloService= newHelloServiceImpl();
Naming.bind("rmi://localhost:8801/helloService", helloService);
System.out.println("ServiceMain provide RPC service now.");
}
}
public class CustomerSocketFactory extendsRMISocketFactory {
@Overridepublic Socket createSocket(String host, int port) throwsIOException {return newSocket(host, port);
}
@Overridepublic ServerSocket createServerSocket(int port) throwsIOException {if (port == 0) {
port= 8501;
}
System.out.println("rmi notify port:" +port);return newServerSocket(port);
}
}
2-4) 客户端调用RMI服务
public classClientMain {public static void main(String[] args) throwsException {//服务引入
HelloService helloService = (HelloService) Naming.lookup("rmi://localhost:8801/helloService");//调用远程方法
System.out.println("RMI服务器返回的结果是 " + helloService.sayHello("Master HaKu"));
}
}
程序运行结果:
RMI服务器返回的结果是 hello,Master HaKu