手机
当前位置:查字典教程网 >编程开发 >JSP教程 >RMI使用学习 小结
RMI使用学习 小结
摘要:四年前也是Java的fans,也曾如火如荼的追求着sun,追求着java.当然RMI肯定不会放过,但到目前为止还没有在任何一个项目中用过,昨...

四年前也是Java的fans,也曾如火如荼的追求着sun,追求着java.当然RMI肯定不会放过,但到目前为止还没有在任何一个项目中用过,昨天听了一个java老师的课,本来不去想听,可想想我交了这么多money,最后还是去。最叫人恶心的是他讲的RMI一点实用价值都没有,而且有的理论也不对。真的误导人啊,学术理论和实践是不能够分离的,老师是这样的,只能靠学生自己动手丰衣足食了。昨天晚上用了一点时间,从新研究了一下RMI。举个例子作为RMI学习的终结吧。

在写这篇文章前也访问了中国电信的高级工程师,根据他的介绍,RMI有很多实现方式,而且现在他发现RMI在大规模分布式系统中,效率和性能不是很好。目前他带领的团队正在自行开发分布式应用。

随着web2.0时代的到来,SOA开发思想的普及应用。分布式应用,将又一次走向高潮。

RMI开发步骤大家都很清楚,这里举个不用手动启动rmiRegistry,也不要指定codebase和webserver的例子.底层TCP/IP细节我们不用去管他,你就把他看成像SOAP、JNDI等一样的基于注册服务的东西就行了.

1.远程接口

importjava.rmi.Remote;

importjava.rmi.RemoteException;

publicinterfaceIRMIextendsRemote{

publicObjectinvoke(ITasktask)throwsRemoteException;

}

2.远程接口实现

/**

*@authorJack.Wang

*

*/

importjava.rmi.RemoteException;

importjava.rmi.server.UnicastRemoteObject;

publicclassIRMIImplextendsUnicastRemoteObjectimplementsIRMI{

protectedIRMIImpl()throwsRemoteException{

super();

}

publicObjectinvoke(ITasktask)throwsRemoteException{

System.out.println("注意:这是一个远程调用");

Objectobj=task.doWork();

System.out.println("调用ITask.doWork()方法的返回值:"+obj.toString());

//客户端调用,可以在服务器端播放需要的音乐

ProcessCaller.callMp3();

returnobj;

}

}

3.任务接口

/**

*@authorJack.Wang

*

*/

importjava.io.Serializable;

publicinterfaceITaskextendsSerializable{

publicObjectdoWork();

}

4.任务实现类

/**

*@authorJack.Wang

*

*/

publicclassTaskImplimplementsITask{

publicObjectdoWork(){

System.out.println("当前程序处于远程调用中");

returnThread.currentThread().getName()+""

+newDate(System.currentTimeMillis());

}

}

5.在java中调用windows程序

publicclassProcessCaller{

publicstaticvoidcallMp3(){

Runtimeru=Runtime.getRuntime();

try{

//调用播放器文件播放指定MP3

Processp1=ru

.exec("C:ProgramFilesWindowsMediaPlayerwmplayerD:JackMp35.秋天不回来-王强.mp3");

}catch(Exceptione){

}

}

}

6.Server端代码

/**

*@authorJack.Wang

*

*/

importjava.rmi.Naming;

importjava.rmi.registry.LocateRegistry;

importjava.rmi.registry.Registry;

publicclassRMIServer{

publicstaticvoidregistRemoteObject()throwsException{

IRMIImplimpl=newIRMIImpl();

Naming.rebind("rmi://210.43.109.25:1111/mytask",impl);

System.out.println("boundsuccess!");

}

privatestaticRegistrycreateRegistry(){

Registryregistry=null;

intport=1111;

try{

registry=LocateRegistry.getRegistry("210.43.109.25",port);

registry.list();

System.out.println("Registertheexistserver!");

}catch(finalExceptione){

try{

registry=LocateRegistry.createRegistry(port);

System.out.println("Registertheexistserver!port="+port);

}catch(finalExceptionee){

ee.printStackTrace();

}

}

returnregistry;

}

/**

*将对象注册到rmi服务器上

*/

publicstaticvoidbind(){

Registryregistry=null;

registry=createRegistry();

try{

IRMIImplimpl=newIRMIImpl();

registry.rebind("mytask",impl);

System.out.println("mytaskserverstart!");

}catch(Exceptione){

e.printStackTrace();

}

}

/**

*@paramargs

*/

publicstaticvoidmain(String[]args){

try{

bind();

}catch(Exceptione){

e.printStackTrace();

}

}

}

7.Client端代码

/**

*@authorJack.Wang

*

*/

publicclassRMIClient{

publicstaticvoidgetRemoteObject()throwsException{

IRMIobj=(IRMI)Naming.lookup("rmi://210.43.109.28:1111/mytask");//得到远程发布的服务

TaskImpltask=newTaskImpl();

Objectresult=obj.invoke(task);//调用远程服务的方法

System.out.println(result.toString());

}

publicstaticvoidmain(String[]args){

try{

getRemoteObject();

}catch(Exceptione){

e.printStackTrace();

}

}

}

小结:

建议把以上程序打包成jar文件,你可以在不同机子间测试。

RMI就这么简单,如果你觉得他不爽,就自己封装socket.到时候要通知我哦,我也学习学习。

【RMI使用学习 小结】相关文章:

Java学习的捷径

JSP学习之数据库开发小结

使用异步Servlet扩展AJAX应用程序

jsp中使用javabean实例介绍

用js绘图

JSP学习心得

使用JSP/Servlet上载文件

如何使用JSP来发送邮件

jsp中调用java代码小结

使用JSP开发WebMail系统

精品推荐
分类导航