RMI(remote method invoke)是Java实现透明远程调用的机制,客户端仅持有服务端的接口。RMI应用的两种写法:
[b]1、利用UnicastRemoteObject.exportObject()[/b]
server端:
client端:
[b]2、Remote对象继承UnicastRemoteObject[/b]
第一种方式不需要生成服务器端remote对象存根(stub),但编码有些多。还可以通过继承UnicastRemoteObject的方式,利用Naming.bind()简化代码,但这种方式需要rmic生成remote实现类的存根。
服务端:
客户端:
然后的步骤:
1)生成remote实现类的存根
rmic xx.xx.BusinessImpl
2)启动rmi注册表
windows下:start rmiregistry
linux下:rmiregistry
3)启动服务端
java xx.xx.Server
4)启动客户端请求
java xx.xx.Client
第2种方式其实更加不方便(需要手动生成存根、启动rmiregistry)
下一篇介绍利用Spring更方便的将普通的Service暴露为Remote服务。
[b]1、利用UnicastRemoteObject.exportObject()[/b]
server端:
public interface Business extends Remote {
public void call(String str) throws RemoteException;
}
public class BusinessImpl implements Business{//服务类实现Remote接口
public void call(String str) throws RemoteException{
System.out.println("client send:"+str);
}
}
public class Server {
public static void main(String[] args) throws Exception{
String name="business";
Business bus=new BusinessImpl();
Registry reg=LocateRegistry.createRegistry(1099);//在rmi默认端口创建rmi注册表
reg.bind(name, bus);//将remote对象绑定到rmi注册表
UnicastRemoteObject.exportObject(bus);//将remote对象暴露到匿名端口
}
}
client端:
public class Client {
public static void main(String[] args) throws Exception{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
Registry reg=LocateRegistry.getRegistry("192.168.1.110",1099);//获得指定主机的rmi注册表引用
String name="business";
Business bus=(Business)reg.lookup(name);//查找remote对象
String line;
while(!"bye".equals(line=in.readLine())){
bus.call(line);
}
in.close();
}
}
[b]2、Remote对象继承UnicastRemoteObject[/b]
第一种方式不需要生成服务器端remote对象存根(stub),但编码有些多。还可以通过继承UnicastRemoteObject的方式,利用Naming.bind()简化代码,但这种方式需要rmic生成remote实现类的存根。
//Business接口不变
...
//remote实现类继承UnicastRemoteObject
public class BusinessImpl extends UnicastRemoteObject implements Business{
public void call(String str) throws RemoteException{
System.out.println("client send:"+str);
}
}
服务端:
public class Server {
public static void main(String[] args) throws Exception{
String name="rmi://192.168.1.110:1099/business";
Business bus=new BusinessImpl();
Naming.bind(name, bus);
}
}
客户端:
public class Client {
public static void main(String[] args) throws Exception{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String name="rmi://192.168.1.110:1099/business";
Business bus=(Business)Naming.lookup(name);
String line;
while(!"bye".equals(line=in.readLine())){
bus.call(line);
}
in.close();
}
}
然后的步骤:
1)生成remote实现类的存根
rmic xx.xx.BusinessImpl
2)启动rmi注册表
windows下:start rmiregistry
linux下:rmiregistry
3)启动服务端
java xx.xx.Server
4)启动客户端请求
java xx.xx.Client
第2种方式其实更加不方便(需要手动生成存根、启动rmiregistry)
下一篇介绍利用Spring更方便的将普通的Service暴露为Remote服务。