用RMI和CORBA开发JAVA分布式程序(二)
2008-04-26 01:46
471 查看
CORBA
CORBA应用起步
定义接口
定义接口的时候,我们需要考虑服务器支持的操作类型。在文件传输应用里,需要用到一个下载文件的方法。例5有了这个接口FileInterface。客户端将调用这个方法下载文件。IDL里的sequence和数组比较接近,但它不是个固定的长度。注意方法downloadFile的String参数类型有三种传输模式:in(从客户端到服务器),out(从服务器端到客户端),inout(双向)CodeSample5:FileInterface.idlinterfaceFileInterface{
typedefsequence<octet>Data;
DatadownloadFile(instringfileName);
};接口定义完成后,你可以用JDK1。3带的IDLJ编译器编译生成
-fserver,-fclient
生成服务器端,客户端
JAVA
代码。下面我们编译接口生成服务器端代码,用下面命令:
prompt>
idlj-fserverFileInterface.idl这个命令将生成Skeleton,holder,helper和其它类。生成类
_FileInterfaceImplBase
,我们将利用这个类的接口来实现应用。
应用接口
下面我们将实现下载方法。CodeSample6:FileServant.importJAVA.io.*;
publicclassFileServantextends_FileInterfaceImplBase{
publicbyte[]downloadFile(StringfileName){
Filefile=newFile(fileName);
bytebuffer[]=newbyte[(int)file.length()];
try{
BufferedInputStreaminput=new
BufferedInputStream(newFileInputStream(fileName));
input.read(buffer,0,buffer.length);
input.close();
}catch(Exceptione){
System.out.println("FileServantError:"+e.getMessage());
e.printStackTrace();
}
return(buffer);
}
}
服务器端开发
下一步我们importJAVA.io.*;
importorg.omg.CosNaming.*;
importorg.omg.CosNaming.NamingContextPackage.*;
importorg.omg.CORBA.*;
publicclassFileServer{
publicstaticvoidmain(Stringargs[]){
try{
//createandinitializetheORB
ORBorb=ORB.init(args,null);
//createtheservantandregisteritwiththeORB
FileServantfileRef=newFileServant();
orb.connect(fileRef);
//gettherootnamingcontext
org.omg.CORBA.ObjectobjRef=
orb.resolve_initial_references("NameService");
NamingContextncRef=NamingContextHelper.narrow(objRef);
//Bindtheobjectreferenceinnaming
NameComponentnc=newNameComponent("FileTransfer","");
NameComponentpath[]={nc};
ncRef.rebind(path,fileRef);
System.out.println("Serverstarted....");
//Waitforinvocationsfromclients
JAVA.lang.Objectsync=new JAVA.lang.Object();
synchronized(sync){
sync.wait();
}
}catch(Exceptione){
System.err.println("ERROR:"+e.getMessage());
e.printStackTrace(System.out);
}
}}一旦
FileServer
有了
ORB
(对象请求代理),它就能注册
CORBA
服务。它用
OMG
制定的
COS
命名服务注册。它从命名服务根开始,返回一个生成的
CORBA
对象。为了引用
NamingContext对象,必须narroweddown一个合适的类型。如下做:
NamingContextncRef=NamingContextHelper.narrow(objRef);
对象
ncRefobjectis现在就是
org.omg.CosNaming.NamingContext
的实例.你可以用它来注册一个代用绑定方法明明服务的
开发客户端
下一步是FileTransfer
服务后,就可以调用下载方法了。CodeSample8:FileClient
importJAVA.io.*;
importJAVA.util.*;
importorg.omg.CosNaming.*;
importorg.omg.CORBA.*;
publicclassFileClient{
publicstaticvoidmain(Stringargv[]){
try{
//createandinitializetheORB
ORBorb=ORB.init(argv,null);
//gettherootnamingcontext
org.omg.CORBA.ObjectobjRef=
orb.resolve_initial_references("NameService");
NamingContextncRef=NamingContextHelper.narrow(objRef);
NameComponentnc=newNameComponent("FileTransfer","");
//Resolvetheobjectreferenceinnaming
NameComponentpath[]={nc};
FileInterfaceOperationsfileRef=
FileInterfaceHelper.narrow(ncRef.resolve(path));
if(argv.length<1){
System.out.println("Usage:JAVAFileClientfilename");
}
//savethefile
Filefile=newFile(argv[0]);
bytedata[]=fileRef.downloadFile(argv[0]);
BufferedOutputStreamoutput=new
BufferedOutputStream(newFileOutputStream(argv[0]));
output.write(data,0,data.length);
output.flush();
output.close();
}catch(Exceptione){
System.out.println("FileClientError:"+e.getMessage());
e.printStackTrace();
}
}
}
运行应用
最后一步是运行应用。有几个步骤:1运行tnameserv.来做。却省端口是900,如果900不能用,你可以用另一端口2500,命令如下:
prompt>
tnameserv-ORBinitialPort2500
2运行服务器当在却省端口时
prompt>
当在其它端口如2500时JAVAFileServer
prompt>
JAVAFileServer-ORBInitialPort2500
3
生成客户端干码
prompt>
idlj-fclientFileInterface.idl4运行客户端,假设在2500端口
prompt>
hello.txt是要下载的文件如果命名服务在4500端口JAVAFileClienthello.txt-ORBInitialPort2500
prompt>
我们还可以在ORB初始化指定一些参数:如JAVAFileClienthello.txt-ORBInitialHostgosling-ORBInitialPort4500
ORBorb=ORB.init(argv,null);
指定
CORBA
服务器,和命名端口如下:
Propertiesprops=newProperties();
props.put("org.omg.CORBA.ORBInitialHost","gosling");
props.put("orb.omg.CORBA.ORBInitialPort","2500");
ORBorb=ORB.init(args,props);
测试
在文件传输应用中,客户端需要先知道要传输文件的名字,服务器端没有列表显示文件名的方法,你可以增加方法扩展应用。当然,你也可以CORBA和RMI比较
显而易见,结论
相关文章推荐
- 用RMI和CORBA开发JAVA分布式程序(二)
- 用RMI和CORBA开发JAVA分布式程序
- 用RMI和CORBA开发JAVA分布式程序
- 用RMI和CORBA开发JAVA分布式程序
- 用RMI和CORBA开发JAVA分布式程序(二)
- RMI网络编程开发之二 如何搭建基于JDK1.5的分布式JAVA RMI 程序
- 用RMI开发基于Java的企业分布式应用
- 使用Java中RMI机制来实现分布式程序
- RMI网络编程开发之二 如何搭建基于JDK1.5的分布式JAVA RMI 程序
- 使用RMI和CORBA进行分布式java程序设计
- 使用JAVA中RMI机制来实现分布式程序(2)
- RMI网络编程开发之二 如何搭建基于JDK1.5的分布式JAVA RMI 程序
- 使用Java中RMI机制来实现分布式程序
- java分布式对象(RMI+部署使用RMI的程序)
- 使用JAVA中RMI机制来实现分布式程序(2)
- RMI网络编程开发之二 如何搭建基于JDK1.5的分布式JAVA RMI 程序
- Java微信小程序开发_00_资源帖
- Java程序开发流程(图文解说版)
- 使用Eclipse开发Java程序