Peergine編程手冊_第1頁
Peergine編程手冊_第2頁
Peergine編程手冊_第3頁
Peergine編程手冊_第4頁
Peergine編程手冊_第5頁
已閱讀5頁,還剩70頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、V 1.1.22012-05介紹1. 關(guān)于PeerginePeergine是一個功能強大的對等通信中間件,用C/C+編程語言開發(fā)。為了適應(yīng)多種運行環(huán)境,Peergine被封裝成ActiveX控件(pgATX)、NPAPI插件和JNI插件等,能夠在Internet Explorer、Chrome、Firefox和Safari等瀏覽器以及Windows Script Host、Java Runtime Environment等環(huán)境中運行。支持Windows、Linux和Android操作系統(tǒng)。旨在能方便地構(gòu)建具有豐富的對等通信功能的Web應(yīng)用,包括瀏覽器端和服務(wù)器端。注:本編程手冊以ActiveX

2、控件(pgATX)的編程接口為例,說明Peergine中間件的使用方法。NPAPI插件、JNI插件的編程接口與ActiveX控件是兼容的。2. Peergine的功能特性1) 全新的網(wǎng)絡(luò)編程模式以面向?qū)ο蟮姆椒ǎ褟?fù)雜的多點對等通信交互過程封裝成通信對象,提供簡單、直觀的編程接口。即便是對網(wǎng)絡(luò)通信知識缺乏了解的編程人員,也能夠構(gòu)建出功能強大的對等通信應(yīng)用。參考“基于對象的多點通信會話”章節(jié)。2) 強大的對等通信功能以通信對象類的形式實現(xiàn)各種對等通信功能,目前支持的通信對象類為:節(jié)點類:提供對象的兩點通信范圍控制。節(jié)點的登錄/注銷,兩個節(jié)點之間的遠程過程調(diào)用,兩個節(jié)點之間的消息傳輸,數(shù)據(jù)簽名的生

3、成和校驗。參考“使用節(jié)點類”章節(jié)。通信組類:提供對象的多點通信范圍控制。支持手動控制組成員、自動控制組成員和主(Master)成員控制功能。參考“使用通信組類”章節(jié)消息傳輸類:多個節(jié)點之間單向傳輸消息。參考“使用消息傳輸類”章節(jié)。文件傳輸類:兩個節(jié)點之間的文件傳輸。支持PUT和GET傳輸方式,文件的斷點續(xù)傳。參考“使用文件傳輸類”章節(jié)音頻傳輸類:實時捕捉和傳輸音頻。支持兩點對話模式和多點會議模式。支持會議發(fā)言控制,實時音量變化顯示,音頻錄制。參考“使用音頻傳輸類”章節(jié)視頻傳輸類:實時捕捉和傳輸視頻。支持本地預(yù)覽模式、兩點對話模式和多點會議模式。支持會議模式中視頻的加入/離開,視頻顯示窗口的調(diào)整

4、和轉(zhuǎn)移,抓拍視頻照片,視頻錄制。參考“使用視頻傳輸類”章節(jié)。白板共享類:多個節(jié)點共享白板,可設(shè)置繪制每種圖形的參數(shù),可設(shè)置繪制每種圖形時的鼠標(biāo)光標(biāo),保存白板內(nèi)容到圖片文件,從圖片文件裝入內(nèi)容到白板。參考“使用白板共享類”章節(jié)。文件分塊共享類:類似BitTorrent和eMule,多個節(jié)點以分塊的方式對等傳輸文件。順序傳輸模式,分散傳輸模式,可設(shè)置文件傳輸?shù)臄?shù)據(jù)塊大小,實時將獲取到的文件數(shù)據(jù)轉(zhuǎn)發(fā)到本地HTTP服務(wù)器上以便使用播放器或瀏覽器來播放文件。參考“使用文件分塊共享類”章節(jié)。數(shù)據(jù)表傳輸類:多個節(jié)點之間用訪問數(shù)據(jù)庫的方式傳輸數(shù)據(jù)。支持文件傳輸模式,每個文件對應(yīng)到數(shù)據(jù)表的一條記錄進行傳輸,實現(xiàn)

5、文件的批量同步。參考“使用數(shù)據(jù)表傳輸類”章節(jié)。媒體流直播類:多個節(jié)點之間對等直播媒體流。支持實時捕捉音頻流、實時捕捉視頻流和AVI文件播放的方式提供媒體源。支持媒體源的快速切換,丟幀重傳,自動選擇網(wǎng)絡(luò)狀況好的節(jié)點進行中繼轉(zhuǎn)發(fā)。支持媒體流錄制。參考“使用媒體流直播類”章節(jié)。3) 自適應(yīng)的網(wǎng)絡(luò)互通機制以IPV4和IPV6的UDP協(xié)議為基礎(chǔ)進行網(wǎng)絡(luò)通信。對于UDP協(xié)議通信受限的節(jié)點,通過承載在TCP之上的隧道連接到中繼服務(wù)器,然后轉(zhuǎn)換成UDP協(xié)議通信。支持TCP、HTTP和WebSocket三種協(xié)議的隧道,以適應(yīng)多種通信環(huán)境。通過中繼服務(wù)器還可以完成 IPV4和IPV6之間的轉(zhuǎn)換。支持位于IPV4私

6、網(wǎng)中的節(jié)點的NAT穿越,自動探測NAT會話的老化時間,以恰當(dāng)?shù)臅r間間隔刷新NAT會話,防止老化。各種協(xié)議之間的轉(zhuǎn)換互通,由Socket適配層自動適應(yīng),對上層通信對象透明。參考“配置和運行中繼服務(wù)器”章節(jié)。一個通信節(jié)點只占用一個UDP端口,并此端口上實現(xiàn)出多點通信機制,因此占用防火強或NAT的會話資源少。支持HTTP代理方式通信,在代理后面的主機也能連接到Peergine網(wǎng)絡(luò)。實現(xiàn)QOS機制,每個節(jié)點都有4個優(yōu)先級隊列,分別對消息/信令、音頻、視頻和文件4種流量進行優(yōu)先級調(diào)度,保證高優(yōu)先級流量的服務(wù)質(zhì)量。支持對通信數(shù)據(jù)進行加密,加密的密鑰自動協(xié)商生成,無需配置。4) 控件提供豐富的輔助功能Pee

