摘要:分析Sever/Client方式在實際應(yīng)用中的重要的作用,使其在p2p發(fā)展迅速的網(wǎng)絡(luò)應(yīng)用中依然有一席之地;通過服務(wù)器以多線程管理客戶端通信的方式穩(wěn)定,高效,并且提供了單一或者多方備份與加密的可行性方案;Sever/Client穿透防火墻,路由的方式適用面廣,信息傳遞準(zhǔn)確性高,提高了連接效率和安全性.
關(guān)鍵詞:Sever/Client;P2P;TCP;UDP;穿透;多線程
前言
隨著P2P與NAT技術(shù)的日益發(fā)展與成熟,P2P網(wǎng)絡(luò)在應(yīng)用領(lǐng)域獲得了巨大的成功,然而傳統(tǒng)的Sever/Client的互聯(lián)方式依然有著重要的實際應(yīng)用作用――企業(yè)的遠(yuǎn)程財務(wù)管理,企業(yè)的可調(diào)控視頻會議,學(xué)校課程預(yù)約,手機(jī)短信息定向發(fā)送等等方面的工作從應(yīng)用角度考慮更合適Sever/Client方式互聯(lián).
Sever/Client網(wǎng)絡(luò)應(yīng)用程序的設(shè)計都需要考慮路由穿透的問題,而基于UDP,TCP兩種通訊都可以完成穿透工作,本文重點(diǎn)討論TCP/IP穿透路由的技術(shù)方案.
一.概述
對于目標(biāo)用戶來說,管理服務(wù)總是可見的,它有一個固定的公網(wǎng)IP,目標(biāo)用戶可以通過
手動”登陸”或者后臺工作等方式主動訪問管理服務(wù)器,建立一個TCP/IP連接.利用這種方式目標(biāo)用戶可以在自己的終端 — 計算機(jī),手機(jī)等等客戶端繞過防火墻,穿過路由器與管理服務(wù)器建立一條穩(wěn)定可靠的”通道”,只至有一方動取消連接為止.
利用這些”通道”,管理服務(wù)器可以記錄并管理這些目標(biāo)用戶的網(wǎng)絡(luò)地址,并把即時消息,服務(wù)器指令,目標(biāo)用戶之間的通訊消息,目標(biāo)用戶的網(wǎng)絡(luò)地址發(fā)給所有或者指定的目標(biāo)用戶,從而實現(xiàn)目標(biāo)用戶與管理服務(wù)器之這間的防火墻,路由穿透,目標(biāo)用戶之間的防火墻,路由目標(biāo)穿透,達(dá)到無障礙阻通訊的目的.
二.目標(biāo)用戶客戶端的設(shè)計
目標(biāo)用戶客戶端的設(shè)計總方向為簡化數(shù)據(jù)管理,加強(qiáng)數(shù)據(jù)處理,豐富人機(jī)交互.
C++,VC++中已經(jīng)封裝好的套接字CAsyncSocket, CSOCKET對于網(wǎng)絡(luò)通訊編程來說,使用簡單,然而效率和控制卻不及原始套接字SOCKET.下面就以SOCKET為例說明客戶端的設(shè)計方案。
對于套接字的阻塞通信方式,客戶端可以啟動一個線程來完成對服務(wù)器端口的監(jiān)聽接收和發(fā)送工作,在VC++中可以封裝為一個網(wǎng)絡(luò)收發(fā)線程類來使用,這樣做可以保證網(wǎng)絡(luò)數(shù)據(jù)的安全與正確,同時還兼顧到數(shù)據(jù)的實時性,方便擴(kuò)展。
網(wǎng)絡(luò)線程類主要工作分為四個部分:
1.將各模塊對服務(wù)器請求指令打包處理
主要將請求內(nèi)容封裝為網(wǎng)絡(luò)數(shù)據(jù),即在TCP/IP數(shù)據(jù)包的基礎(chǔ)上對數(shù)據(jù)進(jìn)行二次封裝,便于程序處理。分為包頭,包內(nèi)容,包結(jié)束。包頭一般包括長度,日期,類型等內(nèi)容;包內(nèi)容則是請求數(shù)據(jù);包結(jié)束通常包含數(shù)據(jù)包的結(jié)束標(biāo)志,或者數(shù)據(jù)是否分包發(fā)送,此為第幾包等等內(nèi)容。
2.發(fā)送對服務(wù)器的請求
將封裝好的數(shù)據(jù)包根據(jù)類型,調(diào)用不同函數(shù)發(fā)送至服務(wù)器——根據(jù)程序內(nèi)容也可以
調(diào)用同一函數(shù)發(fā)送。
3.監(jiān)聽接收服務(wù)器數(shù)據(jù)
采用阻塞式通信套接字,線程監(jiān)聽與服務(wù)器通信的端口,實時接收數(shù)據(jù)內(nèi)容。
4.將接收到服務(wù)器的數(shù)據(jù)分類發(fā)送至處理模塊
根據(jù)數(shù)據(jù)包的類型,將數(shù)據(jù)包內(nèi)容分門別類,取出數(shù)據(jù)包內(nèi)容后通過消息機(jī)制發(fā)送給不同的數(shù)據(jù)處理模塊進(jìn)行工作。
目標(biāo)用戶客戶端之間通訊時可以采用服務(wù)轉(zhuǎn)發(fā)與直接通訊兩種方式,前者更加方便實現(xiàn)管理記錄功能但加重了管理服務(wù)器的工作負(fù)擔(dān);后者效率更高卻比較難以管理記錄,各有長短,設(shè)計者可以根據(jù)具體情況進(jìn)行設(shè)計.
在目標(biāo)客戶端之間進(jìn)行直接連接時,可以使用UDP連接,然而由于網(wǎng)關(guān)會動態(tài)改變UDP的端口映射,即使采用心跳數(shù)據(jù)包的方式也并不穩(wěn)定,所以這種方案并不理想.
使用TCP連接由管理服務(wù)器中轉(zhuǎn)發(fā)雙方的IP地址,采用管理服務(wù)器偽造數(shù)據(jù)報,實現(xiàn)目標(biāo)用戶雙手三次握手并連接的等方法.
三.管理服務(wù)器的設(shè)計
管理服務(wù)器的設(shè)計設(shè)計思路為采用多線程點(diǎn)對點(diǎn)方式強(qiáng)化數(shù)據(jù)管理。具體思路為創(chuàng)建一個管理線程,此線程的主要工作如下:
1.監(jiān)聽與客戶端的通訊端口
創(chuàng)建一個線程,在指定的通訊端口上監(jiān)聽連接,判斷連接是否是的目標(biāo)客戶端進(jìn)行連接,就可以得到一個針對此目標(biāo)客戶端的套接字,并分配與之對應(yīng)的ID。
2.創(chuàng)建通訊子線程
管理線程創(chuàng)建一個面向該用戶的阻塞式通訊子線程,并向這個子線程分配ID與相應(yīng)的通訊套接字,這個子線程就可以負(fù)責(zé)起與用戶進(jìn)行發(fā)接與收接網(wǎng)絡(luò)數(shù)據(jù)的工作,達(dá)到實時準(zhǔn)確地與目標(biāo)客戶進(jìn)行接收發(fā)送數(shù)據(jù)的目的.
3.實時管理通訊子線程組
利用分配ID的方式進(jìn)行記錄和管理,輕松實現(xiàn)數(shù)據(jù)組發(fā),定向發(fā)送,定向記錄等等的管理功能。
4.結(jié)束通訊子線程,釋放資源
一旦目標(biāo)用戶的連接中斷,可以馬上進(jìn)行其對應(yīng)子線程,套接字的銷毀,釋放管理服務(wù)器的資源。同時通過時間設(shè)置和中斷個數(shù)重新管理ID計數(shù),保證管理服務(wù)器的正常安全運(yùn)行。
而通訊子線程的工作內(nèi)容與客戶端通訊線程工作內(nèi)容類似,主要負(fù)責(zé)
#61548;將各模塊對客戶端指令打包處理
#61548;發(fā)送對客戶端的指令
#61548;監(jiān)聽接收客戶端請求
#61548;將接收到客戶端請求的數(shù)據(jù)分類發(fā)送至處理模塊
線程之間的同步與管理已經(jīng)有了大量的成熟的方法,可以避免目標(biāo)用戶對同一內(nèi)存同時修改的問題.
四.總結(jié)
1.目標(biāo)實驗程序已經(jīng)在WindowXP和Window2000環(huán)境下全部運(yùn)行通過.
2.由于管理服務(wù)器的多線程設(shè)計,使用各目標(biāo)用戶,各程序模塊調(diào)度自如,進(jìn)一步實現(xiàn)的防火墻,路由的穿透目的.
3.原始套接字的使用對于程序的管理,移植有著重要的意義.
3.采用基于TCP/IP協(xié)議的編程方法,有效的保證了數(shù)據(jù)傳輸?shù)目煽啃?
參考文獻(xiàn)
李倩,陳志剛,《P2P網(wǎng)絡(luò)中TCP穿透NAT的解決方案》,
Tim Boyles,Dave Hucaby.Switching[M]. Cisoo Press,2000.
Andrew S Tanebaum, 計算機(jī)網(wǎng)絡(luò)(第3版)[M]. 北京:清華大學(xué)出版社,1998