天天看點

Java&CORBA程式設計執行個體2

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

生成的檔案如下圖所示:

Java&CORBA程式設計執行個體2

三、編寫伺服器端檔案

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');  

五、整個項目結構圖

如圖所示:

Java&CORBA程式設計執行個體2

六、運作程式:

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

七、運作結果截圖:

伺服器端截圖:

Java&CORBA程式設計執行個體2

 用戶端截圖:

Java&CORBA程式設計執行個體2