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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

19、法但沒(méi)有輸出。應(yīng)用程序pgAtx控件pgAtx.ObjectRequest()發(fā)送請(qǐng)求節(jié)點(diǎn)A圖10. 交互方式78) 方式8:本端控件自行上報(bào)事件給應(yīng)用程序。應(yīng)用程序pgAtx控件pgAtx.OnExtRequet()自行上報(bào)節(jié)點(diǎn)A圖11. 交互方式85. 常用的數(shù)據(jù)格式1) 地址的格式Peergine 系統(tǒng)中使用的地址格式為:X:X:X:X:Port:Info,其中4個(gè)X分別為32bit整數(shù)、HEX格式,Port為端口號(hào),Info為選項(xiàng)信息(未使用)。此地址格式可以表示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地址格式的對(duì)應(yīng)關(guān)系如下圖:0007F00000180080:圖12. IPV4地址到Peergine地址的對(duì)應(yīng)關(guān)系FE800000001B0599642CFB70D80080FE8000001B0599642CFB70D:圖13. IPV6地址到Peergine地址的對(duì)應(yīng)關(guān)系2) 時(shí)間的格式Peergine系統(tǒng)中使用的時(shí)間格式為: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的安裝使用說(shuō)明1. Windows平臺(tái):ActiveX控件:可執(zhí)行文件為pgATX.ocx,使用regsvr32命令注冊(cè)后就可以在瀏覽器和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類庫(kù):pgJNILib.jar包文件,包含了pgJNI、pgJNINode和pgJNINodeProc共3個(gè)java類。將其路徑添加到CLASSPATH環(huán)境變量中,就可以在Java應(yīng)用程序中調(diào)用Peergine的API。2. Linux平臺(tái):NPAPI插件:可執(zhí)行文件為libpgnpp-plugin.so,復(fù)制到/usr/lib/mozilla/plugins目錄后就可以在瀏覽器

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

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

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

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

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

28、型:HTTP隧道 (AddrListen)0:0:0::8888:0 /TCP偵聽(tīng)地址/端口(這是個(gè)IPV4地址) (AddrUDP4)0:0:0::0:0 /轉(zhuǎn)換成UDP后的IPV4地址,端口自動(dòng)分配。 (AddrUDP6)FE800000:0:01B05996:42CFB70D:0:0 /轉(zhuǎn)換成UDP后的IPV6地址,端口自動(dòng)分配。 (Node) / 登錄到集群服務(wù)器的參數(shù),用來(lái)搭建中繼服務(wù)器的集群功能(未實(shí)現(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é)點(diǎn)都能到達(dá)的網(wǎng)絡(luò)主機(jī)上。如果要使用IPV4和IPV6的轉(zhuǎn)換功能,該網(wǎng)絡(luò)主機(jī)必須具備IPV4和IPV6雙棧,且IPV4和IPV6網(wǎng)絡(luò)都能到達(dá)。如何使用pgATX控件編程1. 使用控件的編程接口1)初始化控件有兩種方式創(chuàng)建pgATX控件的實(shí)例:HTML的<object>標(biāo)簽和JavaScript的ActiveXObject()函數(shù)??丶\(yùn)行在瀏覽器中時(shí),建議用HTML的<object>標(biāo)簽創(chuàng)建,這種方式不僅可以使用控件的所有功能,

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

31、pgATX.pgATXCtrl");創(chuàng)建控件實(shí)例后,通過(guò)給控件的配置屬性變量賦值進(jìn)行配置,然后調(diào)用Start()函數(shù)啟動(dòng)控件的節(jié)點(diǎn)功能。代碼示例(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");請(qǐng)參考“控件的屬性配置項(xiàng)”章節(jié)。2) 使用通信對(duì)象初始

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

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

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

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

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

38、。(2)本地的文件操作,可以訪問(wèn)沙盒目錄之外的文件。比如,拍攝照片保存到本地文件,裝載本地圖片到白板中。在下文各個(gè)功能的編程參考章節(jié)中,涉及訪問(wèn)文件系統(tǒng)時(shí),將會(huì)逐個(gè)說(shuō)明是否受到沙盒目錄限制。缺省情況下,沙盒目錄是當(dāng)前用戶的“Documents”目錄下的“Peergine”目錄。可以通過(guò)控件的右鍵菜單或Setting()命令彈出設(shè)置對(duì)話框,讓用戶修改沙盒目錄的父目錄位置。注:沙盒目錄必須具有:創(chuàng)建、刪除、寫(xiě)、讀等文件操作的權(quán)限,否則Peergine的某些功能將失效。沙盒目錄中的文件的移入和移出通過(guò)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í)行時(shí),Peergine彈出文件對(duì)話框,讓用戶選擇Dst文件路徑,進(jìn)行文件移出操作。(3) Src為空且Dst指定了文件路徑,則Dst指定的文件必須在沙盒目錄內(nèi)。當(dāng)命令執(zhí)行時(shí),Peergine彈出文件對(duì)話框,讓用戶選擇Src文件路徑,進(jìn)行文件移入操作。注:如果使用Peergine之外的途徑移入/移出文件,則 Peergine將無(wú)法保證其安全性。比如,使用控制臺(tái)copy命令復(fù)制文件,在資源管理器里手工復(fù)制、粘

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

41、錄服務(wù)器獲取地址,需要調(diào)用PG_METH_PEER_SetAddr方法來(lái)設(shè)置地址。登錄服務(wù)器節(jié)點(diǎn)對(duì)象:創(chuàng)建登錄服務(wù)器節(jié)點(diǎn)對(duì)象使用PG_ADD_PEER_Server選項(xiàng)。在一個(gè)節(jié)點(diǎn)上只能有一個(gè)登錄服務(wù)器節(jié)點(diǎn)對(duì)象,如果創(chuàng)建第二個(gè),則前面一個(gè)自動(dòng)銷毀。在實(shí)際使用中不需要直接創(chuàng)建登錄服務(wù)器節(jié)點(diǎn)對(duì)象,而是在控件初始化時(shí),由系統(tǒng)自動(dòng)創(chuàng)建。代碼示例(JavaScript):pgAtx.Control = "Type=1"pgAtx.Node = "Type=0" / 作為普通節(jié)點(diǎn)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é)點(diǎn)對(duì)象的名稱,Addr參數(shù)指定登錄服務(wù)器節(jié)點(diǎn)的地址。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é)點(diǎn)自身對(duì)象:創(chuàng)建登錄服務(wù)器節(jié)點(diǎn)對(duì)象使用PG_ADD_PEER_Self選項(xiàng)。在一個(gè)節(jié)點(diǎn)上只能有一個(gè)節(jié)點(diǎn)自身對(duì)象,如果創(chuàng)建第二個(gè),則前面一個(gè)自動(dòng)銷毀。在實(shí)際使用中不需要直接創(chuàng)建節(jié)點(diǎn)自身對(duì)象,而是在控件初始化或調(diào)用登錄方法時(shí),有系統(tǒng)自動(dòng)創(chuàng)建。節(jié)點(diǎn)作為登錄服務(wù)器節(jié)點(diǎn)(服務(wù)器端)時(shí),在控件初始化時(shí)創(chuàng)建節(jié)點(diǎn)自身對(duì)象,代碼示例(JavaScript):pgAtx.Control = “Type=1”;pgAtx.Node = “Type=1”; / 作為登錄

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

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

46、pt language="javascript">/ 初始化控件實(shí)例。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)建對(duì)端節(jié)點(diǎn)對(duì)象,并設(shè)置地址。pgAtx.ObjectAdd(sRemoteName, “PG_CLASS_Peer”, “”, 0x

47、4);var sInEle = “(Addr)“ + sRemoteAddr + “(Proxy)”;pgAtx.ObjectRequest(sRemoteName, 37, sInEle, “SetAddr”);/ 給對(duì)端節(jié)點(diǎn)發(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>但是,這個(gè)程序在實(shí)際中很難使用,因?yàn)橐孪戎缹?duì)端節(jié)點(diǎn)的網(wǎng)絡(luò)地址。對(duì)此,Peergine提供了自動(dòng)交換節(jié)點(diǎn)網(wǎng)絡(luò)地址的方法,請(qǐng)看參考下文的“登錄、注銷和地址解析”章節(jié)。3) 登錄、注銷和地址解析在Peergine系統(tǒng)中,通信節(jié)點(diǎn)是用節(jié)點(diǎn)對(duì)象的名稱來(lái)標(biāo)識(shí)的,但在通信過(guò)程中需要根據(jù)節(jié)點(diǎn)的網(wǎng)絡(luò)地址來(lái)傳輸報(bào)文。所以,需要一種機(jī)制把節(jié)點(diǎn)對(duì)象名稱轉(zhuǎn)換成節(jié)點(diǎn)的網(wǎng)絡(luò)地址(也稱為地址解析)。Peergine提供了一種特殊的通信節(jié)點(diǎn)(登

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

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

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

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

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

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

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論