`
ch_space
  • 浏览: 112773 次
  • 性别: Icon_minigender_1
  • 来自: 农村进城务工人员
社区版块
存档分类
最新评论

Java RMI

    博客分类:
  • Java
阅读更多
RMI(remote method invoke)是Java实现透明远程调用的机制,客户端仅持有服务端的接口。RMI应用的两种写法:

1、利用UnicastRemoteObject.exportObject()

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();
	}
}


2、Remote对象继承UnicastRemoteObject

第一种方式不需要生成服务器端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服务。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics