基于P2P的局域網(wǎng)多線程共享軟件設(shè)計(jì)論文
1 系統(tǒng)概述
本系統(tǒng)的主要功能其一,局域網(wǎng)下的文件P2P共享,這里包括文件的傳輸和文件列表的傳輸;其二,局域網(wǎng)下用戶的P2P心跳檢測(cè)。系統(tǒng)的特點(diǎn)是多線程多任務(wù)同步。
2 設(shè)計(jì)思想
下面將從兩個(gè)大模塊來介紹設(shè)計(jì)思路,首先是文件的收發(fā),然后是文件列表的收發(fā)和心跳模塊,如圖1所示。
2.1 文件收發(fā)模塊
文件的收發(fā)是resource-shaie最基本的功能,也是最核心的功能。
2.1.1 有關(guān)文件收發(fā)的Socket的分類
因?yàn)檫@里采用的是TCP協(xié)議,所以在程序中,大體上存在于3組Socket,與文件收發(fā)有關(guān),一組Socket是welcomesocket,用于監(jiān)聽連接的到來,并Accept;另一組Socket,是數(shù)據(jù)傳輸?shù)腟ocket,來自于welcomesocket的accept(),用于send文件數(shù)據(jù)給對(duì)等方,姑且稱作sendsocket;最后一組Socket也是數(shù)據(jù)傳輸?shù)膕ocket,通過connect()對(duì)等方的welcomesocket得到,與上面那個(gè)sendsocket是直接相連的,只是因?yàn)樗鎸?duì)的對(duì)象不同,對(duì)于當(dāng)前對(duì)等方,因?yàn)檫@個(gè)Socket的用于recover文件,姑且稱作recvsocket。
可以這樣理解,對(duì)于一個(gè)對(duì)等方來說,sendsocket就只send(),recvsocket就只recover ()。之所以這樣分開,是為了方便管理,降低耦合度,使得兩個(gè)對(duì)等方之間的所直接相連的一對(duì)sendsocket和recvsocket在一個(gè)文件任務(wù)中維系關(guān)系,也就是說,一對(duì)socket,在同一時(shí)間只共同執(zhí)行一個(gè)任務(wù),一邊是發(fā)和一邊是收。然而,如果全在一個(gè)Socket中send和recv,就會(huì)變得很亂,一個(gè)socket就可能牽連多個(gè)任務(wù),一個(gè)socket出了問題,可能幾個(gè)任務(wù)的收發(fā)都會(huì)失敗。
下面舉一個(gè)例子來具體說明為什么要這樣分類。
假使現(xiàn)在有兩個(gè)人,hana和alice?紤]hana從alice下載一個(gè)文件的情況,在不考慮上傳操作的時(shí)候,hana是主動(dòng)的,alice是下載方,所以首先hana會(huì)connectalice的welcomesocket,而對(duì)于alice而言,她的welcomesocket一直在等待hana的接入,hana—旦發(fā)起連接她就會(huì)accept。接著,hana通過connect得到的socket就是所謂的recvsocket,而這個(gè)socket相對(duì)于alice,就是alice的sendsocket,她將從這個(gè)socket里接收數(shù)據(jù),但是目前還不行,因?yàn)閍lice并不知道hana的要求是什么,所以這里需要向alice發(fā)送一個(gè)請(qǐng)求,同樣是通過recvsocket。對(duì)于alice而言,假使已經(jīng)從welcome socket accept到了一個(gè)sendsocket,那么首先要獲取請(qǐng)求,她需要先對(duì)sendsocket執(zhí)行一次recv請(qǐng)求的操作。
到這里,請(qǐng)求完成了,接下來,hana的recvsocket就不斷接收文件數(shù)據(jù),alice的sendsocket不斷發(fā)送文件數(shù)據(jù)。反過來,假使alice想從hana那里下載東西,因?yàn)槎硕加猩鲜?組Socket,所以很容易實(shí)現(xiàn)。實(shí)際上,想實(shí)現(xiàn)上傳功能也可以用完全一樣的邏輯體系,只需要從后者發(fā)送一個(gè)特殊指令,使得前者發(fā)送一個(gè)下載請(qǐng)求給后者即可,如圖2所示。
2.1.2 文件請(qǐng)求的監(jiān)聽和連接
上面討論的是純粹的傳輸一個(gè)文件的情況,下面內(nèi)容逐漸復(fù)雜。
還是上面的例子,假設(shè)現(xiàn)在需要支持多任務(wù)的模式,也就是說,alice不僅僅要向hana—個(gè)人發(fā)送一個(gè)文件,而是將會(huì)向很多人發(fā)送文件,并且對(duì)于每個(gè)人,還不只是一個(gè)文件。
那么,alice可以開多個(gè)welcomesocket去listen,每一個(gè)welcomesocket監(jiān)聽n個(gè)用戶,接著通過accept返回每一個(gè)文件的sendsocket,這樣一來,就等于說和每一個(gè)終端都建立起了多個(gè)傳送通道,每個(gè)傳送通道傳送一個(gè)文件,也就是一個(gè)任務(wù)。
現(xiàn)在問題是到底需要幾個(gè)這樣的welcomesocket?當(dāng)然,可以只開一個(gè)welcome,全靠一個(gè)welcomesocket監(jiān)聽(用戶數(shù)量)*(每個(gè)用戶的文件請(qǐng)求數(shù)量)數(shù)量的請(qǐng)求。但在實(shí)際設(shè)計(jì)中,使用了多個(gè)端口創(chuàng)建了多個(gè)welcomesocket,讓每一個(gè)welcomesocket對(duì)于每一個(gè)訪問他的終端而言,在單個(gè)任務(wù)執(zhí)行的過程中,只能有一個(gè)文件的請(qǐng)求。這樣一來,每一個(gè)welcomesocket的最大并發(fā)連接數(shù)就一定是用戶的總數(shù)量,而welcomesocket的數(shù)量就是由alice能夠同時(shí)向一個(gè)終端send幾個(gè)文件決定的。
也就是說,hana在前一個(gè)下載任務(wù)執(zhí)行完關(guān)閉recvsocket以前,不能向同一個(gè)welcomesocket再一次發(fā)起connect,(當(dāng)然因?yàn)閣elcomesocket的實(shí)體是在alice那邊,所以hana在這里,實(shí)際上禁用了對(duì)于此welcomesocket的connect操作)這樣做的目的是為了限制對(duì)于同一個(gè)用戶的最大下載量。
所以,對(duì)于hana來說,假如她要從alice或者其他人那里下載多個(gè)文件,這就要求hana去connect那些用戶的多個(gè)welcomesocket,在connect中傳入的地址可能包涵每一個(gè)對(duì)象的IP和每一個(gè)傳輸port,所以hana的recvsocket最多可以和ip_num*port_num個(gè)數(shù)的sendsocket建立連接。(ip_num代表傳送端數(shù)量,一個(gè)ip—臺(tái)用戶,port_num代表在一個(gè)ip下對(duì)于單用戶支持的最大傳輸任務(wù)數(shù)量,那么,對(duì)于alice而言,
她最多同樣可以同時(shí)傳輸ip_num*port_num個(gè)任務(wù))而在每一次任務(wù)完成之后,hana都會(huì)關(guān)閉掉那個(gè)任務(wù)的recvsocket,并且將這個(gè)任務(wù)所對(duì)應(yīng)的welcomesocket的禁用狀態(tài)解除;與之對(duì)應(yīng)的,alice在傳送完之后,也會(huì)將sendsocket關(guān)閉。
通過圖3來看這種情況,假使這次alice不僅要給hana發(fā)送文件,還要給自己的母親發(fā)送文件,對(duì)于hana或者alice的母親而言,最多同時(shí)從alice這里下載3個(gè)文件。
2.2 文件列表收發(fā)和心跳模塊
2.2.1 動(dòng)態(tài)心跳檢測(cè)
前面說了P2P的文件傳輸機(jī)制,還講了多任務(wù)多用戶的情況,現(xiàn)在來說一下這個(gè)系統(tǒng)中的另一個(gè)很重要的機(jī)制,心跳機(jī)制。通過發(fā)送心跳信息和接收心跳,用來感知在局域網(wǎng)中,有哪些對(duì)等方是存在的,雙方的心跳包中有少量的數(shù)據(jù),一般而言包含用戶的信息,比如用戶名,終端系統(tǒng)信息之類的。只有知道哪些對(duì)等方式存在的,才能進(jìn)一步的保存這些對(duì)等文件通信中的有用信息,(可能包括這個(gè)用戶的文件列表,這個(gè)用戶的各個(gè)welcomesocket的地址,等),最后根據(jù)這些信息才能真正地實(shí)現(xiàn)文件通信。
還是上面的那個(gè)例子,考慮了這樣情況,hana先上線了,過了一段時(shí)間alice才上線。那么在alice上線的那一瞬間,如何使得兩人都知道對(duì)方上線了呢,準(zhǔn)確地說,是通過P2P軟件上線。這就好比兩臺(tái)機(jī)器都上了網(wǎng),并且都登上了QQ,但QQ判斷是否上線,僅僅是有沒有在QQ上線,而不是在SKYPE上線了,所以我們應(yīng)該有一套自己的機(jī)制,這就是要介紹的心跳機(jī)制。
在這里,機(jī)制是這樣實(shí)現(xiàn)的:不管對(duì)于hana或者alice,她們?cè)谏暇的時(shí)候首先都會(huì)進(jìn)行廣播式的連接嘗試,廣播對(duì)象是子網(wǎng)網(wǎng)段下所有的IP地址。其次,她們還會(huì)單獨(dú)為心跳建立一個(gè)welcomesocket,開一個(gè)監(jiān)聽的線程專門用于監(jiān)聽新上線用戶的connect請(qǐng)求。在這里,判斷是否在線的邏輯是 “收到某人的心跳包,就表示某人目前在線”。
在結(jié)合例子講解之前,先討論心跳機(jī)制中的socket分類。心跳的welcomesocket和文件傳輸?shù)哪莻(gè)welcomesocket沒有什么性質(zhì)上的區(qū)別,無非就是擁有自己獨(dú)特的端口號(hào)而已。但是,心跳的收發(fā)是沒有sendsocket和recvsocket的這種概念的,只有一個(gè)heartsocket,這個(gè)socket是一個(gè)專門用于心跳收發(fā)的長連接socket,他一直存在,不會(huì)被close的.,所以會(huì)被長期保存,這里要和之前說的用于文件傳輸?shù)膕endsocket和recvsocket區(qū)分,他們有很大的差異,首先,文件傳輸?shù)膕end和recvsocket是不會(huì)長期保存的,一般只是一些函數(shù)中的局部變量,因?yàn)樗?jīng)常改變,他傳完一個(gè)任務(wù)就關(guān)閉了,下一次又重新生成,所以文件傳輸中這些收發(fā)socket屬于短鏈接的socket,其次,在heartsocket中,發(fā)送和接收都是通過這一個(gè)socket。
舉—個(gè)例子,假設(shè)hana首先上線,她先開啟了心跳wel-comesocket的監(jiān)聽,這時(shí)候,alice并沒有上線,所以有反饋,并且hana對(duì)子網(wǎng)內(nèi)中所有ip的connect的嘗試也都失敗了。在這之后,alice上線了,首先alice的廣播式connect嘗試,成功激活了hana的welcomesocket的循環(huán)accept,成功連接之后,alice通過return的heartsocket,向hana發(fā)送一個(gè)心跳包,hana在accept之后會(huì)立馬recv這個(gè)心跳包,hana接收到心跳包之后,就認(rèn)為alice目前處于在線了,他也可以通過心跳包里的信息知道來自于這個(gè)ip的人的名字叫alice,接著她要做的是就是把這個(gè)heartsocket保存好,準(zhǔn)備下一次收發(fā)心跳包。那么流程到此,hana已經(jīng)知道alice的存在了,但是alice卻還并不知道hana的存在,因?yàn)樗沒有接受到hana的心跳包。所以,hana在接收到alice的心跳包之后,保存了相關(guān)信息后,她還會(huì)通過這個(gè)heartsocket發(fā)送一個(gè)心跳包給alice,而對(duì)于alice而言,在她發(fā)送完心跳包之后,她會(huì)馬上recv對(duì)方的心跳包,這樣一來,就使得alice也知道了hana的存在了。
在相互都知道對(duì)方的存在之后,大家通過這同一個(gè)heartsocket相互發(fā)送和接收心跳包了,每接收一個(gè)心跳包就代表目前對(duì)方是存在的,一旦接受超時(shí),那么就代表對(duì)方下線了,這樣就可以動(dòng)態(tài)監(jiān)測(cè)對(duì)方是否已經(jīng)下線,如圖4所示。
2.2.2 文件列表的收發(fā)
下面來討論文件列表的收發(fā)。這個(gè)可以和之前的文件收發(fā)關(guān)聯(lián)起來,因?yàn)槲募斜碓谝话闱闆r下是不會(huì)有變動(dòng)的,故而沒有必要一直重復(fù)接受對(duì)方的文件列表,僅僅是在第一次的時(shí)候和用戶自己認(rèn)為需要更新的時(shí)候再去接收新的文件列表。所以,可以知道的是,文件列表的socket也是一種短連接的socket,用完了關(guān)閉就行了,需要的時(shí)候再connect對(duì)方的welcomesocket。
同樣,文件列表的傳輸是雙向的,所以在設(shè)計(jì)中,基本上和之前說到的文件傳輸機(jī)制如出一轍,也是3個(gè)socket,welcomesocket,recvsocket,sendsocket。只不過,請(qǐng)求文件列表的那個(gè)人不需要發(fā)送那個(gè)所謂“文件請(qǐng)求”而已,connect之后,直接從recvsocket中接收就可以了。
3 類設(shè)計(jì)思想
由于篇幅有限,只能做一下思想的概述。根據(jù)需求,類設(shè)計(jì)包括:user,myself_user,task,task_manager。結(jié)合面向?qū)ο蟮乃枷,其中有兩種類別,一種跟“用戶”有關(guān),另一種跟“任務(wù)”有關(guān)。
在設(shè)計(jì)中,何為“用戶”,何為“任務(wù)”?具體概念,必須先弄清楚。用戶這個(gè)對(duì)象,指的是局域網(wǎng)中的對(duì)等方,也就是P2P中的peer,可以是自己的電腦,也可以是別人的電腦,這里還有一個(gè)myself_user的類,這個(gè)對(duì)象指的是本機(jī)用戶,并且是user的子類。任務(wù)則是指,對(duì)于自己電腦而言,每一個(gè)下載任務(wù)的實(shí)例,也就是說,你每一次向別的對(duì)等方請(qǐng)求一個(gè)文件,都會(huì)產(chǎn)生一個(gè)下載任務(wù)。
3.1 用戶有關(guān)類
User:用戶類的主要職能是保存peer的信息,包括ip、名字、welcomesocket的地址、heartsocket等。
Myself_user:作為user的子類,除了保存了普通用戶應(yīng)有的信息之外,還要保存一些自身獨(dú)有的信息,以及為其他peer提供一些服務(wù),包括有文件列表的傳輸服務(wù),文件的傳輸服務(wù)。
世界就是圖5這樣的,進(jìn)來的箭頭表示請(qǐng)求,從自己出去的箭頭表示反饋(也可以稱作“提供”)
user_manager:這個(gè)類字面上就可以理解是用戶管理器,主要職能就是動(dòng)態(tài)監(jiān)測(cè)用戶狀態(tài)。通過收發(fā)心跳包的手段來嗅探用戶狀態(tài),然后更新用戶管理器中的用戶組,將不存在的刪除,新上線的添加。除此之外,他也和myself_user是相輔相成的,他初始化myself_user,并開啟myself_user的服務(wù)。所以在實(shí)際應(yīng)用的時(shí)候,只需初始化user_manager,他就可以自己去初始化myself_user了。除此之外,文件列表的請(qǐng)求實(shí)際上也是從user_manager這里發(fā)送出去的,并且它也負(fù)責(zé)接受文件列表并更新某個(gè)user中所保存的文件列表。
3.2 任務(wù)有關(guān)類
Task:這個(gè)類代表了一個(gè)下載的任務(wù)信息的對(duì)象,包括任務(wù)名、對(duì)象ip、大小、已完成%,等。值得注意的是,它不僅能保存信息,真正的下載也要負(fù)責(zé)執(zhí)行。從發(fā)送請(qǐng)求到接受文件,這些工作,一旦你run了這個(gè)任務(wù),就會(huì)開始執(zhí)行。
Task_manager:任務(wù)管理器類,它主要就是像用戶管理器那樣動(dòng)態(tài)監(jiān)測(cè)其中成員的狀態(tài),其中有3個(gè)集合,running中的任務(wù)、success的任務(wù)、error的任務(wù)。主要職能是根據(jù)實(shí)時(shí)
4 結(jié)語
從展示的可執(zhí)行的程序的截圖,程序在VS2013中調(diào)試沒有問題,也生成了release版本,界面是用coco2dx寫的,主要是考慮到可移植性,
【基于P2P的局域網(wǎng)多線程共享軟件設(shè)計(jì)論文】相關(guān)文章:
基于科技信息共享云服務(wù)機(jī)制研究論文11-02
基于GIS的農(nóng)業(yè)動(dòng)態(tài)信息共享網(wǎng)絡(luò)平臺(tái)研究論文11-07
基于數(shù)據(jù)抽取與訂閱實(shí)現(xiàn)數(shù)據(jù)共享分析及研究論文10-30
基于物聯(lián)網(wǎng)的空氣凈化系統(tǒng)的軟件設(shè)計(jì)研究論文10-29
個(gè)體知識(shí)共享研究:基于心理學(xué)的分析論文09-14
對(duì)共享單車論文03-17
共享單車的論文03-18
國外共享論文03-18
共享單車論文06-01