7、rgine在封裝成控件時,又增加實現(xiàn)了輔助功能,包括常用的文件操作、文件緩沖區(qū)操作、本地Cookie存儲、本地HTTP服務(wù)器、AVI文件播放等。這些輔助功能通過命令執(zhí)行函數(shù)utilCmd()來調(diào)用。請參考“控件的命令列表”章節(jié)。5) 多種OS和運行環(huán)境Peergine封裝成了ActiveX控件、NPAPI插件和JNI插件等接口形式,可以運行在Internet Explorer、Chrome、Firefox和Safari瀏覽器中,以及Windows Script Host和Java Runtime Enviroment運行環(huán)境中。 支持Windows、Linux和Android操作系統(tǒng)。可用Ja

8、vaScript和Java編程語言構(gòu)建Web應(yīng)用的瀏覽器端和服務(wù)器端。各種OS和運行環(huán)境的支持情況及路標(biāo)如下表:運行環(huán)境OSWindowsLinuxAndroidMac OS XiOSInternet Explorer-Chrome2012Q22012Q2Firefox2012Q22012Q2Safari-2012Q22012Q2Java (JNI)-3. 基于對象的多點通信會話1) 概念在以往的網(wǎng)絡(luò)編程方法中,例如,TCP連接、SIP會話等,通信會話一般指兩點之間協(xié)商建立起來的通信交互。且也已經(jīng)有了相應(yīng)成熟的網(wǎng)絡(luò)編程模型,例如Socket API。但在對等通信應(yīng)用中,通信交互往往是多點對多點

9、的,而且參與通信交互的節(jié)點會動態(tài)變化。如果依然使用兩點通信的模型去搭建對等通信應(yīng)用,那將是相當(dāng)復(fù)雜、困難的事情,需要富有經(jīng)驗的網(wǎng)絡(luò)編程人員才能完成。我們能否找到一種方法,讓對等通信編程也變得直觀、簡單呢?其實,人們使用網(wǎng)絡(luò)的行為可以簡單表達為一句話:“多個人通過網(wǎng)絡(luò)連接在一起做同一件事”。比如,多個人在一個聊天室里交談、多個人在頂一個帖子、多個人在觀看一個視頻等等。我們可以把其中的“多個人”抽象為多個通信節(jié)點,“同一件事”抽象為一個通信會話,也就是把使用網(wǎng)絡(luò)的行為抽象為一個“多點通信會話”。兩點通信會話與多點通信會話的比較示意圖,如下:(a)(b)圖1. (a) 兩點通信會話連接,(b) 多點

10、通信會話連接進一步,我們把一個多點通信會話封裝成一個通信對象,用面向?qū)ο蟮姆椒▉肀硎鼍W(wǎng)絡(luò)通信的特征,這樣就使對等網(wǎng)絡(luò)編程變得更加簡單、直觀。Peergine就是這種以通信對象為基礎(chǔ)的對等通信系統(tǒng)。在系統(tǒng)中不同的通信業(yè)務(wù)類型表述為相對應(yīng)的通信對象類,例如消息傳輸類、音頻傳輸類、視頻傳輸類等,而每一個通信對象實例表示一個通信會話。2) 同名通信對象Peergine系統(tǒng)中的一個通信對象通過一個名稱來標(biāo)識。每個通信節(jié)點有一個節(jié)點自身對象,其對象名稱就是節(jié)點的名稱,這個節(jié)點自身對象的名稱必須是整個網(wǎng)絡(luò)中唯一的。在每個通信節(jié)點上除了節(jié)點自身對象以外,還可以創(chuàng)建多個各種類型的通信對象,這些通信對象的名稱必須

11、在本節(jié)點范圍內(nèi)唯一。在不同的通信節(jié)點上就可以存在名稱相同的通信對象,我們把這樣的一套通信對象稱為“同名通信對象”。在Peergine系統(tǒng)中,一套同名通信對象就是一個多點通信會話。位于不同節(jié)點上的相同名稱的通信對象之間自動地建立起通信會話,然后在其中一個節(jié)點上調(diào)用該對象的方法,就可以完成與其它各節(jié)點之間的通信交互。同名通信對象建立通信會話的過程,稱為“通信對象的同步”。如下圖,有NodeA、NodeB、NodeC三個節(jié)點,它們的自身對象分別為 NodeA、NodeB、NodeC。在節(jié)點NodeA可以創(chuàng)建一個節(jié)點對象NodeB與節(jié)點NodeB的自身對象同名,這時節(jié)點NodeA上的NodeB和節(jié)點N

12、odeB的自身對象就是同名通信對象,它們之間自動建立會話連接。同樣節(jié)點NodeA、NodeB、NodeC上都有通信組對象Group0和消息傳輸對象Data0,它們都組成相應(yīng)的同名通信對象。節(jié)點NodeA節(jié)點NodeB節(jié)點NodeC自身對象NodeA節(jié)點對象NodeB節(jié)點對象NodeC自身對象NodeB節(jié)點對象NodeC節(jié)點對象NodeA自身對象NodeC節(jié)點對象NodeA節(jié)點對象NodeB通信組對象Group0成員NodeA成員NodeB成員NodeC通信組對象Group0成員NodeA成員NodeB成員NodeC通信組對象Group0成員NodeA成員NodeB成員NodeC消息傳輸對象Da

13、ta0關(guān)聯(lián)Group0消息傳輸對象Data0關(guān)聯(lián)Group0消息傳輸對象Data0關(guān)聯(lián)Group0圖2. 同名通信對象機制3) 通信范圍控制當(dāng)很多節(jié)點上都有名稱相同的通信對象時,如何確定哪些節(jié)點上的同名通信對象才能組成一個多點通信會話呢?這就涉及到同名通信對象的通信范圍問題。在Peergine系統(tǒng)中有兩種可以用來確定通信范圍的通信對象,它們分別是節(jié)點對象和通信組對象。對于節(jié)點對象,它的通信范圍由對象名稱決定。例如上圖中,在節(jié)點NodeA上創(chuàng)建節(jié)點對象NodeB,它跟節(jié)點NodeB的自身對象同名,所以它的通信范圍就是節(jié)點B。使用節(jié)點對象可以建立兩點之間的通信會話。對于通信組對象,它的通信范圍由它

