JAVA的Corba客戶端 - 服務端 通信實現


IDE:Eclipse 3.4.1

先在Eclipse建立兩個Java Project

1.然后定義 IDL .

 

內容如下:

 

module helloapp {
    interface Hello {
        string sayHello();
        oneway void shutdown();
    };
};

 

 

 

**這里注意, } 后面的 ";"一定要寫上,不然會編譯錯誤

 

2. 右鍵這個HelloApp.idl文件

點擊,Change to parent folder in Shell

點擊OK , Eclipse會打開Shell視圖,是命令行視圖,其實和CMD是一個作用.

這里我們執行命令 : idlj -fall HellApp.idl

 

3. 然后我們到項目目錄(H:\DEVELOPING\UMM\workspace\testCorbaServer\src\server)下就能看到多生成了一個文件夾 -- helloapp

打開里面試一些java接口類

4.在服務端建立一個package 名字跟 idl內容里的module相同,這里我們是 ' helloapp '

  然后把類復制到這個包下面

 

 

---------------------------------------

---------------------------------------

第二部分 實現IDL生成的類的接口

1.實現服務端 如圖

 內容如下:

package server;


import org.omg.CORBA.ORB;

import helloapp.HelloPOA;

public class HelloImpl extends HelloPOA {

    private ORB orb;

    public void setOrb(ORB orb) {
        this.orb = orb;
    }

    @Override
    public String sayHello() {
        return "\nHello World!!\n";
    }

    @Override
    public void shutdown() {
        orb.shutdown(false);
    }

}


 

以上,服務端的"服務"就寫好了, 下面還要在服務端寫一個入口類,把你的服務"注冊"上.

 

 內容如下:

 

package server;

import helloapp.Hello;
import helloapp.HelloHelper;

import org.omg.CORBA.ORB;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
import org.omg.CosNaming.NamingContextPackage.NotFound;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.omg.PortableServer.POAManagerPackage.AdapterInactive;
import org.omg.PortableServer.POAPackage.ServantNotActive;
import org.omg.PortableServer.POAPackage.WrongPolicy;

public class Main {
    public static void main(String[] args) {
        try {
            // 創建一個ORB實例
            ORB orb = ORB.init(args, null);

            // 得到一個RootPOA的引用,並激活POAManager
            POA rootpoa = POAHelper.narrow(orb
                    .resolve_initial_references("RootPOA"));
            rootpoa.the_POAManager().activate();
            
            // create servant and register it with ORB
            // 創建一個HelloImpl實例(servant),並注冊到ORB上
            HelloImpl helloImpl = new HelloImpl();
            helloImpl.setOrb(orb);
            
            // 在服務中得到對象的引用
            org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl);
            Hello href = HelloHelper.narrow(ref);
            
            //得到一個根名稱的上下文 
            org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); 
            
            // Use NamingContextExt which is part of the Interoperable 
            // Naming Service (INS) specification. 
            NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); 
             
            // 在命名上下文中綁定這個對象
            String name = "Hello";
            NameComponent path[] = ncRef.to_name(name);
            ncRef.rebind(path, href);
            
            System.out.println("HelloServer ready and waiting ..."); 

            //啟動線程服務,等待客戶端的調用 
            orb.run(); 
        } catch (InvalidName e) {
            e.printStackTrace();
        } catch (AdapterInactive e) {
            e.printStackTrace();
        } catch (ServantNotActive e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (WrongPolicy e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NotFound e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (CannotProceed e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
         System.out.println("HelloServer Exiting ..."); 
    }
}

 

 

 

注意 :這里雖然是入口,可是不能直接右鍵run as - > Java Application

 

 

---------------------------------------

 

---------------------------------------

 

 實現客戶端

1.要把服務端生成的工具類復制到客戶端(最好包結構一致) 如圖

2.編寫客戶端調用.

內容如下:

package client;

import helloapp.Hello;
import helloapp.HelloHelper;

import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;

public class HelloClient {
    static Hello helloImpl;
    
    public static void main(String[] args) {
        try {
            // 創建一個ORB實例
            ORB orb = ORB.init(args, null);
            
            // 獲取根名稱上下文
            org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
            
            // Use NamingContextExt instead of NamingContext. This is 
            // part of the Interoperable naming Service. 
            NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); 
            
            // 從上下文中獲取接口實現對象
            String name = "Hello";
            helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));
            System.out.println(helloImpl.sayHello()); 
            System.out.println("asdfasdfdasf"); 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

這樣 客戶端就完成調用了.  下面就是如何 運行起來了.

 

1. 運行CORBA服務 (直接CMD運行即可)

orbd -ORBInitialPort 1053 -ORBInitialHost 192.168.1.42

注: 192.168.1.42是我自己的本地IP地址  1053是端口

CORBA服務獨立於客戶端和服務端,相當於一條橋梁.

 

這個窗口不要關掉,光標會一直閃.

 

2.啟動服務端

啟動服務端需要main函數傳遞參數,所以我們要先配一些main函數的參數. 如圖:

 

 

點開:

 

Main就是我們服務端的入口函數.  之前有說過.

 

然后在arguments的program arguments: 寫入

 

-ORBInitialPort 1053    

 

 

 

端口1053是與之前的CORBA服務的端口對應的

 

 

 

服務端就配好了.   運行服務端.

 

不要關閉服務端. 

 

3.啟動客戶端

 

這里我不用多說了,然后啟動運行,就可以看到運行結果了.

 

說明:  依照原文,可能環境不同會出些奇怪的問題,希望讀者先仔細檢查是否和原文有出入,或者檢查異常,還是不行的話,歡迎留言一起討論.

 CORBA的客戶端-服務端建立確實比較麻煩,不過如果之前已經搭建一套框架的話,開發以來也是事半功倍的.  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM