資源描述:
《p2p即時(shí)聊天系統(tǒng)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、一、課程設(shè)計(jì)題目基于P2P的局域網(wǎng)即時(shí)通信系統(tǒng)二、實(shí)驗(yàn)環(huán)境及工具1?計(jì)算機(jī):PC機(jī),PC虛擬機(jī),2.操作系統(tǒng):Windows2000,WindowsXP3.程序設(shè)計(jì)語(yǔ)言:VC6.0三、設(shè)計(jì)要求1.實(shí)現(xiàn)一個(gè)圖形用戶界面局域網(wǎng)內(nèi)的消息系統(tǒng)。2.功能:建立一個(gè)局域網(wǎng)內(nèi)的簡(jiǎn)單的P2P消息系統(tǒng),程序既是服務(wù)器乂是客戶,服務(wù)器端口使用3333oa)用戶注冊(cè)及對(duì)等方列表的獲取:對(duì)等方A啟動(dòng)后,用戶設(shè)置自己的信息(用戶名,所在組);掃描網(wǎng)段屮在線的對(duì)等方(3333端口打開(kāi)),向所有在線對(duì)等方的服務(wù)端口發(fā)送消息,接收方接收
2、到消息后,把對(duì)等方A加入到自己的用戶列表中,并發(fā)應(yīng)答消息;對(duì)等方A把回應(yīng)消息的其它對(duì)等方加入用戶列表。雙方交換的消息格式自己根據(jù)需要定義,至少包括用戶名、IP地址。b)發(fā)送消息和文件:用戶在列表屮選擇用戶,與用戶建立TCP連接,發(fā)送文件或消息。3.用戶界面:界面上包括對(duì)等方列表;消息顯示列表;消息輸入框;文件傳輸進(jìn)程顯示及操作按鈕或菜單。四、設(shè)計(jì)內(nèi)容與步驟1.學(xué)習(xí)Socket和TCP的基木原理和通信機(jī)制;2.功能設(shè)計(jì)和界面設(shè)計(jì)3.服務(wù)器功能的設(shè)計(jì)和實(shí)現(xiàn)4?客戶功能的設(shè)計(jì)和實(shí)現(xiàn)5.課程設(shè)計(jì)任務(wù)說(shuō)明書五、方案
3、設(shè)計(jì)1.消息格式本系統(tǒng)采用的消息格式是,文件頭+消息內(nèi)容文件頭為T?9,消息格式分配如下:本機(jī)名:登陸,發(fā)送給所有在線對(duì)等方的服務(wù)端口'24本機(jī)名:對(duì)登陸消息的回饋34本機(jī)名:退出W+本機(jī)名:對(duì)話請(qǐng)求“51”或”52”:對(duì)話請(qǐng)求的冋應(yīng)(是否同意)8+本機(jī)名+”退出對(duì)話J退出對(duì)話7+對(duì)話內(nèi)容:對(duì)話8+文件名長(zhǎng)度+文件名+文件長(zhǎng)度(轉(zhuǎn)換成CString):請(qǐng)求傳送“91”同意傳輸“92”拒絕“93”磁盤已滿2.該軟件分別開(kāi)了3個(gè)監(jiān)聽(tīng)端口:3333、3334、3335。之所以分開(kāi)3個(gè)端口是因?yàn)楦鞣N傳送的不同,在
4、設(shè)計(jì)實(shí)驗(yàn)的過(guò)程中我發(fā)現(xiàn)對(duì)于登陸消息,退出消息,應(yīng)該用的socket是即用即斷,即比如我收到登陸消息,并發(fā)送冋饋消息后就斷開(kāi)連接,這樣就不用一個(gè)用戶同時(shí)連接很多用戶,如果用完不斷,就是全連接了。而文件傳輸應(yīng)該跟對(duì)話傳輸分開(kāi),因此應(yīng)該再開(kāi)一個(gè)端口。3.在線用戶的掃描:本軟件是通過(guò)掃描局域網(wǎng)內(nèi)的在線用戶(不一定打開(kāi)軟件),然后一一發(fā)送登陸信息,如果收到登陸信息就在列表上增加用戶并發(fā)送冋饋,如果收到回饋就在列表上增加用戶,如果收到退出消息就刪除用戶。4.文件傳輸原本打算使用多線程文件傳輸,及發(fā)送端開(kāi)多個(gè)線程同時(shí)讀
5、一個(gè)文件并發(fā)送,接收端在磁盤開(kāi)辟一個(gè)與接收文件大小一致的一個(gè)文件,然后接收端開(kāi)多個(gè)線程接收并各自負(fù)責(zé)寫進(jìn)特定文件位置,不過(guò)由于Socket匹配問(wèn)題,因此還是使用單線程傳輸比較簡(jiǎn)單一點(diǎn)。六、方案實(shí)現(xiàn)及主要程序1.工程中的類(1).本軟件屮分別有三個(gè)CAsyncSocket的派生類,分別是CCtrlSocket,CTalkSocket,CFileSocketa)CCtrlSocket:用于接收及發(fā)送控制信息,包括文件頭為1'(登陸);2(冋饋);3(退岀);4(對(duì)話請(qǐng)求);’5,(對(duì)話請(qǐng)求的回應(yīng))的消息,對(duì)應(yīng)
6、監(jiān)聽(tīng)端口是CTRLPORT——3333b)CTalkSocket:用于接收及發(fā)送對(duì)話信息,及部分文件控制信息。包括文件頭為8(退出對(duì)話);7(對(duì)話);8(請(qǐng)求傳送);9(傳送回應(yīng))的消息,對(duì)應(yīng)監(jiān)聽(tīng)端口是TALKPORT——3334c)CFileSocket:用于發(fā)送及接收文件,對(duì)應(yīng)監(jiān)聽(tīng)端口是FILEPORT——3335其它類如CPathDialog,CFileDlg與本設(shè)計(jì)的主要部分無(wú)緊要聯(lián)系,故不一一說(shuō)明了2.類的具體實(shí)現(xiàn)(1).CCtrlSocket類:主要部分有FD.READ及FD_CONNECT觸
7、發(fā)的事件,OnConnect在建立連接后發(fā)送出相應(yīng)的消息,而OnReceive在有消息到來(lái)的情況下處理消息voidCCtrlSocket::OnReceive(intnErrorCode){//TODO:Addyourspecializedcodehereand/orcallthebaseclasscharq[50];chart;unsignedintj;CStringtempaddr;CStringCtemp;UINTtempport;this?>Receive(q,strlen(q)+l,O);t=q
8、[°];forfl=0;jm_pMainWnd;pDlg->UpdateData(true);switch(t)//對(duì)控制信息的判斷{caseT:〃登陸pDlg->mJistonline.InsertltemfO.q);this^GetP