14、所包含的組成員決定。通信組對象的成員就是其通信范圍內(nèi)的節(jié)點的自身對象的名稱。添加或刪除通信組對象的成員可以改變通信組的通信范圍。使用通信組對象可以建立多點之間的通信會話。對于其它業(yè)務(wù)類型的通信對象,例如消息傳輸對象、文件傳輸對象,它們沒有控制通信范圍的機制,則可以通過關(guān)聯(lián)節(jié)點對象或通信組對象來控制通信范圍。當(dāng)它們關(guān)聯(lián)節(jié)點對象時,實現(xiàn)兩點之間的通信交互,當(dāng)它們關(guān)聯(lián)通信組對象時,實現(xiàn)多點之間的通信交互。一個節(jié)點對象或通信組對象可以被多個通信對象關(guān)聯(lián)。參考“使用通信組類”章節(jié)。4.控件與應(yīng)用程序的交互方式1) 系統(tǒng)概述Peergine中間件的系統(tǒng)框圖如下,它位于應(yīng)用程序和網(wǎng)絡(luò)層的中間。上方通過控件提

15、供的API與應(yīng)用程序交互,下方通過OS的Socket API與網(wǎng)絡(luò)協(xié)議棧交互。應(yīng)用程序/頁面 pgATX控件視頻I/O音頻I/O文件I/O白板I/OAVI I/OHTTP SVR節(jié)點類通信組類消息傳輸類文件傳輸類白板共享類文件分塊共享類音頻傳輸類視頻傳輸類數(shù)據(jù)表傳輸類媒體流直播類通信對象管理網(wǎng)絡(luò)層UDP v4/6TCP v4/6TCP、HTTP和WebSocket隧道Socket適配層輔助命令圖3. 系統(tǒng)框圖調(diào)用通信對象類的方法時,應(yīng)用程序與pgATX控件之間的交互通過4個編程接口來完成。分別為發(fā)送請求ObjectRequest()、接收請求OnExtRequest()、發(fā)送應(yīng)答ObjectE

16、xtReply()和接收應(yīng)答OnReply(),其中OnExtRequest()和OnReply()是回調(diào)函數(shù),需要在控件初始化時注冊才能使用。但并不是所有的方法的調(diào)用都需要4個函數(shù)的交互過程,有些方法只需要其中1個或2個函數(shù)的交互。Peergine系統(tǒng)用到的交互方式由下文的小章節(jié)逐個說明。2) 方式1:本端應(yīng)用程序發(fā)送請求、接收應(yīng)答。對端應(yīng)用程序接收請求、發(fā)送應(yīng)答。應(yīng)用程序pgAtx控件pgAtx控件應(yīng)用程序pgAtx.ObjectRequest()pgAtx.OnExtRequest()pgAtx.ObjectExtReply()pgAtx.OnReply()網(wǎng)絡(luò)發(fā)送請求接收請求發(fā)送應(yīng)答接

17、收應(yīng)答節(jié)點A節(jié)點B圖4. 交互方式13) 方式2:本端應(yīng)用程序發(fā)送請求、接收應(yīng)答。對端控件接收請求、發(fā)送應(yīng)答。應(yīng)用程序pgAtx控件pgAtx控件應(yīng)用程序pgAtx.ObjectRequest()pgAtx.OnReply()網(wǎng)絡(luò)發(fā)送請求接收應(yīng)答節(jié)點A節(jié)點B圖5. 交互方式24) 方式3:本端控件發(fā)送請求、接收應(yīng)答。對端應(yīng)用程序接收請求、發(fā)送應(yīng)答。應(yīng)用程序pgAtx控件pgAtx控件應(yīng)用程序pgAtx.OnExtRequest()pgAtx.ObjectExtReply()網(wǎng)絡(luò)接收請求發(fā)送應(yīng)答節(jié)點A節(jié)點B圖6. 交互方式32) 方式4:本端應(yīng)用程序發(fā)送請求。對端應(yīng)用程序接收請求。應(yīng)用程序pgA

18、tx控件pgAtx控件應(yīng)用程序pgAtx.ObjectRequest()pgAtx.OnExtRequest()發(fā)送請求接收請求節(jié)點A節(jié)點B網(wǎng)絡(luò)圖7. 交互方式45) 方式5:本端應(yīng)用程序發(fā)送請求,本端應(yīng)用程序接收應(yīng)答。應(yīng)用程序pgAtx控件pgAtx.ObjectRequest()pgAtx.OnReply()發(fā)送請求接收應(yīng)答節(jié)點A圖8. 交互方式56) 方式6:本端應(yīng)用程序發(fā)送請求觸發(fā)本端控件上報事件給應(yīng)用。應(yīng)用程序pgAtx控件pgAtx.ObjectRequest()pgAtx.OnExtRequet()發(fā)送請求觸發(fā)上報節(jié)點A圖9. 交互方式67) 方式7:本端應(yīng)用程序調(diào)用本端控件的方

19、法但沒有輸出。應(yīng)用程序pgAtx控件pgAtx.ObjectRequest()發(fā)送請求節(jié)點A圖10. 交互方式78) 方式8:本端控件自行上報事件給應(yīng)用程序。應(yīng)用程序pgAtx控件pgAtx.OnExtRequet()自行上報節(jié)點A圖11. 交互方式85. 常用的數(shù)據(jù)格式1) 地址的格式Peergine 系統(tǒng)中使用的地址格式為:X:X:X:X:Port:Info,其中4個X分別為32bit整數(shù)、HEX格式,Port為端口號,Info為選項信息(未使用)。此地址格式可以表示IPV4的地址端口和IPV6的地址端口。IPV4的地址端口樣例:0:0:0:7F000001:80:0或0:0:0:127.

