知识来源:校内上机作业包
实例一:利用组件化的开发方法实现一个简单的Java版CORBA程序–输出“HelloWorld!软件工程1703高洋洋”
具体设计:
(1)在文本文档里编写IDL接口文件。并将其后缀名改为.idl
注意:如果输出中有汉字,则sayHello()中的返回值必须为wstring
(2)在桌面创建一个文件夹first(随便命名),将idl文件拉入文件夹,复制一个cmd.exe到这个文件夹中,并将这个cmd.exe默认地址设置为这个文件夹的地址(为了方便后面的操作,不需要写命令的时候改变地址)
(3)打开刚刚那个cmd,输入指令:idlj –fall Hello.idl这个命令是编译idl文件,这时候你会发现多出一个文件夹HelloApp(与你编写的idl文件里的命名一样),里面有六个Java文件(这六个文件就是为将来的客户端和服务端提供CORBA服务的)
(4)编写并编译HelloClient.java(客户端),编写并编译HelloServer,java(服务端)
//HelloClient.java
import HelloApp.*; //本应用的Stub类
import org.omg.CORBA.*; //使用CORBA服务
import org.omg.CosNaming.*;//使用CORBA的名字服务
public class HelloClient {
public static void main(String[] args) {
// TODO 自动生成的方法存根
try{
//args为客户程序启动时的命令行参数
ORB orb = ORB.init(args, null);
//使用ORB的名字服务寻找Hello对象,启动
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
//类型变化
NamingContext ncRef = NamingContextHelper.narrow(objRef);
//注册服务类
NameComponent nc = new NameComponent("Hello","");
NameComponent path[] = {nc};
Hello hello = HelloHelper.narrow(ncRef.resolve(path));
//调用sayHello()方法,把服务端返回的内容显示在屏幕上
String h = hello.sayHello();
System.out.println(h);
} catch (Exception e) {
System.out.println("ERROR : " + e) ;
e.printStackTrace(System.out);
}
}
}
//HelloServer.java
import HelloApp.*; //本应用的stub类
import org.omg.CosNaming.*;//要使用CORBA的名字服务
import org.omg.CosNaming.NamingContextPackage.*;//名字服务的例外处理
import org.omg.CORBA.*;//使用CORBA服务
import org.omg.CORBA.portable.*;
import org.omg.PortableServer.*;
class HelloServant extends HelloPOA { // 对象实现类
public String sayHello() {
return "\nHello World!软件工程1703高洋洋\n";
}
}
public class HelloServer { // 服务程序
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();
//创建伺服对象
HelloServant objRef = new HelloServant();
Hello 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);
}
}
}
(5)编译后文件夹就多出来了他们的.class
(6)注意:接下来三个cmd命令必须在三个cmd窗口分别进行
(7)启动名字服务器:tnameserv -ORBInitialPort 1050
(8)启动服务端程序:java HelloServer -ORBInitialPort 1050
(9)启动客户端程序:java HelloClient -ORBInitialPort 1050
实例二:利用组件化的开发方法实现一个简单的Java版CORBA程序–实现简单的连续加或减或混合加减的运算!
(1)在文本文档里编写IDL接口文件。并将其后缀名改为.idl
(2)与第一题的第二步相同
(3)打开刚刚那个cmd,输入指令:idlj –fall Counter.idl
(4)编写并编译对象实现代码:CounterImpl.java,客户端程序: Client.java,服务端程序: Server.java
//Client.java
import CounterApp.*;
import java.util.*;
import java.io.*;
import org.omg.CORBA.*;
import org.omg.CosNaming.*;
public class Client {
public static void main(String[] args) {
try {
ORB orb = ORB.init(args, null);
org.omg.CORBA.Object obj = orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(obj);
NameComponent nc = new NameComponent("Count", "");
NameComponent path[] = { nc };
String ref = null;
try {
Scanner reader = new Scanner(new File("Counter.ref"));
ref = reader.nextLine();
} catch (IOException ex) {
System.out.println("File error: " + ex.getMessage());
System.exit(2);
}
obj = orb.string_to_object(ref);
if (obj == null) {
System.out.println("Invalid IOR");
System.exit(4);
}
Counter c = null;
try {
c = CounterHelper.narrow(obj);
} catch (BAD_PARAM ex) {
System.out.println("Narrowing failed");
System.exit(3);
}
int inp = -1;
do {
System.out.print("Counter value: " + c.value() + "\nAction(+/-/e)?");
System.out.flush();
do {
try {
inp = System.in.read();
} catch (IOException ioe) {
}
} while (inp != '+' && inp != '-' && inp != 'e');
if (inp == '+')
c.inc();
else if (inp == '-')
c.dec();
} while (inp != 'e');
} catch (Exception ex) {
System.out.println("Exception: " + ex.getMessage());
System.exit(1);
}
}
}
//Server.java
import CounterApp.*;
import java.io.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.CORBA.portable.*;
import org.omg.PortableServer.*;
public class Server {
public static void main(String[] args) {
try {
ORB orb = ORB.init(args, null);
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();
CounterImpl c_impl = new CounterImpl();
Counter c = c_impl._this(orb);
NamingContext ncRef = NamingContextHelper.narrow(orb.resolve_initial_references("NameService"));
NameComponent nc = new NameComponent("Count", "");
NameComponent path[] = { nc };
ncRef.rebind(path, c);
FileOutputStream file = new FileOutputStream("Counter.ref");
PrintWriter writer = new PrintWriter(file);
String ref = orb.object_to_string(c);
writer.println(ref);
writer.flush();
file.close();
System.out.println("Server started." + " Stop:Ctrl-c");
rootPOA.the_POAManager().activate();
orb.run();
} catch (IOException ex) {
System.out.println("File error:" + ex.getMessage());
System.exit(2);
} catch (Exception ex) {
System.out.println("Exception: " + ex.getMessage());
System.exit(1);
}
}
}
//Counterlmpl.java
import CounterApp.*;
public class CounterImpl extends CounterPOA {
private int count;
public CounterImpl() {
count = 0;
}
public void inc() {
count++;
}
public void dec() {
count--;
}
public int value() {
return count;
}
}
(5)编译后文件夹就多出来了他们的.class
(6)注意:接下来三个cmd命令必须在三个cmd窗口分别进行
(7)启动名字服务器:tnameserv -ORBInitialPort 1050
(8)启动服务端程序:java Server -ORBInitialPort 1050
(9)启动客户端程序:java Client -ORBInitialPort 1050