




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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、通過課程設(shè)計(jì),使學(xué)生理論聯(lián)系實(shí)際,在實(shí)踐中進(jìn)一步了解計(jì)算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu),深入理解TCP/IP參考模型2、培養(yǎng)學(xué)生分析、解決問題的能力,提高學(xué)生動(dòng)手能力。3、使學(xué)生掌握搜集資料、調(diào)查研究、整理報(bào)告的方法。4、初步掌握網(wǎng)絡(luò)應(yīng)用程序開發(fā)技術(shù)以及互聯(lián)網(wǎng)的應(yīng)用技術(shù)。二、課程設(shè)計(jì)的要求及原理1、課程設(shè)計(jì)要求。實(shí)現(xiàn)一個(gè)一對(duì)一的聊天程序。其基本過程如下:服務(wù)器首先啟動(dòng),創(chuàng)建套節(jié)字等待客戶連接;客戶啟動(dòng)以后,創(chuàng)建套屆字,然后和服務(wù)器建立連接;連接建立以后,客戶機(jī)和服務(wù)器可以通過建立的套節(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ì)稱性。客戶機(jī)/服務(wù)器模型工作時(shí)要求有一套為客戶機(jī)和服務(wù)器所共識(shí)的慣例來保證服務(wù)能夠被提供(或被接受)。這一套慣例包含了一套協(xié)議。它必須在通訊的兩頭都被實(shí)現(xiàn)。根據(jù)不同的實(shí)際情況,協(xié)議可能是對(duì)稱的或是非對(duì)稱的。在對(duì)稱的協(xié)議中,每一方都有可能扮演主從角色;在非對(duì)稱協(xié)議中,一
3、方被不可改變地認(rèn)為是主機(jī),而另一方則是從機(jī)。無論具體的協(xié)議是對(duì)稱的或是非對(duì)稱的,當(dāng)服務(wù)被提供時(shí)必然存在"客戶進(jìn)程"和"服務(wù)進(jìn)程"。一個(gè)服務(wù)程序通常在一個(gè)眾所周知的地址監(jiān)聽對(duì)服務(wù)的請(qǐng)求,也就是說,服務(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ù)也是可以通過數(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ī)之間
4、的連接起了重要作用:當(dāng)一臺(tái)計(jì)算機(jī)需要與另一臺(tái)遠(yuǎn)程計(jì)算機(jī)連接時(shí),TCP協(xié)議會(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ì)一的聊天程序;程序沒有采用圖形界面;程序的設(shè)計(jì)語言采用的是C+;基于winsock;開發(fā)工具為VC+。聊天程序的設(shè)計(jì)可以采用UDP或者TCP,程序采
5、用TCP。采用的是客戶服務(wù)器模型。在本程序中,一個(gè)用戶作為Server端,另一個(gè)用戶作為Client端。也就是說,作為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ā)。連接斷開之后,斷開服務(wù)的客戶端將不能夠收到服務(wù)器轉(zhuǎn)發(fā)的消息。程序可在同臺(tái)機(jī)器上或者是不同機(jī)器上運(yùn)行。在用C+語言進(jìn)行代碼的編寫時(shí)主要應(yīng)用到的是C+中的網(wǎng)絡(luò)編程、輸
6、入輸出處理、多線程以技術(shù)。數(shù)據(jù)的傳輸使用的是I/O輸入輸出處理,用到類似cout<<"string"等的輸出處理方法。因?yàn)榉?wù)器是一只提供服務(wù)的,也就是說服務(wù)器一直是運(yùn)行的狀態(tài),時(shí)刻等待著新的客戶端提出連接請(qǐng)求,所以就需要使用到多線程的方法。Socket類的實(shí)例的accept方法是一個(gè)阻塞式的方法,如果只是用進(jìn)程來表示新的客戶端,那么在現(xiàn)有進(jìn)程沒有結(jié)束的情況下,新的客戶端在發(fā)送連接請(qǐng)求之后程序?qū)⒉荒芾^續(xù)向下執(zhí)行,所以應(yīng)該應(yīng)用比進(jìn)程更小的線程來解決這一問題。四、程序編寫1、客戶端與服務(wù)器端用到的相關(guān)類class CIPMessagepublic:CIPMessag
7、e();CIPMessage();void Init(string sIpAddress, int iPort);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
8、to server;class CChatServerpublic:CChatServer();CChatServer();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
9、- not connectedint m_iServerPort;list<SOCKET> m_vClientList; / All socket connected to clientSOCKET m_SClient;SOCKET m_SListenClient; / socket listening for client calls;2、服務(wù)器端程序#include "server.h"CChatServer CServerObj;UINT ServerRecThread(LPVOID pParam) /接收數(shù)據(jù)的工作線程.UINT ServerListen
10、Thread(LPVOID pParam) /監(jiān)聽端口建立連接的工作線程.CChatServer:CChatServer() /對(duì)象CChatServer的構(gòu)造函數(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)聽該端口 .CChatServer:CChatServer()
11、 /對(duì)象CChatServer的析構(gòu)函數(shù) closesocket(m_SListenClient);/關(guān)閉該端口 WSACleanup();void CChatServer: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
12、 CChatServer:SendMessagePort(string sMessage)/向各個(gè)客戶端發(fā)送服務(wù)器數(shù)據(jù) .for(itl = m_vClientList.begin();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)elseSendM
13、essagePort(temp);.return 0;int main(int argc, char* argv) .if(!CServerObj.IsConnected()/判斷監(jiān)聽端口是否建立.AfxBeginThread(ServerListenThread,0);/啟動(dòng)監(jiān)聽端口建立連接的工作線程 while(gets(buf) .if(CServerObj.SendMessagePort(buf).3、客戶端程序#include "client.h"/Global Message objectCIPMessage MyMessObj;CIPMessage:CIPMe
14、ssage()/MyMessObj構(gòu)造函數(shù).void CIPMessage:Init(string sIpAddress, int iPort)/建立與服務(wù)器端得連接.conn=socket(AF_INET,SOCK_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(serve
15、r)/向指定服務(wù)器建立連接.m_bIsConnected = true;return;CIPMessage:CIPMessage()/MyMessObj析構(gòu)函數(shù).int CIPMessage:SendMessagePort(string 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(LP
16、VOID pParam)/接收指定服務(wù)器數(shù)據(jù)線程.int main(int argc, char* argv).FILE *fp = fopen("server.ini","r");/獲取服務(wù)器端套接字地址.while(fgets(buf,4096,fp) != NULL).sServerAddress = buf;fclose(fp);.MyMessObj.Init(sServerAddress.c_str(),8084);/啟動(dòng)與服務(wù)器連接.AfxBeginThread(MessageRecThread,0);/開啟接收數(shù)據(jù)線程while(gets(
17、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ì)通過本次計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì),我對(duì)計(jì)算機(jī)網(wǎng)絡(luò)這門課有了更深入的理解與認(rèn)識(shí)。了解了winsock編程技術(shù),對(duì)于TCP協(xié)議有了更深入的理解。我明白了對(duì)網(wǎng)絡(luò)通訊程序的設(shè)計(jì)的原理和過程的透徹理解,是網(wǎng)絡(luò)通訊程序的前提。我在代碼編寫的時(shí)候,使用了集成開發(fā)工具vc+,所以編程的效率相對(duì)較高。這個(gè)聊天程序只是實(shí)現(xiàn)了基本的功能,而且并沒有提供較為友好的圖形界面。通常,網(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)求信息。通過這次的課程設(shè)計(jì),我明白了很多。我知道自己在實(shí)踐動(dòng)手能力方面還有很大欠缺,做出能夠聊天的程序增加了我對(duì)網(wǎng)絡(luò)編程的興趣。我也認(rèn)識(shí)到了自己在編程方面的很多不足,對(duì)整個(gè)協(xié)議棧的了解還不太清晰,以后得總結(jié)一下這方面的知識(shí)。 我會(huì)更加努力,平時(shí)注重提高自己的實(shí)踐動(dòng)手能力
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司物資出門證管理制度
- 公司直飲水設(shè)備管理制度
- 危險(xiǎn)品貨運(yùn)公司管理制度
- 衛(wèi)生院藥品齊全管理制度
- 加氣站風(fēng)控分級(jí)管理制度
- 嘉定區(qū)職工食堂管理制度
- 海外公司帳戶管理制度
- 制藥實(shí)驗(yàn)室設(shè)備管理制度
- 部隊(duì)考試題目及答案
- 邊境常識(shí)考試題及答案
- 《技術(shù)成果投資入股個(gè)人所得稅遞延納稅備案表》
- MOOC 油氣田應(yīng)用化學(xué)-西南石油大學(xué) 中國(guó)大學(xué)慕課答案
- 《HSK標(biāo)準(zhǔn)教程4上》第4課自用課件
- 七年級(jí)數(shù)學(xué)下冊(cè)期中測(cè)試卷(完整)
- 2023年溫州中學(xué)自主招生理綜模擬試題
- GB/T 43731-2024生物樣本庫(kù)中生物樣本處理方法的確認(rèn)和驗(yàn)證通用要求
- 廣州市律師協(xié)會(huì)申請(qǐng)律師執(zhí)業(yè)人員面試考核參考題庫(kù)
- 數(shù)據(jù)治理培訓(xùn)資料
- 裂解裂化工藝培訓(xùn)課件
- 夜市防恐防暴應(yīng)急預(yù)案
- 小學(xué)語文現(xiàn)代文閱讀課件
評(píng)論
0/150
提交評(píng)論