20、0.0.1:80:0。IPV6的地址端口樣例:FE800000:0:01B05996:42CFB70D:80:0。IPV4和IPV6地址格式到Peergine地址格式的對應(yīng)關(guān)系如下圖:0007F00000180080:圖12. IPV4地址到Peergine地址的對應(yīng)關(guān)系FE800000001B0599642CFB70D80080FE8000001B0599642CFB70D:圖13. IPV6地址到Peergine地址的對應(yīng)關(guān)系2) 時間的格式Peergine系統(tǒng)中使用的時間格式為:YYYY-MM-DD,HH:MM:SS。樣例:2011-10-22,18:20:09。3)

21、文件摘要的格式Peergine 系統(tǒng)中使用的文件摘要格式為:SHA256算法生成,Base64編碼。4) 視頻窗口的參數(shù)格式Peergine 系統(tǒng)中使用的視頻窗口參數(shù)格式為:(PosX)0(PosY)0(SizeX)80(SizeY)60(Handle) 343454。其中,PosX和PosY為視頻左上角在窗口中的坐標(biāo),SizeX和SizeY為視頻的尺寸,Handle為窗口的句柄。SDK的安裝使用說明1. Windows平臺:ActiveX控件:可執(zhí)行文件為pgATX.ocx,使用regsvr32命令注冊后就可以在瀏覽器和WSH中調(diào)用Peergine的API。NPAPI插件:可執(zhí)行文件為npp

22、gnpp.dll,復(fù)制到Chrome、Firefox和Safari的plugins目錄后就可以在瀏覽器中調(diào)用Peergine的API。JNI插件:可執(zhí)行文件為pgJNI.dll,將其路徑添加到PATH環(huán)境變量中。JNI類庫:pgJNILib.jar包文件,包含了pgJNI、pgJNINode和pgJNINodeProc共3個java類。將其路徑添加到CLASSPATH環(huán)境變量中,就可以在Java應(yīng)用程序中調(diào)用Peergine的API。2. Linux平臺:NPAPI插件:可執(zhí)行文件為libpgnpp-plugin.so,復(fù)制到/usr/lib/mozilla/plugins目錄后就可以在瀏覽器

23、中調(diào)用Peergine的API。JNI插件:可執(zhí)行文件為libpgJNI.so,將其路徑添加到PATH環(huán)境變量中。JNI類庫:pgJNILib.jar包文件,包含了pgJNI、pgJNINode和pgJNINodeProc共3個java類。將其路徑添加到CLASSPATH環(huán)境變量中,就可以在Java應(yīng)用程序中調(diào)用Peergine的API。3. Android平臺:安裝包:peergine_clt_android.apk,包含了NPAPI插件和JNI插件的可執(zhí)行文件,直接執(zhí)行安裝之后可以使用。JNI類庫:提供了pgLibJNINode.java和pgLibJNINodeProc.java兩個類的

24、源代碼,可以直接添加到應(yīng)用的代碼工程中就可以調(diào)用Peergine的API。配置和運行中繼服務(wù)器1. 關(guān)于Peergine使用UDP協(xié)議進行通信(如下圖)。節(jié)點A節(jié)點BUDP v4/v6圖14. 直接UDP通信方式但在實際網(wǎng)絡(luò)環(huán)境中,某些節(jié)點的UDP通信是受限的。例如,這些節(jié)點位于防火墻的后面,而防火墻把UDP端口全部封鎖。慶幸的是防火墻不會封鎖所有網(wǎng)絡(luò)的訪問權(quán)限,一般來說防火墻會保留對Web的訪問。Web應(yīng)用通常使用HTTP(80端口)和HTTPS(443端口)協(xié)議通信,這兩種協(xié)議都基于TCP協(xié)議。依此,Peergine提供了一個中繼服務(wù)器程序,在TCP協(xié)議之上實現(xiàn)TCP、HTTP和WebSo

25、cket三種協(xié)議的隧道功能(如下圖)。UDP通信受限的節(jié)點能通過隧道連接到中繼服務(wù)器,然后轉(zhuǎn)換成UDP通信再跟其他節(jié)點互通。(注:WebSocket的二進制傳輸標(biāo)準(zhǔn)W3C還沒有制訂完成,所以該協(xié)議的隧道還沒有實現(xiàn))中繼服務(wù)器節(jié)點A節(jié)點B TCP/HTTP/WebSocket隧道Over TCP v4/v6UDP v4/v6圖15. 通過TCP隧道中繼轉(zhuǎn)成UDP通信方式IPV4網(wǎng)絡(luò)的地址已經(jīng)耗盡了,IP網(wǎng)絡(luò)正處于IPV4到IPV6的過渡過程中,所以這兩種協(xié)議在網(wǎng)絡(luò)中是共存的。但IPV4和IPV6是不兼容的,它們之間需要某種機制進行轉(zhuǎn)換后才能互通。Peergine中繼服務(wù)器提供了IPV4和IPV6

26、的轉(zhuǎn)換功能,使IPV4節(jié)點與IPV6節(jié)點之間也能互通。2. 配置運行Peergine中繼服務(wù)器的可執(zhí)行文件為pgRelay.exe,缺省的配置文件為pgRelay.cfg。缺省配置文件必須放在與pgRelay.exe相同的目錄下。配置文件是一個OML格式的文本文件,可以使用文本編輯器打開編輯。如果使用其他配置文件,可以通過pgRelay.exe的命令行參數(shù)指定其他配置文件的路徑。例如,在命令行提示符下執(zhí)行:c:>pgRelay.exe “c:PeerginebinpgRelay1.cfg”。中繼服務(wù)器的配置文件的結(jié)構(gòu)如下:(MaxThread)16 /最大的轉(zhuǎn)發(fā)線程數(shù)目(每個線程最多允許

27、32條TCP連接)。(ListenList) /偵聽端口列表,可以配置最多32個偵聽端口。 (Name1) /偵聽端口1 (Type)0 /隧道類型:TCP隧道 (AddrListen)FE800000:0:01B05996:42CFB70D:7777:0 /TCP偵聽地址/端口(這是個IPV6地址) (AddrUDP4)0:0:0::0:0 /轉(zhuǎn)換成UDP后的IPV4地址,端口自動分配。 (AddrUDP6)FE800000:0:01B05996:42CFB70D:0:0 /轉(zhuǎn)換成UDP后的IPV6地址,端口自動分配。 (Name2) /偵聽端口2 (Type)1 /隧道類

