




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、基于TCP的簡(jiǎn)單一對(duì)一聊天程序設(shè)計(jì)一、課程設(shè)計(jì)目的1、通過(guò)課程設(shè)計(jì),使學(xué)生理論聯(lián)系實(shí)際,在實(shí)踐中進(jìn)一步了解計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu),深入理解TCP/IP參考模型2、培養(yǎng)學(xué)生分析、解決問(wèn)題的能力,提高學(xué)生動(dòng)手能力。3、使學(xué)生掌握搜集資料、調(diào)查研究、整理報(bào)告的方法。4、初步掌握網(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā)技術(shù)以及互聯(lián)網(wǎng)的應(yīng)用技術(shù)。二、課程設(shè)計(jì)的要求及原理1、課程設(shè)計(jì)要求。實(shí)現(xiàn)一個(gè)一對(duì)一的聊天程序。其基本過(guò)程如下:服務(wù)器首先啟動(dòng),創(chuàng)建套節(jié)字等待客戶連接;客戶啟動(dòng)以后,創(chuàng)建套屆字,然后和服務(wù)器建立連接;連接建立以后,客戶機(jī)和服務(wù)器可以通過(guò)建立的套節(jié)字連接進(jìn)行通信。服務(wù)器和客戶端可以是一臺(tái)電腦上的兩個(gè)進(jìn)程,也可以使分別部
2、署在兩臺(tái)電腦上。2、課程設(shè)計(jì)原理。 客戶服務(wù)器模型。它是指客戶/服務(wù)器模型是所有網(wǎng)絡(luò)應(yīng)用的基礎(chǔ)??蛻?服務(wù)器分別指參與一次通信的兩個(gè)應(yīng)用實(shí)體,客戶方主動(dòng)地發(fā)起通信請(qǐng)求,服務(wù)器方被動(dòng)地等待通信的建立。它是一個(gè)在建立分布式應(yīng)用時(shí)最常用的范例。在這種方案中客戶應(yīng)用程序向服務(wù)器程序請(qǐng)求服務(wù)。這種方式隱含了在建立客戶機(jī)/服務(wù)器間通訊時(shí)的非對(duì)稱性??蛻魴C(jī)/服務(wù)器模型工作時(shí)要求有一套為客戶機(jī)和服務(wù)器所共識(shí)的慣例來(lái)保證服務(wù)能夠被提供(或被接受)。這一套慣例包含了一套協(xié)議。它必須在通訊的兩頭都被實(shí)現(xiàn)。根據(jù)不同的實(shí)際情況,協(xié)議可能是對(duì)稱的或是非對(duì)稱的。在對(duì)稱的協(xié)議中,每一方都有可能扮演主從角色;在非對(duì)稱協(xié)議中,一
3、方被不可改變地認(rèn)為是主機(jī),而另一方則是從機(jī)。無(wú)論具體的協(xié)議是對(duì)稱的或是非對(duì)稱的,當(dāng)服務(wù)被提供時(shí)必然存在客戶進(jìn)程和服務(wù)進(jìn)程。一個(gè)服務(wù)程序通常在一個(gè)眾所周知的地址監(jiān)聽(tīng)對(duì)服務(wù)的請(qǐng)求,也就是說(shuō),服務(wù)進(jìn)程一直處于休眠狀態(tài),直到一個(gè)客戶對(duì)這個(gè)服務(wù)的地址提出了連接請(qǐng)求。在這個(gè)時(shí)刻,服務(wù)程序被驚醒并且為客戶提供服務(wù)對(duì)客戶的請(qǐng)求作出適當(dāng)?shù)姆磻?yīng)。雖然基于連接的服務(wù)是設(shè)計(jì)客戶機(jī)/服務(wù)器應(yīng)用程序時(shí)的標(biāo)準(zhǔn),但有些服務(wù)也是可以通過(guò)數(shù)據(jù)報(bào)套接口提供的。相關(guān)協(xié)議。應(yīng)用到的網(wǎng)絡(luò)協(xié)議主要有TCP協(xié)議。TCP協(xié)議被稱作一種端對(duì)端協(xié)議。這是因?yàn)樗鼮閮膳_(tái)計(jì)算機(jī)之間的連接起了重要作用:當(dāng)一臺(tái)計(jì)算機(jī)需要與另一臺(tái)遠(yuǎn)程計(jì)算機(jī)連接時(shí),TCP協(xié)議
4、會(huì)讓它們建立一個(gè)連接、發(fā)送和接收資料以及終止連接。傳輸控制協(xié)議TCP協(xié)議利用重發(fā)技術(shù)和擁塞控制機(jī)制,向應(yīng)用程序提供可靠的通信連接,使它能夠自動(dòng)適應(yīng)網(wǎng)上的各種變化。即使在 Internet 暫時(shí)出現(xiàn)堵塞的情況下,TCP也能夠保證通信的可靠。IP協(xié)議只保證計(jì)算機(jī)能發(fā)送和接收分組資料,而TCP協(xié)議則可提供一個(gè)可靠的、可流控的、全雙工的信息流傳輸服務(wù)。三、設(shè)計(jì)方案首先本程序的定位是一對(duì)一的聊天程序;程序沒(méi)有采用圖形界面;程序的設(shè)計(jì)語(yǔ)言采用的是C+;基于winsock;開(kāi)發(fā)工具為VC+。聊天程序的設(shè)計(jì)可以采用UDP或者TCP,程序采用TCP。采用的是客戶服務(wù)器模型。在本程序中,一個(gè)用戶作為Server端
5、,另一個(gè)用戶作為Client端。也就是說(shuō),作為Server端的用戶,需要首先啟動(dòng)程序,等待Client端的連接請(qǐng)求。Client端自動(dòng)建立連接請(qǐng)求。當(dāng)TCP連接握手以后,雙方方可進(jìn)行交互。在客戶端用戶進(jìn)行消息的編寫,發(fā)送和接受等功能;而服務(wù)器端發(fā)送的消息向客戶端所有的用戶進(jìn)行發(fā)送可以稱之為系統(tǒng)消息;服務(wù)器端收到某一個(gè)用戶發(fā)送的消息之后可以向所有的其它用戶進(jìn)行轉(zhuǎn)發(fā)。連接斷開(kāi)之后,斷開(kāi)服務(wù)的客戶端將不能夠收到服務(wù)器轉(zhuǎn)發(fā)的消息。程序可在同臺(tái)機(jī)器上或者是不同機(jī)器上運(yùn)行。在用C+語(yǔ)言進(jìn)行代碼的編寫時(shí)主要應(yīng)用到的是C+中的網(wǎng)絡(luò)編程、輸入輸出處理、多線程以技術(shù)。數(shù)據(jù)的傳輸使用的是I/O輸入輸出處理,用到類似
6、coutstring;等的輸出處理方法。因?yàn)榉?wù)器是一只提供服務(wù)的,也就是說(shuō)服務(wù)器一直是運(yùn)行的狀態(tài),時(shí)刻等待著新的客戶端提出連接請(qǐng)求,所以就需要使用到多線程的方法。Socket類的實(shí)例的accept方法是一個(gè)阻塞式的方法,如果只是用進(jìn)程來(lái)表示新的客戶端,那么在現(xiàn)有進(jìn)程沒(méi)有結(jié)束的情況下,新的客戶端在發(fā)送連接請(qǐng)求之后程序?qū)⒉荒芾^續(xù)向下執(zhí)行,所以應(yīng)該應(yīng)用比進(jìn)程更小的線程來(lái)解決這一問(wèn)題。四、程序編寫1、客戶端與服務(wù)器端用到的相關(guān)類class CIPMessagepublic:CIPMessage();CIPMessage();void Init(string sIpAddress, int iPort
7、);int SendMessagePort(string sMessage);int RecMessagePort();bool IsConnected()return m_bIsConnected;private:bool m_bIsConnected; / true - connected false - not connectedstring m_sServerIPAddress;int m_iServerPort;SOCKET conn; / socket connected to server;class CChatServerpublic:CChatServer();CChatSe
8、rver();bool IsConnected()return m_bIsConnected; / 返回連接狀態(tài)void StartListenClient(); / Listen to clientint SendMessagePort(string sMessage); / 向所有客戶端發(fā)消息int RecClient(SOCKET sRecSocket); /接收客戶端數(shù)據(jù)private:bool m_bIsConnected; / true - connected false - not connectedint m_iServerPort;list m_vClientList; /
9、All socket connected to clientSOCKET m_SClient;SOCKET m_SListenClient; / socket listening for client calls;2、服務(wù)器端程序#include server.hCChatServer CServerObj;UINT ServerRecThread(LPVOID pParam) /接收數(shù)據(jù)的工作線程.UINT ServerListenThread(LPVOID pParam) /監(jiān)聽(tīng)端口建立連接的工作線程.CChatServer:CChatServer() /對(duì)象CChatServer的構(gòu)造函
10、數(shù) . m_SListenClient=socket(AF_INET,SOCK_STREAM,0);/創(chuàng)建一個(gè)套接字,返回套接字描述字 . if(bind(m_SListenClient,(sockaddr*)&local,sizeof(local)!=0) /把本地協(xié)議的地址賦予一個(gè)套接字 . if(listen(m_SListenClient,10)!=0)/監(jiān)聽(tīng)該端口 .CChatServer:CChatServer() /對(duì)象CChatServer的析構(gòu)函數(shù) closesocket(m_SListenClient);/關(guān)閉該端口 WSACleanup();void CChatServe
11、r:StartListenClient() . m_SClient=accept(m_SListenClient, (struct sockaddr*)&from,&fromlen);/產(chǎn)生與客戶進(jìn)行TCP連接通信的套接字并返回已連接客戶端的協(xié)議地址 .AfxBeginThread(ServerRecThread,(void *)m_SClient);/啟動(dòng)接收線程,用m_SClient套接字與客戶端通話int CChatServer:SendMessagePort(string sMessage)/向各個(gè)客戶端發(fā)送服務(wù)器數(shù)據(jù) .for(itl = m_vClientList.begin();
12、itl != m_vClientList.end();itl+)iStat = send(*itl,sMessage.c_str(),sMessage.size()+1,0); .int CChatServer:RecClient(SOCKET sRecSocket)/接收客戶端數(shù)據(jù)成員函數(shù).iStat = recv(sRecSocket,temp,4096,0);if(iStat = -1)elseSendMessagePort(temp);.return 0;int main(int argc, char* argv) .if(!CServerObj.IsConnected()/判斷監(jiān)聽(tīng)端
13、口是否建立.AfxBeginThread(ServerListenThread,0);/啟動(dòng)監(jiān)聽(tīng)端口建立連接的工作線程 while(gets(buf) .if(CServerObj.SendMessagePort(buf).3、客戶端程序#include client.h/Global Message objectCIPMessage MyMessObj;CIPMessage:CIPMessage()/MyMessObj構(gòu)造函數(shù).void CIPMessage:Init(string sIpAddress, int iPort)/建立與服務(wù)器端得連接.conn=socket(AF_INET,S
14、OCK_STREAM,0);/建立客戶端套接字.addr=inet_addr(m_sServerIPAddress.c_str();/轉(zhuǎn)化ip地址和端口為指定形式hp=gethostbyaddr(char*)&addr,sizeof(addr),AF_INET);.if(connect(conn,(struct sockaddr*)&server,sizeof(server)/向指定服務(wù)器建立連接.m_bIsConnected = true;return;CIPMessage:CIPMessage()/MyMessObj析構(gòu)函數(shù).int CIPMessage:SendMessagePort(s
15、tring sMessage)/向指定服務(wù)器發(fā)出數(shù)據(jù).iStat = send(conn,sMessage.c_str(),sMessage.size()+1,0);.int CIPMessage:RecMessagePort()/接收指定服務(wù)器數(shù)據(jù).iStat = recv(conn,acRetData,4096,0);.UINT MessageRecThread(LPVOID pParam)/接收指定服務(wù)器數(shù)據(jù)線程.int main(int argc, char* argv).FILE *fp = fopen(server.ini,r);/獲取服務(wù)器端套接字地址.while(fgets(b
16、uf,4096,fp) != NULL).sServerAddress = buf;fclose(fp);.MyMessObj.Init(sServerAddress.c_str(),8084);/啟動(dòng)與服務(wù)器連接.AfxBeginThread(MessageRecThread,0);/開(kāi)啟接收數(shù)據(jù)線程while(gets(buf).if(MyMessObj.SendMessagePort(buf)/向服務(wù)器發(fā)送數(shù)據(jù).五、運(yùn)行結(jié)果測(cè)試時(shí)在同一機(jī)器上運(yùn)行的,有一個(gè)服務(wù)器和兩個(gè)客戶端。上圖為服務(wù)器端程序運(yùn)行結(jié)果客戶端運(yùn)行結(jié)果六、實(shí)習(xí)心得和體會(huì)通過(guò)本次計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì),我對(duì)計(jì)算機(jī)網(wǎng)絡(luò)這門課有了更深
17、入的理解與認(rèn)識(shí)。了解了winsock編程技術(shù),對(duì)于TCP協(xié)議有了更深入的理解。我明白了對(duì)網(wǎng)絡(luò)通訊程序的設(shè)計(jì)的原理和過(guò)程的透徹理解,是網(wǎng)絡(luò)通訊程序的前提。我在代碼編寫的時(shí)候,使用了集成開(kāi)發(fā)工具vc+,所以編程的效率相對(duì)較高。這個(gè)聊天程序只是實(shí)現(xiàn)了基本的功能,而且并沒(méi)有提供較為友好的圖形界面。通常,網(wǎng)絡(luò)應(yīng)用程序包含兩個(gè)獨(dú)立的應(yīng)用程序:客戶程序和服務(wù)器程序。但是,也可以設(shè)計(jì)同時(shí)完成這兩種功能的程序,例如,一些服務(wù)器程序如果不能完成一個(gè)服務(wù)請(qǐng)求時(shí),它將轉(zhuǎn)而充當(dāng)客戶程序,向其它服務(wù)器程序請(qǐng)求信息。通過(guò)這次的課程設(shè)計(jì),我明白了很多。我知道自己在實(shí)踐動(dòng)手能力方面還有很大欠缺,做出能夠聊天的程序增加了我對(duì)網(wǎng)絡(luò)編程的興趣。我也認(rèn)識(shí)到了自己在編程方面的很多不足,對(duì)整個(gè)協(xié)議棧的了解還不太清晰,以后得總結(jié)一下這方面的知識(shí)。 我會(huì)更加努力,平時(shí)注重提高自己的實(shí)踐動(dòng)手能力,爭(zhēng)取更大的進(jì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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 顱內(nèi)壓力監(jiān)測(cè)芯片行業(yè)技術(shù)發(fā)展策略研究
- 紡織企業(yè)生產(chǎn)設(shè)備安全操作規(guī)程
- 綠色環(huán)保貓砂行業(yè)深度解析
- 2025至2030中國(guó)自行車部件行業(yè)發(fā)展趨勢(shì)分析與未來(lái)投資戰(zhàn)略咨詢研究報(bào)告
- 文化遺產(chǎn)保護(hù)工程質(zhì)量保證措施
- 健康養(yǎng)生:中草藥產(chǎn)品開(kāi)發(fā)策略
- 2025至2030中國(guó)膳食纖維糖果行業(yè)市場(chǎng)發(fā)展分析及商業(yè)模式與投融資報(bào)告
- 2025至2030中國(guó)腦膜炎奈瑟菌感染藥物行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國(guó)能源和公用事業(yè)分析行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2025至2030中國(guó)胃癌藥物行業(yè)發(fā)展趨勢(shì)分析與未來(lái)投資戰(zhàn)略咨詢研究報(bào)告
- 婚前協(xié)議(保護(hù)女方利益)
- 奉賢區(qū)教育系統(tǒng)師德師風(fēng)建設(shè)學(xué)習(xí)測(cè)試附有答案
- 西方經(jīng)濟(jì)學(xué)(第二版)完整整套課件(馬工程)
- 扶貧農(nóng)產(chǎn)品購(gòu)銷合同協(xié)議(農(nóng)產(chǎn)品購(gòu)銷合同模板)
- 汽車維修高級(jí)工考試試題及參考答案
- 檢驗(yàn)科安全管理制度匯總
- GB/T 5782-2016六角頭螺栓
- GB/T 23445-2009聚合物水泥防水涂料
- GB/T 13451.2-1992著色顏料相對(duì)著色力和白色顏料相對(duì)散射力的測(cè)定光度計(jì)法
- GB/T 11264-2012熱軋輕軌
- 山東省中小學(xué)校檔案管理暫行辦法
評(píng)論
0/150
提交評(píng)論