国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
使用omniORBpy開發(fā)簡單CORBA程序筆記
一、CORBA組成
      CORBA(Common Object Request Broker Architecture)即公共對象請求代理體系結(jié)構(gòu)。它是由 OMG (Object Management Group)即對象管理組織制訂的一種標準的面向?qū)ο髴贸绦蝮w系規(guī)范。由對象請求代理 ORB、對象服務、公共設(shè)施、域接口和應用接口這幾個部分組成。其核心部分是對象請求代理 ORB (Object Request Broker)。ORB 提供了一種機制,通過這種機制,對象可以透明的發(fā)出請求和接收響應。ORB可看作是在對象之間建立客戶/服務關(guān)系的一種中間件。ORB截取客戶發(fā)送的請求,并負責在該軟件總線上找到實現(xiàn)該請求的服務對象,然后完成參數(shù)、方法調(diào)用,并返回最終結(jié)果。

二、CORBA 體系結(jié)構(gòu)



 三、CORBA工作流程
       首先使用 IDL定義對象和方法,然后 Client 調(diào)用定義的對象方法,該調(diào)用被ORB傳遞到Server,接著 Server真正調(diào)用該方法,最后結(jié)果沿原路返回。
      1. Server啟動,等待來自 Client 的請求
        Server啟動后,它首先生成一個 POA(potable object adapter)。然后告訴 POA他所能提供的服務,即 Servant(Server按照 IDL定義所實現(xiàn)的每個對象)。Server從POA處得到每個 Servant 的引用OR(Object Reference)。Server把自己提供的服務公布出來,這里有兩個方法:將OR 轉(zhuǎn)換為一個字符串并輸出(notes:可互操作對象引用 (IOR), 是一個數(shù)據(jù)結(jié)構(gòu),它提供了關(guān)于類型、協(xié)議支持和可用 ORB 服務的信息。ORB 創(chuàng)建、使用并維護該 IOR.);將這個 OR綁定到一個簡單易理解的名字上,這通過 Naming Service 完成。

     2.  Client 調(diào)用定義的對象方法
       Client 通過Naming Service查詢獲得要訪問的對象的引用 OR(object reference),或通過一個字符串獲得;Client 通過這個引用調(diào)用對象的方法,因為
OR 中有足夠的信息來定位一個對象,然后這個調(diào)用被傳遞給 ORB。

四、 CORBA編程的基本概念
  1. 對象請求代理ORB(Object Request Broker)
  2. 接口定義語言IDL(Interface Defination Language)
  3. 對象的引用(Object Reference)唯一定位分布的對象,是一個字符串。
  4. 客戶程序(Client)可以直接使用對象引用定位、訪問活動的服務對象。
  5. 命名服務(Naming Service)是定位分布對象的最佳手段,命名服務負責將對象的邏輯名解析為該對象的引用字符串,稱為名字解析(Name resolving),可以聯(lián)系主機域名和DNS服務器來理解。
  6. 服務程序(Servant)將服務對象注冊到命名服務器并和一個邏輯名綁定,客戶程序可以從命名服務器獲得該服務對象邏輯名的對象引用字符串。
  7. 對象邏輯名由名字組件(Name compoment)組成,名字組件由ID、Kind兩個域組成。
  8. 名字上下文(Name context)中包含對象邏輯名綁定的集合,同時一個名字上下文也可綁定到另一個名字上下文中,則對象邏輯名的綁定包括兩類:對普通對象名的綁定和對一個名字上下文的綁定。
  9. POA是服務程序與ORB(Object Request Broker)之間的媒介,提供對對象的管理、適配和Object Key的分配。
五、編程環(huán)境配置

   進行CORBA開發(fā),需要選擇一個ORB和一種熟悉的編程語言,對于學習者而言,omniORBpy和Python就是一對很好的組合。

1. Python簡介

  Python是面向?qū)ο蟮哪_本開發(fā)語言,語法非常精簡,容易上手。

2. 配置omniORBpy的開發(fā)環(huán)境

操作系統(tǒng)是Windows:

