java_rmi初试验
最近不知道咋的,学习精神很佳,学习了一下java_rmi,学的不是很深,自己动手写了小程序,
实现的功能 是在本机 编写rmi服务端 和客户端 ,然后运行,看看运行效果
rmi:远程调用方法,rmi本质上也是sock通信哦,这个看jdk源码就知道
实现rmi,分下面几步
rmi接口,要extends jdk中的 Remote 接口,extends 接口Remote的类就是远程的服务接口,
对远程服务接口的实现 ,就是我们调的远程服务接口了哦,但是 要extends UnicastRemoteObject 类,为什么呢你,看jdk源码知道,UnicastRemoteObject 类帮我们实现了Remote需要的一些机制,
看服务端的代码:
继承远程接口:
public interface ServiceRmi extends Remote{
public String getName() throws RemoteException;
public Object getObject() throws RemoteException;
}
public String getName() throws RemoteException;
public Object getObject() throws RemoteException;
}
对远程接口的实现:
public class ServiceRmiImpl extends UnicastRemoteObject implements ServiceRmi {
int i=0;
int j=0;
public ServiceRmiImpl() throws RemoteException
{
}
/**
* @Function: ServiceRmiImpl.java
* @Description: 该函数的功能描述
*
* @return
* @throws RemoteException
* @return:返回结果描述
* @throws:异常描述
*
* @version: v1.0.0
* @author: 浪子
* @date: 2011-8-19 下午04:56:52
*
* Modification History:
* Date Author Version Description
*---------------------------------------------------------*
* 2011-8-19 浪子 v1.0.0 修改原因
*/
public String getName() throws RemoteException {
System.out.print("call this getName");
i=i+1;
System.out.print("call this getName="+i);
return "testName";
}
/**
* @Function: ServiceRmiImpl.java
* @Description: 该函数的功能描述
*
* @return
* @throws RemoteException
* @return:返回结果描述
* @throws:异常描述
*
* @version: v1.0.0
* @author: 浪子
* @date: 2011-8-19 下午04:56:52
*
* Modification History:
* Date Author Version Description
*---------------------------------------------------------*
* 2011-8-19 浪子 v1.0.0 修改原因
*/
public Object getObject() throws RemoteException {
Object o=new Object();
return o;
}
* @Function: ServiceRmiImpl.java
* @Description: 该函数的功能描述
*
* @return
* @throws RemoteException
* @return:返回结果描述
* @throws:异常描述
*
* @version: v1.0.0
* @author: 浪子
* @date: 2011-8-19 下午04:56:52
*
* Modification History:
* Date Author Version Description
*---------------------------------------------------------*
* 2011-8-19 浪子 v1.0.0 修改原因
*/
public Object getObject() throws RemoteException {
Object o=new Object();
return o;
}
服务端启动:
public class Service {
public static void main(String []args) throws RemoteException,Exception
{
public static void main(String []args) throws RemoteException,Exception
{
//下面这个是 注册1099,不然还要生成stub,等2个文件,要用的jdk自带的 rmic命令生成,但是我试验没成功
stub,就像两个proxy文件,客户端从是和stub文件通信,再调服务端
stub,就像两个proxy文件,客户端从是和stub文件通信,再调服务端
LocateRegistry.createRegistry(1099);
ServiceRmi service=new ServiceRmiImpl();
ServiceRmi service=new ServiceRmiImpl();
下面这个是用的jdk中的Naming,绑定url,和Remote对象
url: 是IP地址加上端口号加上服务名 ,默认的端口是1099
Naming.rebind("//127.0.0.1/service", service);
}
}
}
客户端调用:
public class ClientRmi {
public static void main(String []args) throws Exception
{
String name="//127.0.0.1:1099/service";
//服务端注册了name,在客户端查出来
ServiceRmi service=(ServiceRmi)Naming.lookup(name);
System.out.println(service.getName());
}
}
public static void main(String []args) throws Exception
{
String name="//127.0.0.1:1099/service";
//服务端注册了name,在客户端查出来
ServiceRmi service=(ServiceRmi)Naming.lookup(name);
System.out.println(service.getName());
}
}
就这样实现了远程调用,从代码反应来看,客户端调用,就像是在本地调用一样,
但是rmi 只能和java进行通信,比如1个平台是 C++写的,就有力不从心了哦,那就只能用webService,或者cobar ,