28、型:HTTP隧道 (AddrListen)0:0:0::8888:0 /TCP偵聽地址/端口(這是個IPV4地址) (AddrUDP4)0:0:0::0:0 /轉(zhuǎn)換成UDP后的IPV4地址,端口自動分配。 (AddrUDP6)FE800000:0:01B05996:42CFB70D:0:0 /轉(zhuǎn)換成UDP后的IPV6地址,端口自動分配。 (Node) / 登錄到集群服務(wù)器的參數(shù),用來搭建中繼服務(wù)器的集群功能(未實現(xiàn))。 (SvrName)PGServer (SvrAddr)0:0:0::1112:0 (CltAddr)0:0:0:127.0

29、.0.1:1118:0 (User)pgRelay1 (Pass) (RefPeer)Peergine中繼服務(wù)器應(yīng)該部署在具有公網(wǎng)IP地址且所有節(jié)點都能到達的網(wǎng)絡(luò)主機上。如果要使用IPV4和IPV6的轉(zhuǎn)換功能,該網(wǎng)絡(luò)主機必須具備IPV4和IPV6雙棧,且IPV4和IPV6網(wǎng)絡(luò)都能到達。如何使用pgATX控件編程1. 使用控件的編程接口1)初始化控件有兩種方式創(chuàng)建pgATX控件的實例:HTML的<object>標(biāo)簽和JavaScript的ActiveXObject()函數(shù)。控件運行在瀏覽器中時,建議用HTML的<object>標(biāo)簽創(chuàng)建,這種方式不僅可以使用控件的所有功能,

30、還可以使用控件的窗口來顯示視頻和白板。代碼示例(HTML):<object id="pgAtx"classid="clsid:FFC9369F-A8D9-4598-8E22-ED07C7628BFC" width="320" height="240"></object>控件運行在Windows Script Host中時,使用JavaScript的ActiveXObject()函數(shù)創(chuàng)建,代碼示例(JavaScript):var pgAtx = new ActiveXObject("

31、pgATX.pgATXCtrl");創(chuàng)建控件實例后,通過給控件的配置屬性變量賦值進行配置,然后調(diào)用Start()函數(shù)啟動控件的節(jié)點功能。代碼示例(JavaScript):pgAtx.Control = "Type=1"pgAtx.Node = "Type=0"pgAtx.Class = "PG_CLASS_Data:8;PG_CLASS_File:64;PG_CLASS_Audio:8;PG_CLASS_Video:8"pgAtx.Local = "Addr=0:0:0::0:0"pgA

32、tx.Server = "Name=PGServer;Addr=0:0:0::1112:0"pgAtx.Relay = "(Relay0)(Type)1(Load)0(Addr)FE800000:0:01B05996:42CFB70D:7777:0"pgAtx.OnExtRequest = pgOnExtRequest;pgAtx.OnReply = pgOnReply;if (!pgAtx.Start(0) alert("Initialize failed");請參考“控件的屬性配置項”章節(jié)。2) 使用通信對象初始

33、化控件實例之后,就可以使用控件的節(jié)點功能函數(shù)。用ObjectAdd()函數(shù)創(chuàng)建通信對象,用ObjectDelete()刪除通信對象。用ObjectSetGroup()函數(shù)設(shè)置或修改通信對象的關(guān)聯(lián)通信組。雖然在ObjectAdd()函數(shù)中已經(jīng)指定了通信對象的關(guān)聯(lián)通信組,但可以使用此函數(shù)進行修改。如果指定的通信組參數(shù)為空,則取消與通信組關(guān)聯(lián)。通信對象在創(chuàng)建之后或用ObjectSetGroup()修改關(guān)聯(lián)通信組之后會自動與通信范圍內(nèi)的其他節(jié)點上的同名通信對象進行同步。但由于網(wǎng)絡(luò)不穩(wěn)定或者通信對象創(chuàng)建的先后順序等因素,會導(dǎo)致同步失敗。這時可以使用ObjectSync()函數(shù)主動觸發(fā)通信對象進行同步。通

34、信對象同步以后,就可以調(diào)用通信對象的方法。需要ObjectRequest()、ObjectExtReply()、OnExtRequest()和OnReply()這4 個函數(shù)配合才可以完成一次方法的調(diào)用。其中OnExtRequest()和OnReply()是回調(diào)函數(shù),需要在控件初始化時注冊,請參考“控件的屬性配置項”章節(jié)。首先請求端節(jié)點的應(yīng)用程序調(diào)用控件的ObjectRequest()函數(shù)發(fā)起請求,控件通過網(wǎng)絡(luò)交互發(fā)送請求數(shù)據(jù)到接收端節(jié)點,接收端節(jié)點的控件回調(diào)OnExtRequest()函數(shù)上報請求給應(yīng)用程序。應(yīng)用程序處理完請求后調(diào)用控件的ObjectExtReply()函數(shù)發(fā)送應(yīng)答,控件通過網(wǎng)

35、絡(luò)交互發(fā)送應(yīng)答數(shù)據(jù)給請求端節(jié)點,請求端節(jié)點的控件回調(diào)OnReply()函數(shù)上報應(yīng)答給應(yīng)用程序。這樣就完成了一次方法的調(diào)用。參考“pgATX控件與應(yīng)用程序的交互方式”章節(jié)和“簡單聊天室例子”章節(jié)。3) 處理消息循環(huán)控件與應(yīng)用程序的交互過程需要通過系統(tǒng)的消息隊列投遞消息。當(dāng)控件運行在界面線程中 (例如運行在瀏覽器中)時,界面線程能夠處理消息循環(huán)。但運行在Windows Script Host中時,線程沒有消息循環(huán),無法完成交互消息的投遞。這時就需要應(yīng)用程序調(diào)用控件的PumpMessage()函數(shù)主動處理消息隊列。代碼示例(JavaScript):while (pgAtx.PumpMessage(0

36、) / DO TO4) 使用OML解析器調(diào)用控件的通信對象的方法時,輸入、輸出的參數(shù)都是OML格式。控件提供了一組OML解析器函數(shù)來輔助構(gòu)造和解析OML字符串。請參考“控件的OML解析器函數(shù)”和“對象標(biāo)記語言(OML)”章節(jié)。OML解析器的每個函數(shù)都是無狀態(tài)的,函數(shù)之間也沒有關(guān)聯(lián)。函數(shù)的每一次調(diào)用都是獨立的,調(diào)用完成后通過返回值輸出處理后的OML字符串。5) 獲取控件的窗口參數(shù)控件運行在瀏覽器中時,一個重要用途是做為視頻顯示和白板共享的窗口。控件提供了輔助函數(shù)utilGetWndRect()來獲取控件窗口的尺寸和句柄,以便用來初始化視頻或白板窗口。6) 使用控件的輔助命令在構(gòu)建應(yīng)用程序的過程中