1、安裝Python解釋環(huán)境
a)到http://www.activestate.com 下載ActivePython2.4;
b)安裝到C:\Python24目錄下即可;

2、安裝omniORBpy
a)到http://omniorb.sourceforge.net下載omniORBpy2.6,選擇下載已經(jīng)使用VC++編譯好的二進制版本(如果使用C++編程則下載omniORB);
b)從源代碼編譯omniORBpy時,需要omniORB的C++庫,則還需要下載omniORB的源代碼,操作系統(tǒng)上也要有VC++的編譯環(huán)境;
c)下載完后解壓到C:\omniORBpy目錄下;

3、配置環(huán)境變量
a)首先將C:\omniORBpy\bin\x86_win32目錄添加到環(huán)境變量PATH中,這樣在命令行下就可以直接運行omniORBpy提供的命令,如用于編譯IDL文件的omniidl和提供命名服務的omninames等;
b)PYTHONPATH變量是Python搜索模塊的路徑集合,將C:\ominiORBpy\lib\python和C:\omniORBpy\lib\x86_win32添加到PYTHONPATH中,使得Python可以搜索到omniORBpy提供的CORBA編程模塊;
c)omniORB首先會讀OMNIORB_CONF環(huán)境變量找配置文件,如果未設(shè)置該環(huán)境變量則到注冊表的”HKEY_LOCAL_MACHINE/Software/omniORB”位置下讀取相關(guān)配置信息;
d)“我的電腦-屬性-高級-環(huán)境變量”中可以編輯環(huán)境變量;

4、配置命名服務器
若程序要用到命名服務,則可在創(chuàng)建命名服務對象時指定命名服務器的地址,也可以在注冊表中添加。例如要使用本地的命名服務器“NameService”,則在HKEY_LOCAL_MACHINE/Software/omniORB/下創(chuàng)建名為“InitRef”,類型為字符串,值為“NameService=corbaname::localhost”的子鍵,在后面的例子中會看到如何使用命名服務綁定和解析對象邏輯名。

六、CORBA編程基本步驟

1、編寫IDL接口描述文件;
2、將IDL編譯成所用開發(fā)語言的庫,如C++、Java、Python,omniORBpy用于編譯IDL的命令為omniidl;
3、配置并啟動Naming Service(可選),omniORBpy命名服務的命令為omninames;
4、編寫服務程序,在命名服務器上綁定對象IOR的邏輯名;
5、編寫客戶程序,訪問命名服務器解析對象邏輯名的IOR;

七、omniORBpy編程實例
   還是從最簡單的打印“Hello, World!”開始吧。設(shè)當前工作目錄為:C:\omniORBpy\scripts\messenger。

1、編寫IDL接口定義文件

---bof:secret_messenger.idl---

module messenger
{
    interface SecretMessage
    {
        string getMessage();
   };
};
---eof---

2、 使用omniidl命令將IDL文件編譯成Python模塊
           omniidl –bpython secret_messenger.idl
      Notes:編譯成功后將生成包括客戶程序(Client)使用的Stubs(接口存根)和服務程序(Servant)使用的Skeleton(接口框架),客戶程序使用的Stubs在messenger文件夾中,服務程序使用的Skeleton在messenger__POA文件夾中。在Step1的IDL中定義了一個僅包含一個方法的SecretMessage接口,遵照OMG組織發(fā)布的Python的映射規(guī)范-IDL中定義的接口將被映射到Python的若干類中,生成secret_messenger_idl.py文件, 其py文件編譯后則生成secret_messenger_idl.pyc文件。



