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