37、,除了網(wǎng)絡(luò)通信外,還需要調(diào)用操作系統(tǒng)的某些資源或功能才能構(gòu)成完整的應(yīng)用程序。控件提供了一些常用的輔助功能,例如,常用文件操作、文件緩沖區(qū)操作、本地HTTP服務(wù)器控制和AVI文件播放等。通過輔助函數(shù)utilCmd()來調(diào)用這些輔助功能。請參考“控件的命令列表”章節(jié)。7)使用安全沙盒目錄Peergine是一個對等通信中間件,不可避免地要訪問本地的文件系統(tǒng)。比如,發(fā)送接收文件、緩存文件等。為了防止某些惡意的應(yīng)用程序使用Peergine進行偷竊用戶數(shù)據(jù)、傳輸惡意代碼等不良操作,Peergine通過使用沙盒目錄來控制文件系統(tǒng)的訪問范圍。控制規(guī)則如下:(1) 所有涉及到網(wǎng)絡(luò)傳輸?shù)奈募L問都限制在沙盒目錄內(nèi)

38、。(2)本地的文件操作,可以訪問沙盒目錄之外的文件。比如,拍攝照片保存到本地文件,裝載本地圖片到白板中。在下文各個功能的編程參考章節(jié)中,涉及訪問文件系統(tǒng)時,將會逐個說明是否受到沙盒目錄限制。缺省情況下,沙盒目錄是當(dāng)前用戶的“Documents”目錄下的“Peergine”目錄。可以通過控件的右鍵菜單或Setting()命令彈出設(shè)置對話框,讓用戶修改沙盒目錄的父目錄位置。注:沙盒目錄必須具有:創(chuàng)建、刪除、寫、讀等文件操作的權(quán)限,否則Peergine的某些功能將失效。沙盒目錄中的文件的移入和移出通過FileCopy()命令完成,F(xiàn)ileCopy()的Src參數(shù)和Dst參數(shù)的使用規(guī)則如下:(1) S

39、rc和Dst都指定了文件路徑(非空),則Src和Dst指定的文件都必須在沙盒目錄內(nèi),否則命令調(diào)用執(zhí)行失敗。(2) Src指定了文件路徑且Dst為空,則Src指定的文件必須在沙盒目錄內(nèi)。當(dāng)命令執(zhí)行時,Peergine彈出文件對話框,讓用戶選擇Dst文件路徑,進行文件移出操作。(3) Src為空且Dst指定了文件路徑,則Dst指定的文件必須在沙盒目錄內(nèi)。當(dāng)命令執(zhí)行時,Peergine彈出文件對話框,讓用戶選擇Src文件路徑,進行文件移入操作。注:如果使用Peergine之外的途徑移入/移出文件,則 Peergine將無法保證其安全性。比如,使用控制臺copy命令復(fù)制文件,在資源管理器里手工復(fù)制、粘

40、貼文件,或者調(diào)用操作系統(tǒng)API復(fù)制文件等。2. 使用節(jié)點類(PG_CLASS_Peer)1) 創(chuàng)建節(jié)點對象動態(tài)節(jié)點對象:創(chuàng)建節(jié)點對象時不帶任何選項,所創(chuàng)建的就是一個動態(tài)節(jié)點對象。在通信組對象添加成員時,如果該成員所對應(yīng)的節(jié)點對象不存在,則系統(tǒng)自動創(chuàng)建一個對應(yīng)的動態(tài)節(jié)點對象。所以,動態(tài)節(jié)點對象一般都由系統(tǒng)自動創(chuàng)建,無須直接調(diào)用控件的API創(chuàng)建。請參考“使用通信組類”章節(jié)。動態(tài)節(jié)點對象創(chuàng)建后,系統(tǒng)使用PG_METH_PEER_Status方法從登錄服務(wù)器獲取該節(jié)點的地址,并配置該動態(tài)節(jié)點對象的網(wǎng)絡(luò)資源。靜態(tài)節(jié)點對象:創(chuàng)建靜態(tài)節(jié)點對象使用PG_ADD_PEER_Static選項。靜態(tài)節(jié)點對象不會從登

41、錄服務(wù)器獲取地址,需要調(diào)用PG_METH_PEER_SetAddr方法來設(shè)置地址。登錄服務(wù)器節(jié)點對象:創(chuàng)建登錄服務(wù)器節(jié)點對象使用PG_ADD_PEER_Server選項。在一個節(jié)點上只能有一個登錄服務(wù)器節(jié)點對象,如果創(chuàng)建第二個,則前面一個自動銷毀。在實際使用中不需要直接創(chuàng)建登錄服務(wù)器節(jié)點對象,而是在控件初始化時,由系統(tǒng)自動創(chuàng)建。代碼示例(JavaScript):pgAtx.Control = "Type=1"pgAtx.Node = "Type=0" / 作為普通節(jié)點pgAtx.Class = "PG_CLASS_Data:8;PG_CLASS