3、 使用IOR定位對象編寫CORBA服務程序
(1)、Servant需要以Skeleton中的框架類為父類,定義包括了具體實現(xiàn)的服務類,并創(chuàng)建服務對象的實例。
(2)、再向Servant端的ORB注冊(發(fā)布)該對象,聯(lián)系基本概念中對POA的描述-POA是Servant與ORB之間管理Object的媒介,向ORB注冊、激活對象需要用到POA對象。則首先要創(chuàng)建并初始化ORB對象請求代理和POA(Portable ObjectAdaptor),使用POAManager對象向ORB服務注冊并激活SecretMessage對象。POA對服務程序而言非常重要,它是用于管理服務程序中所有可用對象的那個對象(在面向?qū)ο蟮某绦蛟O(shè)計中一切都是對象,除此之外沒有別的),每個POA對象擁有自己的POA Manager,用于管理所有注冊的對象。
(3)、創(chuàng)建了服務對象實例,啟動ORB服務組件,獲取了RootPOAManager,接下來就要向ORB激活對象實例,激活的方法OurSecretMessage類已經(jīng)從messenger__POA.SecretMessage類中繼承獲得,即_this()方法。本例中將服務對象的IOR字符串值寫入message.ior文件中,我們可以通過Email的方式將IDL文件和message.ior文件發(fā)布給客戶程序開發(fā)者。

---bof:messenger_server.py---

#!C:\Python24\python.exe      #windows下首行,inux環(huán)境下首行使用#!/usr/bin/env python   

#Import the sys module to access sys.argv
import sys     

#Import omniORB’s implementations of the CORBA and PortableServer modules
from omniORB import CORBA, PortableServer     

#Import the client-side stubs and server-side skeletons
import messenger, messenger__POA

# Servant class definition,define an implementation class, which derives from the skeleton class
class OurSecretMessage(messenger__POA.SecretMessage):
  def getMessage(self):
        return 'Hello world'


#Initialise the ORB and find the root POA
orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID)
poa = orb.resolve_initial_references(“RootPOA”)

# Activate the POA
poa._get_the_POAManager().activate()

# Create an instance and OurSecretMessage a  SecretMessage object reference
ourMessage = OurSecretMessage()
message_obj = OurMessage._this()


#打印IOR
print orb.object_to_string(message_obj)

#將對象引用字符串IOR寫入message.ior文件
output_handle = open(“message.ior”, “w”)
string_ior = orb.object_to_string(message_obj)
output_handle.write(string_ior)
output_handle.close()


# Block for ever (or until the ORB is shut down)
orb.run()

---eof---


4、編寫客戶腳本
從message.ior文件讀取服務對象的IOR,將IOR對象化,調(diào)用服務對象的方法getMessage(),將得到”Hello, world!”字符串;

---bof:messenger_client.py---
#!C:\Python24\python.exe

import sys
from omniORB import CORBA
import messenger

#初始化ORB
orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID)

#從message.ior文件讀取服務對象的IOR
input_handle = open(“message.ior”, “r”)
ior = input_handle.read()
input_handle.close()

#從IOR獲取對象,導入到自己地址空間中
obj = orb.string_to_object(ior)
mo = obj._narrow(messenger.SecretMessage)

result = mo.getMessage()
print result

---eof---

 5、運行情況

(1)、啟動服務程序
  ..\>messenger_server.py
(2)、啟動客戶程序
  ..\>messenger_client.py

Hello, world!
(3)、在message.ior文件中存儲著Servant激活對象的IOR
---bof:message.ior---
IOR:010000002000000049444c3a6d657373656e6765722f5365637265744d6573736167653a312e300001000000000000006400
0000010102000c00000031302e33312e3230302e38005b0d00000e000000fe8db26a4300000d200000000000000002000000000
00000080000000100000000545441010000001c00000001000000010001000100000001000105090101000100000009010100
---eof---

現(xiàn)在只要把messenger.idl和meeage.ior文件發(fā)布給客戶程序的開發(fā)者,客戶程序可以從網(wǎng)絡(luò)中任何位置獲取這條消息了。

6、使用命名服務定位分布的對象

   前面的服務程序?qū)ο蟮腎OR寫入文件中發(fā)布,這樣做很不方便,如當服務對象的IOR改變時就要重新發(fā)布IOR。想象一下互聯(lián)網(wǎng)中域名服務器是怎樣工作的:SP申請IP地址和域名,在域名服務器注冊域名;用戶要訪問該域名,首先到域名服務器解析其IP地址,再訪問該IP地址;當SP的IP地址改變時只要在域名服務器更新注冊的IP地址即可,用戶端依然可以使用域名訪問。對象邏輯名和CORBA命名服務,就可以類比域名和域名服務器來理解。

