注:本文仅供参考,实际操作遇到的问题可能不同,请善用百度
本文将以HelloWorld!班级姓名的实现为例,讲述本人在作业中遇到的问题以及解决方法:
全文是在cmd中进行,没有使用IDE,请使用IDE的同学注意!
1.事前准备
编写本程序个人建议使用jdk1.8.0_131,其他jdk可能会出现不同错误
环境配置:
安装完毕后,配置环境变量
以我为例,我的jdk安装在D:\java1.8中,因此复制D:\java1.8\bin和D:\java1.8\jre\bin这两个路径,然后添加到系统变量path中,并放在上移至最上,以免系统调用其他路径的jdk,结果如图:
然后打开cmd,输入java -version和javac -version,确认两者版本是否一致
接着可以在自己喜欢的地方进行操作,地方自选
2.idl接口编写
可以使用记事本编写
英文实现直接用string,中文实现需要改为wstring,全程序只需改这一处
现给出修改后的代码:
module sample{
interface HelloWorld{
wstring sayHello();
};
};
结束以HelloWorld.idl格式保存
3.编译idl接口
在HelloWorld.idl所在目录打开cmd,进行编译
注意使用idlj编译时不要忘记操作符 -fall,不然会缺少文件
正确编译语句:
idlj –fall HelloWorld.idl
结束会在HelloWorld.idl所处目录生成文件夹,如图:
4.编写编译服务端和客户端程序
然后如上图所示
建HelloWorldServer.java和HelloWorldClient.java两文件
HelloWorldServer.java代码如下:
import sample.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.CORBA.portable.*;
import org.omg.PortableServer.*;
class HelloWorldServant extends HelloWorldPOA{ //对象实现类
public String sayHello(){
return "\nHello World!班级姓名\n";
}
}
public class HelloWorldServer{ //服务程序
public static void main(String args[]){
try{
//初始化ORB
ORB orb = ORB.init(args, null);
//取根POA的引用
org.omg.CORBA.Object poaobj = orb.resolve_initial_references ("RootPOA");
org.omg.PortableServer.POA rootPOA = org.omg.PortableServer.POAHelper.narrow(poaobj);
org.omg.PortableServer.POAManager manager = rootPOA.the_POAManager();
//创建伺服对象
HelloWorldServant objRef = new HelloWorldServant();
HelloWorld obj = objRef._this(orb);
//绑定命名服务
NamingContext ncRef = NamingContextHelper.narrow(orb.resolve_initial_references("NameService"));
NameComponent nc = new NameComponent("Hello", "");
NameComponent path[] = {nc};
ncRef.rebind(path, obj);
//激活POA管理器
manager.activate();
//等待处理客户程序的请求
System.out.println("HelloWorld is running!");
orb.run();
}catch (Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out);
}
}
}
HelloWorldClient.java代码如下:
import sample.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
public class HelloWorldClient {
public static void main(String args[]) {
try{
ORB orb = ORB.init(args, null);
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
NameComponent nc = new NameComponent("Hello","");
NameComponent path[] = {nc};
HelloWorld helloWorld = HelloWorldHelper.narrow(ncRef.resolve(path));
String hello = helloWorld.sayHello();
System.out.println(hello);
} catch (Exception e) {
System.out.println("ERROR : " + e) ;
e.printStackTrace(System.out);
}
}
}
然后在此目录下打开cmd,用javac将.java文件编译为可执行文件.class
个人建议使用以下语句:
javac -encoding UTF-8 *.java
因为javac编译会使用操作系统默认编码风格(本人的win10 默认编码为GBK),这样设定可以防止编码错误,否则会如下图产生哭笑不得的错误:
编译完成后会产生相应文件,如下图:
如果编译过程中有如下图类似警告,不要忽视:
原因是格式问题,需要打开sample下的HelloWorldPOA.java手动添加代码:
无警告完成后,就可以在HelloWorld.idl所在目录打开三个cmd
5.运行
分别执行三条语句:
tnameserv -ORBInitialPort 1050
java HelloWorldServer -ORBInitialPort 1050
java HelloWorldClient -ORBInitialPort 1050
然后执行完最后一条语句就可以看结果了:
6.关于Counter的实现
Counter的实现相较简单,可仿照上例执行