42、_File:64;PG_CLASS_Audio:8;PG_CLASS_Video:8"pgAtx.Local = "Addr=0:0:0::0:0"/ Name參數(shù)指定登錄服務(wù)器節(jié)點對象的名稱,Addr參數(shù)指定登錄服務(wù)器節(jié)點的地址。pgAtx.Server = "Name=PGServer;Addr=0:0:0::1112:0"pgAtx.Relay = "(Relay0)(Type)1(Load)0(Addr)FE800000:0:01B05996:42CFB70D:7777:0"pgA

43、tx.OnExtRequest = pgOnExtRequest;pgAtx.OnReply = pgOnReply;pgAtx.Start(0);節(jié)點自身對象:創(chuàng)建登錄服務(wù)器節(jié)點對象使用PG_ADD_PEER_Self選項。在一個節(jié)點上只能有一個節(jié)點自身對象,如果創(chuàng)建第二個,則前面一個自動銷毀。在實際使用中不需要直接創(chuàng)建節(jié)點自身對象,而是在控件初始化或調(diào)用登錄方法時,有系統(tǒng)自動創(chuàng)建。節(jié)點作為登錄服務(wù)器節(jié)點(服務(wù)器端)時,在控件初始化時創(chuàng)建節(jié)點自身對象,代碼示例(JavaScript):pgAtx.Control = “Type=1”;pgAtx.Node = “Type=1”; / 作為登錄

44、服務(wù)器節(jié)點/ Name參數(shù)指定節(jié)點自身對象的名稱,Addr參數(shù)指定節(jié)點的地址。pgAtx.Local = “Name= PGServer;Addr=0:0:0::1112:0”;pgAtx.OnExtRequest = pgOnExtRequest;pgAtx.OnReply = pgOnReply;pgAtx.Start(0);節(jié)點作為普通節(jié)點(客戶端)時,在調(diào)用登錄方法時創(chuàng)建節(jié)點自身對象,代碼示例(JavaScript):/ User參數(shù)指定節(jié)點自身對象的名稱,節(jié)點的地址由系統(tǒng)自動分配。var sData = "(User)UserName000(Pass)(P

45、aram)"var uErr = pgAtx.ObjectRequest(“PGServer”,32,Data, "Login");2) 簡單的兩點直接通信為了便于開始理解節(jié)點對象,我們編寫一個兩點直接通信的程序。代碼示例(JavaScript):<object id="pgAtx"classid="clsid:FFC9369F-A8D9-4598-8E22-ED07C7628BFC" width="0" height="0"></object><scri

46、pt language="javascript">/ 初始化控件實例。pgAtx.Control = “Type=1”;pgAtx.Node = “Type=1”;pgAtx.Local = “Name=” + sLocalName + “;Addr=” + sLocalAddr;pgAtx.OnExtRequest = pgOnExtRequest;pgAtx.OnReply = pgOnReply;pgAtx.Start(0);/ 創(chuàng)建對端節(jié)點對象,并設(shè)置地址。pgAtx.ObjectAdd(sRemoteName, “PG_CLASS_Peer”, “”, 0x

47、4);var sInEle = “(Addr)“ + sRemoteAddr + “(Proxy)”;pgAtx.ObjectRequest(sRemoteName, 37, sInEle, “SetAddr”);/ 給對端節(jié)點發(fā)送消息“Hello!”。pgAtx.ObjectRequest(sRemoteName, 36, “Hello!”, “SendMsg”);/ 回調(diào)函數(shù)。function pgOnExtRequest(sObj, uMeth, sData, uHandle, sPeer) if (sObj = sLocalName && uMeth = 36) ale

48、rt(sData); / 顯示接收到的“Hello!”消息 function pgOnReply(sObj, uErr, sData, sParam) </script>但是,這個程序在實際中很難使用,因為要事先知道對端節(jié)點的網(wǎng)絡(luò)地址。對此,Peergine提供了自動交換節(jié)點網(wǎng)絡(luò)地址的方法,請看參考下文的“登錄、注銷和地址解析”章節(jié)。3) 登錄、注銷和地址解析在Peergine系統(tǒng)中,通信節(jié)點是用節(jié)點對象的名稱來標(biāo)識的,但在通信過程中需要根據(jù)節(jié)點的網(wǎng)絡(luò)地址來傳輸報文。所以,需要一種機制把節(jié)點對象名稱轉(zhuǎn)換成節(jié)點的網(wǎng)絡(luò)地址(也稱為地址解析)。Peergine提供了一種特殊的通信節(jié)點(登

49、錄服務(wù)器節(jié)點),用來完成地址解析功能。在控件初始化時,把Node配置項的Type參數(shù)賦值為1,則該節(jié)點就是登錄服務(wù)器節(jié)點。登錄服務(wù)器節(jié)點比普通節(jié)點增加了以下幾點功能:(1) 接受其他普通節(jié)點的登錄、驗證賬號和記錄登錄狀態(tài)。(2) 處理其他普通節(jié)點的地址解析請求,返回指定節(jié)點的地址信息和登錄狀態(tài)。(3) 協(xié)助普通節(jié)點處理NAT穿越和中繼隧道類型的協(xié)商。普通節(jié)點通過調(diào)用登錄服務(wù)器節(jié)點對象的PG_METH_PEER_Login和PG_METH_PEER_Logout方法來請求登錄和注銷。當(dāng)在普通節(jié)點上創(chuàng)建了一個新的節(jié)點對象時,控件會自行調(diào)用登錄服務(wù)器節(jié)點對象的PG_METH_PEER_Status方

50、法來解析該節(jié)點的地址信息和登錄狀態(tài)。如果解析返回該節(jié)點已經(jīng)登錄,則與該節(jié)點建立通信會話。注:PG_METH_PEER_Login和PG_METH_PEER_Logout方法只能在登錄服務(wù)器節(jié)點對象上調(diào)用,在其他節(jié)點對象上調(diào)用這兩個方法將返回失敗。4) 遠程過程調(diào)用調(diào)用節(jié)點類的PG_METH_PEER_Call方法可進行兩個節(jié)點之間的遠程過程調(diào)用,該方法的請求參數(shù)和應(yīng)答參數(shù)的內(nèi)容由應(yīng)用程序定義,控件透明傳輸。5) 兩點消息傳輸調(diào)用節(jié)點類的PG_METH_PEER_Message方法可進行兩個節(jié)點之間的單向消息傳輸。該方法的請求參數(shù)的內(nèi)容由應(yīng)用程序定義,控件透明傳輸。6) 數(shù)據(jù)的簽名和校驗調(diào)用節(jié)點

51、類的PG_METH_PEER_DigGen方法產(chǎn)生數(shù)據(jù)的簽名,調(diào)用節(jié)點類的PG_METH_PEER_DigVerify方法校驗數(shù)據(jù)的簽名。3. 使用通信組類(PG_CLASS_Group)1) 手動控制成員通過調(diào)用通信組類的PG_METH_GROUP_Modify方法來手動添加、刪除通信組的成員,必須啟用PG_ADD_GROUP_Modify選項后才允許調(diào)用該方法。通信組對象添加成員后,該通信組對象會與其成員所對應(yīng)的節(jié)點上的同名通信組對象建立同步,其成員列表也會復(fù)制到與其成員所對應(yīng)的節(jié)點上的同名通信組對象。舉例說明:有NodeA、NodeB和NodeC三個節(jié)點,它們都有通信組對象Group0,

52、開始Group0的成員列表都是空的。在節(jié)點NodeA上給Group0添加成員“NodeA”、“NodeB”和“NodeC”,則節(jié)點NodeA上的Group0會與節(jié)點NodeB和NodeC上的Group0建立同步,同時節(jié)點NodeA上的Group0的成員列表也復(fù)制到節(jié)點NodeB和NodeC上的Group0,使節(jié)點NodeB和NodeC上的Group0都包含成員“NodeA”、“NodeB”和“NodeC”。當(dāng)然節(jié)點NodeB和NodeC上的Group0都包含了對方節(jié)點作為成員后,它們之間也會建立同步。注:給通信組對象添加一個成員后,如果該成員名稱所對應(yīng)的節(jié)點對象還不存在,則系統(tǒng)會自動創(chuàng)建該節(jié)點

53、對象。2) 自動控制成員Peergine還提供了一種自動控制通信組對象的成員的方法:(1) 當(dāng)一個通信組對象啟用了PG_ADD_GROUP_Refered選項時,則允許其他同名通信組對象引用該通信組對象的成員,它的成員列表將自動復(fù)制到引用它的同名通信組對象。當(dāng)它的成員發(fā)生變化時,會實時地通知給引用它的同名通信組對象。(2) 一個通信組對象引用了另一個通信組對象的成員時,它自身的節(jié)點也同時加入了被引用的通信組對象的成員列表。當(dāng)它取消了引用或被刪除時,它自身的節(jié)點就離開了被引用的通信組對象的成員列表。舉例說明:有NodeA、NodeB和NodeC三個節(jié)點,它們都有通信組對象Group0,開始Gro

54、up0的成員列表都是空的,其中節(jié)點NodeA啟用了PG_ADD_GROUP_Refered選項。節(jié)點NodeB和NodeC上的Group0在創(chuàng)建時指定關(guān)聯(lián)了節(jié)點NodeA,那么節(jié)點NodeB和NodeC就加入了節(jié)點NodeA上的Group0的成員列表,同時節(jié)點NodeA上的Group0的成員列表也復(fù)制到節(jié)點NodeB和NodeC上的Group0。如果節(jié)點NodeB上的Group0取消關(guān)聯(lián)節(jié)點NodeA或被刪除,則節(jié)點NodeB就離開了節(jié)點NodeA上的Group0的成員列表,同時節(jié)點NodeA上的Group0會通知節(jié)點NodeC上的Group0把節(jié)點NodeB從其成員列表中刪除。代碼示例(Ja

55、vaScript):/ 在節(jié)點NodeA上創(chuàng)建Group0,選項為PG_ADD_GROUP_Refered=0x4pgAtx.ObjectAdd(“Group0”, “PG_CLASS_Group”, “”, 0x04);/ 在節(jié)點NodeB和NodeC上創(chuàng)建Group0,關(guān)聯(lián)節(jié)點NodeA。pgAtx.ObjectAdd(“Group0”, “PG_CLASS_Group”, “NodeA”, 0);3) 鄰近成員控制在對等通信場景中,有時候一個通信組內(nèi)的成員會很多,但一個節(jié)點只希望與離它最近的幾個節(jié)點交互。Peergine針對這種情況提供了一種鄰近節(jié)點控制的功能。一個通信組對象啟用了PG_

56、ADD_GROUP_Refered選項作為成員引用對象,如果同時啟用了PG_ADD_GROUP_NearPeer選項,則它就使能了鄰近節(jié)點控制功能。使能了鄰近節(jié)點控制功能通信組對象只把在鄰近范圍內(nèi)的成員復(fù)制到引用它的通信組對象。鄰近范圍的大小缺省為6,可以通過PG_METH_COMMON_SetOption方法的修改。舉例說明:節(jié)點NodeA上的Group0已經(jīng)包含了很多成員,節(jié)點NodeB和NodeC是其中的兩個成員。那么,節(jié)點NodeA上的Group0給節(jié)點NodeB上的Group0復(fù)制了離節(jié)點NodeB最近的6個成員。同樣,節(jié)點NodeA上的Group0給節(jié)點NodeC上的Group0復(fù)制了離節(jié)點NodeC最近的6個成員。以此類推,每個成員節(jié)點上的Group0都復(fù)制到了離該節(jié)點最近的6個成員。4) 主成員控制在某些應(yīng)用場景中,一個通信組中需要有一個權(quán)限更高的成員來管理其他成員。Peergine針對這種情況提供了一種主成員控制功能。通信組對象啟用了PG_ADD_GROUP_Master選項后才可以使用主成員控制功能。通過調(diào)用PG_METH_GROUP_Master方法向通信組內(nèi)的成員公告主成員的名稱,成員接收到公告后,通過返回應(yīng)答的錯誤碼確認(rèn)是否接受該主成員公告。4. 使用消息傳輸類(PG_CLASS_Data)1) 多點消息傳輸節(jié)點類提供兩點之間消息傳輸功能。消息傳輸類提供

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論