(1)、修改messenger_server.py中初始化orb、poa的部分后得到以下服務程序:

---bof:messenger_server.py---

#!C:\Python24\python.exe

import sys
from omniORB import CORBA, PortableServer
import messenger, messenger__POA

class OurSecretMessage(messenger__POA.SecretMessage):
    def getMessage(self):
        return 'Hello world!'

#初始化ORB、POA、POA_Manager對象
#orb初始化前需要先指定命名服務器地址
#ORB初始化時,會接受命令行中”-ORB”開始的參數(shù),這里指定命名服務器地址。
sys.argv.extend(("-ORBInitRef", "NameService=corbaname::localhost"))

orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID)
poa = orb.resolve_initial_references("RootPOA")
poa._get_the_POAManager().activate()

#創(chuàng)建對象實例及引用
our_message = OurSecretMessage()
message_obj = our_message._this()

#初始化命名服務對象
import CosNaming

# Obtain a reference to the root naming context
name_service_obj = orb.resolve_initial_references("NameService")
name_service_root = name_service_obj._narrow(CosNaming.NamingContext)
assert name_service_root is not None, "Failed to narrow to NamingContext."

#將對象綁定到邏輯名"Messenger.SecretMessage"
message_name = [CosNaming.NameComponent("Messenger", "SecretMessage")]
name_service_root.bind(message_name, message_obj)
print "Bound the Message Object to naming service"

print "Server is running"
orb.run()
---eof---

(2)、修改后的客戶程序
---bof:messenger_client.py---

#!C:\Python24\python.exe

import sys
from omniORB import CORBA
import CosNaming
import messenger

#初始化客戶ORB,指定訪問的命名服務器地址
sys.argv.extend(("-ORBInitRef", "NameService=corbaname::localhost"))
orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID)

#獲取命名服務對象,解析服務對象的邏輯名Messenger.SecretMessage
name_service_obj = orb.resolve_initial_references("NameService")
name_service_root = name_service_obj._narrow(CosNaming.NamingContext)
assert name_service_root is not None, "Failed to narrow to NamingContext."

message_name = [CosNaming.NameComponent("Messenger", "SecretMessage")]
message_obj = name_service_root.resolve(message_name)
result = message_obj.getMessage()

print result
---eof---

(3)、運行情況

(a)、首先啟動命名服務
C:\>omniNames
omniORB: Warning: the local loop back interface (127.0.0.1) is used asthis server's address. Only clients on this machine can talk to
this server.

Fri Nov 04 09:59:43 2005:
Read log file successfully.
Root context isIOR:010000002b00000049444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f6e746578744578743a312e3000000100000000
0000005c000000010102000a0000003132372e302e302e3100f90a0b0000004e616d65536572766963650002000000000000000800000001000000005454410100
00001c00000001000000010001000100000001000105090101000100000009010100
Checkpointing Phase 1: Prepare.
Checkpointing Phase 2: Commit.
Checkpointing completed.
… …

(b)、啟動服務程序,到omninames綁定邏輯名

C:\Python24\Scripts\messenger>secret_message_srv.py
omniORB: Warning: the local loop back interface (127.0.0.1) is used asthis server's address. Only clients on this machine can talk to
this server.
Bound the Message Object to naming service
Server is running
… …

(c)、啟動客戶程序,到omninames解析邏輯名

C:\Python24\Scripts\messenger>secret_message_clt.py

Hello, world!
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java IDL: Interoperable Naming Service (INS) ...
Inprise Application Server
親身體驗CORBA: 使用java和C++混合編程
Common Object Request Broker Architecture
[Domino]如何用java遠程訪問Domino郵箱數(shù)據(jù)
Ice與CORBA的差異
更多類似文章 >>
生活服務
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服