Java&CORBA程式設計執行個體2
要熟練掌握CORBA也并不容易。本文再提供一個Java與CORBA程式設計的例子,以進一步加深對CORBA的認識。
一、編寫IDL檔案
counter.idl源碼:
module CounterApp{
interface Counter{
readonly attribute long value;
void inc();
void dec();
};
};
二、用idlj生成需要的檔案
指令:idlj -fall counter.idl
生成的檔案如下圖所示:

三、編寫伺服器端檔案
1)編寫Server.java
Server.java源碼:
package server;
import CounterApp.*;
import java.util.Properties;
import org.omg.CORBA.*;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import java.io.*;
import static java.lang.System.*;
public class Server {
public static void main(String[] args){
try{
Properties props = getProperties();
ORB orb = ORB.init(args, props);
org.omg.CORBA.Object obj = null;
POA rootPOA = null;
try{
obj = orb.resolve_initial_references("RootPOA");
rootPOA = POAHelper.narrow(obj);
}catch(org.omg.CORBA.ORBPackage.InvalidName e){
}
CounterImpl c_impl = new CounterImpl();
Counter c = c_impl._this(orb);
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();
out.println("Server started."+" Stop: Ctrl-c");
}catch(IOException ex){
out.println("File error: "+ex.getMessage());
exit(2);
rootPOA.the_POAManager().activate();
orb.run();
}catch(Exception ex){
out.println("Exception: "+ex.getMessage());
exit(1);
}
}
}
2)編寫CounterImpl.java
CounterImpl.java源碼:
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;
四、編寫用戶端檔案
Client.java源碼:
package client;
import java.util.*;
public class Client {
String ref = null;
Scanner reader = new Scanner(new File("Counter.ref"));
ref = reader.nextLine();
obj = orb.string_to_object(ref);
if(obj == null){
out.println("Invalid IOR");
exit(4);
Counter c = null;
c = CounterHelper.narrow(obj);
}catch(BAD_PARAM ex){
out.println("Narrowing failed");
exit(3);
int inp = -1;
do{
out.print("Counter value: "+c.value()+"/nAction(+/-/e)?");
out.flush();
do{
try{
inp = in.read();
}catch(IOException ioe){}
}while(inp != '+' && inp != '-' && inp != 'e');
if(inp == '+')
c.inc();
else if(inp == '-')
c.dec();
}while(inp != 'e');
五、整個項目結構圖
如圖所示:
六、運作程式:
1)啟動orbd
start orbd -ORBInitialPort 1050 -ORBInitialHost localhost
2)開始Server伺服器
java server/Server -ORBInitialPort 1050 -ORBInitialHost localhost
注:如在同一台主機上運作,可省略-ORBInitialHost localhost
3)運作用戶端應用程式
java client/Client -ORBInitialPort 1050 -ORBInitialHost localhost
七、運作結果截圖:
伺服器端截圖:
用戶端截圖: