版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于TCP協(xié)議的網(wǎng)絡(luò)通信設(shè)計(jì)與實(shí)現(xiàn)最新文檔(可以直接使用,可編輯最新文檔,歡迎下載)
基于TCP協(xié)議下的簡(jiǎn)單網(wǎng)絡(luò)通信與實(shí)現(xiàn)基于TCP協(xié)議的網(wǎng)絡(luò)通信設(shè)計(jì)與實(shí)現(xiàn)最新文檔(可以直接使用,可編輯最新文檔,歡迎下載)摘要本文設(shè)計(jì)并實(shí)現(xiàn)了在Windows下基于局域網(wǎng)內(nèi)的TCP協(xié)議的簡(jiǎn)單即時(shí)通信系統(tǒng),系統(tǒng)采用TCP/IP模式,底層通信通過(guò)SOCKET套接字接口對(duì)端口進(jìn)行監(jiān)聽,當(dāng)有消息發(fā)送來(lái)時(shí),做出相應(yīng)的處理,服務(wù)器負(fù)責(zé)客戶端的登錄驗(yàn)證。本文首先討論了套接字創(chuàng)建、綁定、將套接字設(shè)置為監(jiān)聽模式、接受信息和關(guān)閉套接字從而實(shí)現(xiàn)簡(jiǎn)單的網(wǎng)絡(luò)通信,然后闡述了如何使用C++來(lái)模擬基于TCP協(xié)議下的客戶服務(wù)方式的網(wǎng)絡(luò)通信過(guò)程。由于在此設(shè)計(jì)中主要是使用C程序的形式來(lái)模擬TCP協(xié)議的傳輸方式,從而實(shí)現(xiàn)面向?qū)ο蟮目煽總鬏敚谶@種情況下無(wú)需對(duì)IP協(xié)議進(jìn)行討論。關(guān)鍵字:套接字TCP協(xié)議目錄1、引言…………………....1.1、課程背景...............................................................................................................1.2、相關(guān)技術(shù)介紹.......................................................................................................1.3、TCP協(xié)議…………1.4、TCP——傳輸控制協(xié)議………….1.5、套接字……………2、系統(tǒng)框架.........................................................................................................................3、系統(tǒng)設(shè)計(jì)流程圖.............................................................................................................4、系統(tǒng)的實(shí)現(xiàn).....................................................................................................................4.1、服務(wù)器端程序..............................................................................................................4.2、客戶端程序..................................................................................................................結(jié)論……………………參考文獻(xiàn)………………1、引言1.1、課題背景TCP/IP起源于美國(guó)國(guó)防部高級(jí)研究規(guī)劃部署(DARPA)的一項(xiàng)研究計(jì)劃——實(shí)現(xiàn)若干臺(tái)主機(jī)的相互通信?,F(xiàn)在,TCP/IP已成為Internet上通信的工業(yè)標(biāo)準(zhǔn)。因?yàn)镺SI模型的七層參考模型比較復(fù)雜,并且在實(shí)際運(yùn)用中難以實(shí)現(xiàn),所以目前應(yīng)用比較多的是TCP/IP模型,該模型包括4個(gè)層次:應(yīng)用層運(yùn)輸層網(wǎng)絡(luò)層網(wǎng)絡(luò)接口層對(duì)于TCP/IP網(wǎng)絡(luò)層次模式,核心協(xié)議是網(wǎng)絡(luò)層的IP協(xié)議,和運(yùn)輸層的TCP協(xié)議,這也是為何成為TCP/IP協(xié)議的緣由。1.2、相關(guān)技術(shù)介紹NET開發(fā)平臺(tái)及C#.NET開發(fā)語(yǔ)言NET框架是Microsoft公司推出的一種全新的開發(fā)平臺(tái),提供了統(tǒng)一的、面向?qū)ο蟛⑶铱梢詳U(kuò)展的編程類庫(kù)和完善的集成開發(fā)環(huán)境,大大簡(jiǎn)化了應(yīng)用程序的開發(fā)過(guò)程,并且具有良好的移植性和安全性。微軟為了推行.NET戰(zhàn)略,特別為.NET平臺(tái)設(shè)計(jì)了一種語(yǔ)言——C#。C#是由C和C++派生而來(lái)的一種“簡(jiǎn)單、流行、面向?qū)ο?、類型安全”的程序設(shè)計(jì)語(yǔ)言,其綜合了Visualbasic的高效率和C++的強(qiáng)大功能,然而更多的人感覺C#更類似JAVA。事實(shí)上C#融合了大量的JAVA思想,C#是.NET的關(guān)鍵性語(yǔ)言,它是整個(gè).NET平臺(tái)的基礎(chǔ)。與C#相比,.NET所支持的其它語(yǔ)言顯然是配角,包括VC++.NET在內(nèi)。但是微軟并沒有打算放棄VC++.NET,相反,微軟對(duì)VC++.NET有著另一番獨(dú)特的打算,VC++.NET的定位與C#不完全重合,VC++.NET應(yīng)用范圍仍強(qiáng)于C#,這一點(diǎn)無(wú)論對(duì)微軟公司還是軟件業(yè)應(yīng)用現(xiàn)狀都非常重要。可見VC++.NET在NET框架中已經(jīng)退化成了底層的語(yǔ)言了,就像C++之前的標(biāo)準(zhǔn)C語(yǔ)言一樣,以后將只有開發(fā)底層或桌面程序的程序員使用它。它雖然仍舊強(qiáng)大,但是已經(jīng)不是主流,而主流就是C#語(yǔ)言。1.3、TCP協(xié)議TCP/IP網(wǎng)絡(luò)協(xié)議協(xié)議是對(duì)等的網(wǎng)絡(luò)實(shí)體之間通信的規(guī)則,可以簡(jiǎn)單地理解為網(wǎng)絡(luò)上各計(jì)算機(jī)彼此交流的一種“語(yǔ)言”。網(wǎng)絡(luò)通信協(xié)議設(shè)計(jì)的基本原則是層次化,層和協(xié)議的集合被稱為網(wǎng)絡(luò)體系結(jié)構(gòu)。相鄰層之間的接口定義了下層向上層提供的基本操作和服務(wù),下層向上層提供的服務(wù)分兩種形式:面向連接的服務(wù)和無(wú)連接的服務(wù)。計(jì)算機(jī)網(wǎng)絡(luò)中已經(jīng)形成的網(wǎng)絡(luò)體系結(jié)構(gòu)主要有兩個(gè):OSI參考模型和TCP/IP參考模型。TCP/IP參考模型是因特網(wǎng)(Internet)的基礎(chǔ)。和OSI的7層協(xié)議相比,TCP/IP協(xié)議只有4個(gè)層次。通常說(shuō)的TCP/IP是一組協(xié)議的總稱,TCP/IP實(shí)際上是一個(gè)協(xié)議族,包括100多個(gè)相互關(guān)聯(lián)的協(xié)議,其中IP(InternetProtocol,網(wǎng)際協(xié)議)是網(wǎng)絡(luò)層最主要的協(xié)議;TCP(TransmissionControlProtocol,傳輸控制協(xié)議)和UDP(UserDatagramProtocol,用戶數(shù)據(jù)報(bào)協(xié)議是傳輸層中最主要的協(xié)議),一般認(rèn)為IP、TCP、UDP是最根本的三種協(xié)議,是其他協(xié)議的基礎(chǔ)。1.4、TCP——傳輸控制協(xié)議面向連接的通信可以使用可靠通信,在這時(shí)候,第四層協(xié)議發(fā)送數(shù)據(jù)接收方的確認(rèn),如果未收到數(shù)據(jù)或者數(shù)據(jù)被損壞,則請(qǐng)求重新傳輸。TCP協(xié)議就使用這種可靠通信。使用TCP協(xié)議的應(yīng)用層協(xié)議包括HTTP、FTP、SMTP和Telnet等。TCP要求在發(fā)送數(shù)據(jù)之前必須打開連接。服務(wù)器應(yīng)用程序必須執(zhí)行一個(gè)稱作被動(dòng)打開(passiveopen)的操作,以利用一個(gè)已知的端口號(hào)創(chuàng)建一個(gè)鏈接,這是,服務(wù)器并不是對(duì)網(wǎng)絡(luò)進(jìn)行呼叫,而是偵聽并等待引入的請(qǐng)求??蛻魬?yīng)用程序必須執(zhí)行一個(gè)主動(dòng)打開(activeopen),為此,它向服務(wù)器應(yīng)用程序發(fā)送一個(gè)同步序列號(hào)(SYN)以標(biāo)識(shí)連接。客戶應(yīng)用程序可以將動(dòng)態(tài)端口號(hào)作為本地端口使用。服務(wù)器必須向客戶發(fā)送一個(gè)確認(rèn)(ACK)以及服務(wù)器的序列號(hào)(SYN)。隨后,客戶回復(fù)一個(gè)ACK,這樣就建立了鏈接。現(xiàn)在可以發(fā)送和接收消息了。接收消息后,總是返回ACK消息。如果在收到ACK之前發(fā)送方已經(jīng)超時(shí),則消息將被放到重發(fā)隊(duì)列中以再次發(fā)送。由于它的握制,所以TCP協(xié)議比較復(fù)雜并且費(fèi)時(shí),但此協(xié)議在處理數(shù)據(jù)時(shí)對(duì)數(shù)據(jù)包的傳送有保障,從而使得在應(yīng)用程序協(xié)議中不需要再包括該功能。1.5、套接字套接字這個(gè)術(shù)語(yǔ)并沒有定義某個(gè)協(xié)議:它具有兩層含義,但兩者都與一個(gè)協(xié)議相關(guān)。第一個(gè)含義是套接字編程API,它最初由伯克利大學(xué)為BSDUNIX而創(chuàng)建。BSD套接字在經(jīng)過(guò)修改后被用作Windows環(huán)境的編程接口(并且被命名為WinSock)。WinSockAPI被包裝在System.Net.sockets命名空間的.NET類中。WindowsSockets是一個(gè)獨(dú)立于協(xié)議的編程接口,用于編寫網(wǎng)絡(luò)應(yīng)用程序。套接字的第二層含義表示一個(gè)用于在進(jìn)程間進(jìn)行通信的終端。在TCP/IP中,每個(gè)終端都與一個(gè)IP地址和一個(gè)端口號(hào)綁定。我們必須對(duì)流式套接字和數(shù)據(jù)報(bào)套接字這兩種類型進(jìn)行區(qū)分。流失套接字用TCP/IP協(xié)議來(lái)使用面向連接的通信;另一方面,數(shù)據(jù)報(bào)套接字用UDP/IP來(lái)使用無(wú)連接通信。2、系統(tǒng)框架3、系統(tǒng)設(shè)計(jì)4、系統(tǒng)的實(shí)現(xiàn)4.1、服務(wù)器端程序#include<Winsock2.h>#include<stdio.h>Voidmain(){//加載套接字庫(kù)WORDwVersionRequested;WSADATAwsaDdata;Interror;wVersionRequested=MAKEWORD(1,1);err=WSAStarup(wVersionRequested,&wsaDATA);if(err!=0){return;}If(LOBYTE(wsadata.wVersion)!=1||HIBYTE(wsadata.wVersion)!=1){WSACleanup();Return;}//創(chuàng)建用于監(jiān)聽的套接字SOCKETsockSrv=socket(AF-INET,SOCK-STREAM,0);SOCKADDR-INaddrSrv;addrSrv.sin-addr.S-un.S-addr=hotonl(INADDR-ANY);addrSrv.sin-family=AF-INET;addrSrv.sin-port=htons(6000)//綁定套接字Bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//將套接字設(shè)為監(jiān)聽模式,準(zhǔn)備接收客戶請(qǐng)求Listen(sockSrv,s);SOCKADDR-INaddrClient;Intlen=sizeof(SOCKADDR);While(1){//等待客戶請(qǐng)求到來(lái)SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);CharsendBuf(100);Sprintf(sendBuf,)”Welcom%sto”,ine-ntoa(addrClient.sin-addr));//發(fā)送數(shù)據(jù)Send(sockConn,sendbuf,strlen(sendBuf)+1,0);CharrecvBuf(100);//接受數(shù)據(jù)Recv(sockConn,recvBuf,100,0);//打印接受的數(shù)據(jù)Printf(“%s\n”,recvBuf);//關(guān)閉套接字Closesocket(sockConn);}}4.2、客戶端程序#include<Winsock2.h>#include<stdio.h>Voidmain(){//加載套接字庫(kù)WORDwVersionRequested;WSADATAwsaDdata;Interror;wVersionRequested=MAKEWORD(1,1);err=WSAStarup(wVersionRequested,&wsaDATA);if(err!=0){return;}If(LOBYTE(wsadata.wVersion)!=1||HIBYTE(wsadata.wVersion)!=1){WSACleanup();Return;}//創(chuàng)建套接字SOCKETsockSrv=socket(AF-INET,SOCK-STREAM,0);SOCKADDR-INaddrSrv;addrSrv.sin-addr.S-un.S-addr=hotonl(INADDR-ANY);addrSrv.sin-family=AF-INET;addrSrv.sin-port=htons(6000)//向服務(wù)器發(fā)出連接請(qǐng)求Connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//接受數(shù)據(jù)CharrecvBuf[100];Recv(sockClient,recvBuf,100,0);Printf(“%s\n”,recvBuf);//發(fā)送數(shù)據(jù)Send(sockClient,”Thisislisi”,strlen(“Thisinlisi”)+1,0);//關(guān)閉套接字Closesocket(sockConn);WSACLeanup();}}結(jié)論在此設(shè)計(jì)中僅僅適合于數(shù)量少的計(jì)算機(jī)間的通信,其中一個(gè)缺陷是,當(dāng)多臺(tái)計(jì)算機(jī)同時(shí)進(jìn)行通信時(shí),會(huì)照成網(wǎng)絡(luò)擁塞,可能導(dǎo)致消息傳輸中丟失,此設(shè)計(jì)沒有做出解決的方案,但有這樣的方案猜想,為了解決擁塞問(wèn)題,可以使用慢開始、擁塞避免、快從傳和快恢復(fù)算法,進(jìn)而改進(jìn)此設(shè)計(jì),但是這會(huì)涉及大量的數(shù)學(xué)運(yùn)算。此設(shè)計(jì)還存另一個(gè)缺陷,沒有實(shí)現(xiàn)可靠傳輸,TCP協(xié)議的可靠傳輸機(jī)制是用字節(jié)的序號(hào)進(jìn)行傳輸控制,而這里僅是監(jiān)聽端口是否有數(shù)據(jù)發(fā)送,如果有,就接收,沒有就繼續(xù)監(jiān)聽。參考文獻(xiàn)[1]孫鑫,VC++深入詳解[M]北京:電子工業(yè)出版社,2021.7:528-546[2]謝希仁,計(jì)算機(jī)網(wǎng)絡(luò)[M]北京:電子工業(yè)出版社,2021.1:180-210基于MFC網(wǎng)絡(luò)通信設(shè)計(jì)王忠亮2017—1-5250593736@軟件工具VisualStudio2013系統(tǒng)平臺(tái)Windows764bit設(shè)計(jì)目標(biāo)設(shè)計(jì)一個(gè)基于對(duì)話框的應(yīng)用軟件,使兩臺(tái)PC機(jī)之間實(shí)現(xiàn)網(wǎng)絡(luò)通信,一臺(tái)為客戶機(jī),另一臺(tái)為服務(wù)器.設(shè)計(jì)原理在客戶—服務(wù)器方式下,實(shí)現(xiàn)網(wǎng)絡(luò)程序的socket通信??蛻艉头?wù)器是指通信中所涉及的兩個(gè)應(yīng)用進(jìn)程,客戶-服務(wù)器方式所描述的是進(jìn)程之間服務(wù)和被服務(wù)的關(guān)系。一臺(tái)PC機(jī)運(yùn)行客戶程序,而另一臺(tái)PC機(jī)運(yùn)行服務(wù)器程序。該設(shè)計(jì)只實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的socket通信:單方向通信。只有客戶向服務(wù)器發(fā)送消息,并且也只由客戶主動(dòng)斷開連接??蛻簦髈cket和服務(wù)器socket之間的關(guān)系如圖:服務(wù)器程序中包含兩個(gè)socket:監(jiān)聽socket和服務(wù)socket。監(jiān)聽socket響應(yīng)客戶socket的連接請(qǐng)求,一旦收到連接請(qǐng)求,則創(chuàng)建服務(wù)socket。服務(wù)socket負(fù)責(zé)接收客戶socket發(fā)送過(guò)來(lái)的消息,并隨時(shí)響應(yīng)客戶socket的斷開連接請(qǐng)求.進(jìn)一步細(xì)化上面過(guò)程,可得到Socket間通信流程圖:設(shè)計(jì)步驟創(chuàng)建客戶端工程打開VisualStudio2013工具,建立一個(gè)基于對(duì)話框的MFC項(xiàng)目,項(xiàng)目名稱NetcommClient。創(chuàng)建客戶socket類選擇PROJECT-〉AddClass..。,如圖所示:選擇MFC類:為新類命名,這里筆者命名為CClientSocket(即客戶socket類):客戶端界面設(shè)計(jì)一個(gè)IPAddresssControl,用于設(shè)置服務(wù)器IP地址.一個(gè)列表框,用于顯示操作指令信息。兩個(gè)編輯框,一個(gè)用于設(shè)置通信端口號(hào),一個(gè)用于輸入發(fā)送消息。五個(gè)按鈕,其中OK、Cancel按鈕為界面默認(rèn),可以保留。“連接服務(wù)器"按鈕用于啟動(dòng)客戶socket發(fā)出連接請(qǐng)求.“斷開連接”按鈕用于關(guān)閉客戶socket與服務(wù)器的連接?!鞍l(fā)送”按鈕啟動(dòng)消息發(fā)送??蛻舳嗽创a編寫聲明類對(duì)象在對(duì)話框頭文件里聲明客戶socket類對(duì)象:添加控件變量IP地址控件變量為IP地址控件添加變量:端口號(hào)變量為端口號(hào)添加無(wú)符號(hào)整型變量:列表框控件變量為列表框添加控件變量:發(fā)送消息變量事件函數(shù)連接服務(wù)器雙擊“連接服務(wù)器"按鈕,編寫此按鈕單擊事件函數(shù):斷開連接雙擊“斷開連接”按鈕,編寫此按鈕單擊事件函數(shù):消息發(fā)送雙擊“發(fā)送”按鈕,編寫此按鈕單擊事件函數(shù):網(wǎng)絡(luò)事件響應(yīng)函數(shù)重載客戶socket類的網(wǎng)絡(luò)事件OnConnect函數(shù):由于OnConnect函數(shù)需要調(diào)用主窗口資源,因此需要include主窗口的頭文件:創(chuàng)建服務(wù)器工程打開VisualStudio2013工具,建立一個(gè)基于對(duì)話框的MFC項(xiàng)目,項(xiàng)目名稱NetcommServer.創(chuàng)建服務(wù)器端的類服務(wù)器端需要兩個(gè)socket類:監(jiān)聽socket類和服務(wù)socket類.選擇PROJECT->AddClass.。.,如圖所示:選擇MFC類:為新類命名,監(jiān)聽socket類命名為:CListenSocket,服務(wù)socket類命名為:CServerSocket.服務(wù)器端界面設(shè)計(jì)一個(gè)IPAddresssControl,用于設(shè)置服務(wù)器IP地址.一個(gè)列表框,用于顯示操作指令信息和接收消息.一個(gè)編輯框,用于設(shè)置通信端口號(hào)。四個(gè)按鈕,其中OK、Cancel按鈕為界面默認(rèn),可以保留?!伴_始監(jiān)聽”按鈕啟動(dòng)監(jiān)聽網(wǎng)絡(luò)連接請(qǐng)求。“停止監(jiān)聽”按鈕用于關(guān)閉監(jiān)聽功能。服務(wù)器端源代碼編寫聲明類對(duì)象在對(duì)話框頭文件里聲明監(jiān)聽socket類對(duì)象和服務(wù)socket類對(duì)象:添加控件變量IP地址控件變量為IP地址控件添加變量:端口號(hào)變量為端口號(hào)添加無(wú)符號(hào)整型變量:列表框控件變量為列表框添加控件變量:事件函數(shù)啟動(dòng)監(jiān)聽雙擊“開始監(jiān)聽”按鈕,編寫此按鈕單擊事件函數(shù):停止監(jiān)聽雙擊“停止監(jiān)聽”按鈕,編寫此按鈕單擊事件函數(shù):網(wǎng)絡(luò)事件響應(yīng)函數(shù)重載監(jiān)聽socket類的OnAccept函數(shù):由于OnAccept函數(shù)需要調(diào)用主窗口資源,因此需要include主窗口的頭文件:重載服務(wù)socket類的OnReceive函數(shù):由于OnReceive函數(shù)需要調(diào)用主窗口資源,因此需要include主窗口的頭文件:重載服務(wù)socket類的OnClose函數(shù):運(yùn)行效果客戶端啟動(dòng)操作:設(shè)置服務(wù)器IP地址—〉設(shè)置端口號(hào)—>點(diǎn)擊“連接服務(wù)器”->輸入發(fā)送消息->點(diǎn)擊“發(fā)送按鈕”.停止工作:點(diǎn)擊“斷開連接”按鈕—〉點(diǎn)擊“OK”或“Cancel”按鈕退出(或點(diǎn)擊右上角關(guān)閉界面)。服務(wù)器端啟動(dòng)操作:設(shè)置服務(wù)器IP地址->設(shè)置端口號(hào)—〉點(diǎn)擊“開始監(jiān)聽”.停止工作:點(diǎn)擊“停止監(jiān)聽”按鈕—〉點(diǎn)擊“OK”或“Cancel”按鈕退出(或點(diǎn)擊右上角關(guān)閉界面).《Java程序設(shè)計(jì)》實(shí)驗(yàn)報(bào)告—-實(shí)驗(yàn)3實(shí)驗(yàn)室:2014年12月10日學(xué)院計(jì)算機(jī)與信息學(xué)院專業(yè)班級(jí)姓名成績(jī)課程名稱Java程序設(shè)計(jì)實(shí)驗(yàn)項(xiàng)目名稱實(shí)驗(yàn)三基于GUI的網(wǎng)絡(luò)通信程序設(shè)計(jì)指導(dǎo)教師教師評(píng)語(yǔ)教師簽名:年月日實(shí)驗(yàn)?zāi)康?。掌握Java中GUI程序的編寫,包括事件監(jiān)聽機(jī)制。2.掌握Java的網(wǎng)絡(luò)通信編程,ServerSocket,Socket類的使用。3.掌握J(rèn)ava中多線程的編程,Thread類,Runnable接口的使用。4.掌握用面向?qū)ο蟮姆椒ǚ治龊徒鉀Q復(fù)雜問(wèn)題。實(shí)驗(yàn)原理1。利用java。awt和javax。swing包提供的各種組件實(shí)現(xiàn)服務(wù)器和客戶端的界面設(shè)計(jì).2.使用套接字實(shí)現(xiàn)基于TCP協(xié)議的服務(wù)器和客戶端。3。為服務(wù)器和客戶端界面中的有關(guān)組件添加消息相應(yīng),實(shí)現(xiàn)交互。三、使用硬件、軟件環(huán)境PC計(jì)算機(jī)一臺(tái),配置為CPU為2。6G,內(nèi)存為4G,硬盤為1T,安裝Windows8操作系統(tǒng)。另外,使用JCreat(yī)or,JDK1。8.0等軟件四、實(shí)驗(yàn)過(guò)程、步驟及原始記錄(算法、原程序、測(cè)試結(jié)果,分析等)1。實(shí)驗(yàn)過(guò)程:首先實(shí)現(xiàn)界面的編寫,之后使用套接字實(shí)現(xiàn)基于TCP協(xié)議的通信,再設(shè)置監(jiān)視器,為相應(yīng)的組件添加消息相應(yīng)。2。源程序:1.客戶端程序:KeHuDuan.javaimportjava.awt.*;importjava。awt.event.*;importjava.util。*;importjava.io.*;importjava。net.*;importjavax。swing。*;publicclassKeHuDuan{publicstaticvoidmain(String[]args){MyFrameclient=newMyFrame();client。setVisible(true);client。setResizable(false);client。setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);}}classMyFramee(cuò)xtendsJFrame{JTextFieldip;JTextFieldport;JTextFieldcin;JTextAreacontent;JButtonconnect;JButtonsay;Socketsocket;MyFrame(){init();ConnectListencListener=newConnectListen();SayListensListener=newSayListen();connect.addActionListener(cListener);say.addActionListener(sListener);}voidinit(){setLayout(newFlowLayout());setSize(400,400);setLocation(800,100);add(newJLabel("Serveip”));ip=newJTextField("127。0.0.1",8);add(ip);add(newJLabel("Serveport"));port=newJTextField("8888",8);add(port);connect=newJButton("connect”);add(connect);content=newJTextArea(16,35);JScrollPanescroll=newJScrollPane(content);add(scroll);add(newLabel(”Say:”));cin=newJTextField(25);add(cin);say=newJButton(”say");add(say);}classConnectListenimplementsActionListener{intportNum;publicvoidactionPerformed(ActionEvente){connect。setEnabled(false);try{portNum=Integer.parseInt(port。getText());socket=newSocket(ip。getText(),portNum);ClientThreadct=newClientThread();ct.start();}catch(Exceptionex){}}}classSayListenimplementsActionListener{Stringstr;publicvoidactionPerformed(ActionEvente){try{PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);str=cin。getText();if(!str。isEmpty()){out。println(str);content。append("me:”+str+"\n");out。flush();}cin.setText(””);}catch(Exceptionex){}}}classClientThreadextendsThread{publicvoidrun(){try{BufferedReaderin=newBufferedReader(newInputStreamReader(socket。getInputStream()));Stringstr;while(true){str=in.readLine();//System.out。println("\a");content.a(chǎn)ppend(str+"\n”);}}catch(Exceptionex){}}}}2.服務(wù)器端程序:importjava.awt.*;importjava.awt.event。*;importjava。util。*;importjava。io.*;importjava。net。*;importjavax。swing。*;publicclassFuWu(yù)Qi{publicstat(yī)icvoidmain(String[]args){MyFrameserve=newMyFrame();serve。setVisible(true);serve.setResizable(false);serve。setDefaultCloseOperation(JFrame。DISPOSE_ON_CLOSE);}}classMyFrameextendsJFrame{JTextFieldport;JButtonstart;JTextAreacontent;JTextFieldcin;JButtonsay;Socketsocket;MyFrame(){init();StartListensListen=newStartListen();SayListenstListen=newSayListen();start。addActionListener(sListen);say.a(chǎn)ddActionListener(stListen);}voidinit(){setLayout(newFlowLayout());setSize(400,400);setLocation(400,100);add(newJLabel("Port:”));port=newJTextField("8888”,25);add(port);start=newJButton("Start”);add(start);content=newJTextArea(15,35);JScrollPanescroll=newJScrollPane(content);add(scroll);add(newJLabel("Say:"));cin=newJTextField(26);add(cin);say=newJButton(”Say”);add(say);}classStartListenimplementsActionListener{publicvoidactionPerformed(ActionEvente){start。setEnabled(false);try{ServerSockets=newServerSocket(Integer。parseInt(port.getText()));socket=s.accept();PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);out.println("連接成功”);content。append("連接成功"+"\n");ServerThreadst=newServerThread();st.start();}cat(yī)ch(Exceptionex){}}}classSayListenimplementsActionListener{Stringstr;publicvoidactionPerformed(ActionEvente){try{PrintWriterout=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);str=cin.getText();if(!str。isEmpty()){out。println(str);content.append("me:"+str+”\n”);out.flush();}cin.setText("");}cat(yī)ch(Exceptionex){}}}classServerThreadextendsThread{publicvoidrun(){try{BufferedReaderin=newBufferedReader(newInputStreamReader(socket.getInputStream()));Stringstr;while(true){str=in。readLine();content.append(str+"\n”);}}catch(Exceptionex){}}}}測(cè)試結(jié)果:五、實(shí)驗(yàn)結(jié)論、分析、思考題與心得體會(huì)通過(guò)本次實(shí)驗(yàn),我有以下幾方面的收獲、認(rèn)識(shí)和體會(huì):1.學(xué)會(huì)了編寫帶有圖形化界面的程序.2.簡(jiǎn)單掌握了JFrame、JLabel、JTextField、JButton和JPanel等組件的方法。能夠獨(dú)立解決部分編譯和執(zhí)行過(guò)程中的錯(cuò)誤信息.掌握事件處理的方法和常用的布局管理器.Linux網(wǎng)絡(luò)應(yīng)用技術(shù)基于TCP的多線程聊天室設(shè)計(jì)基于TCP的多線程聊天室設(shè)計(jì)姓名:李元池,宋權(quán)學(xué)號(hào):班級(jí):14軟工云計(jì)算4班一:設(shè)計(jì)思想:創(chuàng)建通信套接字,進(jìn)行對(duì)于客戶端的監(jiān)聽,定義的有一個(gè)全局變量intuser_fd[MAX_USER];用來(lái)保存已經(jīng)連接的用戶的通信套接字;用戶選擇群聊的時(shí)候服務(wù)器會(huì)把接收到的信息發(fā)送給除了發(fā)送此消息的其他所有客戶端,用戶選擇私聊則通過(guò)服務(wù)器端定義的結(jié)構(gòu)體structuser_mess{charmessage[100];charname[20];intk;}User[10];中的k;來(lái)判斷次編號(hào)對(duì)應(yīng)的客戶套接字,把此消息發(fā)送給指定的客戶端!利用shocket套接字進(jìn)行對(duì)于信息的傳遞,同時(shí)shocket套接字也是一種對(duì)于信息識(shí)別的判斷依據(jù),根據(jù)套接字可以找到接受的信息的意圖,并且進(jìn)行處理相應(yīng)的信息,而且服務(wù)器還可以通過(guò)對(duì)于shocket的識(shí)別,然后判斷哪個(gè)客戶發(fā)送的信息,然后進(jìn)行轉(zhuǎn)發(fā)個(gè)其他客戶端,進(jìn)而實(shí)現(xiàn)客戶與客戶之間的通信。服務(wù)器相當(dāng)于一個(gè)對(duì)于客戶端發(fā)送的信息進(jìn)行轉(zhuǎn)發(fā)的平臺(tái),當(dāng)客戶端的信息發(fā)送過(guò)來(lái)后,服務(wù)器會(huì)自動(dòng)通過(guò)套接字將信息在全部轉(zhuǎn)發(fā)給其他的客戶,實(shí)現(xiàn)客戶端之間的通信二:流程圖服務(wù)器(sever.c)客戶端服務(wù)器(sever.c)客戶端(client.c)客戶端發(fā)過(guò)來(lái)其它數(shù)字如1,2,3,….則服務(wù)器會(huì)根據(jù)儲(chǔ)存在user_fd[],數(shù)組的下標(biāo)找到對(duì)應(yīng)的客戶端套接字,并把私聊消息正確的發(fā)送給該客戶端!接收私聊消息請(qǐng)求客戶端發(fā)送過(guò)來(lái)-1,則把該消息發(fā)送給其他所有在線客戶端發(fā)送選項(xiàng)為-1進(jìn)入公聊連接成功后創(chuàng)建兩個(gè)線程th1,th2用于發(fā)送和接收服務(wù)器的信息客戶端在服務(wù)器監(jiān)聽的時(shí)候發(fā)送連接請(qǐng)求!acceptYN客戶連接在服務(wù)器先開啟監(jiān)聽服務(wù),等待客戶端連接后再運(yùn)行客戶端代碼……命令行參數(shù):IP+端口號(hào)+昵稱開啟監(jiān)聽listen……客戶端發(fā)過(guò)來(lái)其它數(shù)字如1,2,3,….則服務(wù)器會(huì)根據(jù)儲(chǔ)存在user_fd[],數(shù)組的下標(biāo)找到對(duì)應(yīng)的客戶端套接字,并把私聊消息正確的發(fā)送給該客戶端!接收私聊消息請(qǐng)求客戶端發(fā)送過(guò)來(lái)-1,則把該消息發(fā)送給其他所有在線客戶端發(fā)送選項(xiàng)為-1進(jìn)入公聊連接成功后創(chuàng)建兩個(gè)線程th1,th2用于發(fā)送和接收服務(wù)器的信息客戶端在服務(wù)器監(jiān)聽的時(shí)候發(fā)送連接請(qǐng)求!acceptYN客戶連接在服務(wù)器先開啟監(jiān)聽服務(wù),等待客戶端連接后再運(yùn)行客戶端代碼……命令行參數(shù):IP+端口號(hào)+昵稱開啟監(jiān)聽listen……輸出錯(cuò)誤信息連接成功后創(chuàng)建兩個(gè)線程th1,th2用于發(fā)送和接收服務(wù)器的信息連接成功后創(chuàng)建一個(gè)線程,處理該用戶發(fā)送過(guò)來(lái)的消息和選項(xiàng)輸出錯(cuò)誤信息連接成功后創(chuàng)建兩個(gè)線程th1,th2用于發(fā)送和接收服務(wù)器的信息連接成功后創(chuàng)建一個(gè)線程,處理該用戶發(fā)送過(guò)來(lái)的消息和選項(xiàng)發(fā)送其它數(shù)字則把消息私聊發(fā)送給該客戶端發(fā)送其它數(shù)字則把消息私聊發(fā)送給該客戶端三:分工合作李元池負(fù)責(zé)服務(wù)器端的編寫,宋權(quán)負(fù)責(zé)客戶端的編寫,在寫的過(guò)程中商量好用于收發(fā)消息的結(jié)構(gòu)體保持一致。四:運(yùn)行步驟及注意事項(xiàng):在服務(wù)器開啟監(jiān)聽服務(wù)之后,啟用客戶端段進(jìn)行連接,服務(wù)器程序編譯:gcc2_sever.c–osever–lpthread?? 運(yùn)行:./s客戶端程序編譯:gcc1_client.c–oclient–lpthread? ?運(yùn)行:./c+服務(wù)器的IP+端口號(hào)+你的昵稱目前代碼存在的問(wèn)題有:用戶昵稱重復(fù)處理;異常退出處理;五:運(yùn)行截圖?開啟一個(gè)服務(wù)器和三個(gè)客戶端昵稱分別為:李元池,更淵博,許陽(yáng),1:(群聊)李元池發(fā)送一個(gè)"Hello!everybody!”的消息:2:私聊:李元池給客戶端2更淵博發(fā)送消息:3:許陽(yáng)給客戶端1,李元池發(fā)送消息:(????)??嗨boby!六:個(gè)人心得總結(jié)這兩個(gè)星期的課余時(shí)間主要和宋權(quán)一起寫了Linux網(wǎng)絡(luò)編程的大作業(yè),當(dāng)然學(xué)習(xí)的時(shí)候遇到了許多問(wèn)題,比如:實(shí)踐做聊天室的時(shí)候問(wèn)題百出,剛開始的時(shí)候不知道怎么實(shí)現(xiàn)多個(gè)客戶端通信,而通過(guò)測(cè)試發(fā)現(xiàn)每次客戶端連接時(shí)的套接字不一樣,都是從開始隨著客戶端連接的增多而遞增的,所以我把每次連接時(shí)的套接字都存到了數(shù)組里,接著問(wèn)題是客戶端連接的時(shí)候要嗎不能做到同步發(fā)送,要嗎有的客戶端收不到信息,又或者是服務(wù)器多轉(zhuǎn)發(fā)幾次,通過(guò)上網(wǎng)搜索和交流發(fā)現(xiàn)是沒有實(shí)現(xiàn)并發(fā),而實(shí)現(xiàn)并發(fā)的方式有i/o多線路,多進(jìn)程和多線程,而我用的是多線程實(shí)現(xiàn)的并發(fā)的。這些問(wèn)題解決后,群聊實(shí)現(xiàn)了;那么,私聊呢,該如何實(shí)現(xiàn),在客戶端建立一個(gè)結(jié)構(gòu)體用于向服務(wù)器發(fā)送和接受消息,而在服務(wù)器里面這有一個(gè)結(jié)構(gòu)體數(shù)組保存鏈接在線的客戶端消息,還有一個(gè)套接字描述符的數(shù)組用于保存客戶端的套接字,服務(wù)器在接收到客戶端發(fā)過(guò)來(lái)的消息時(shí)會(huì)判斷客戶的發(fā)送選項(xiàng),根據(jù)選項(xiàng)來(lái)找到對(duì)應(yīng)下標(biāo)的客戶端套接字并把消息發(fā)送給該客戶端.通過(guò)此次雖然學(xué)到了不少,但是自身問(wèn)題缺點(diǎn)也暴露了很多,最主要的是學(xué)到了提高如何處理問(wèn)題的能力,遇到問(wèn)題時(shí)該如何查找問(wèn)題產(chǎn)生的原因,該如何解決問(wèn)題,解決問(wèn)題時(shí)的思路思想;自身問(wèn)題就是還是自己思路比較狹窄,學(xué)東西比較慢,感覺學(xué)過(guò)之后就忘了??偟膩?lái)說(shuō)通過(guò)這兩個(gè)星期的學(xué)習(xí)學(xué)的東西還挺多的。七:附錄客戶端代碼!//Client.cpp#include〈stdio.h〉#include〈netinet/in.h>#include<sys/socket。h>#include<sys/types。h>#include〈string。h>#include<stdlib.h>#include<netdb.h>#include〈unistd.h〉#include<signal.h>#include<time.h>#include<errno.h>#defineMAX_SIZE100void*send_fun(void*arg);void*recv_fun(void*arg);voiditoa(inti,char*string){intpower,j;j=i;for(power=1;j〉=10;j/=10)power*=10;for(;power>0;power/=10){*string++=’0’+i/power;i%=power;}*string='\0';}voidshow_system_time()?//得到當(dāng)前系統(tǒng)時(shí)間{time_ttimep;structtm*p_curtime;char*time_tmp;time_tmp=(char*)malloc(2);memset(time_tmp,0,2);time(&timep);p_curtime=localtime(&timep);printf("(%d:%d:%d)\n",p_curtime-〉tm_hour,p_curtime->tm_min,p_curtime—>tm_sec);}structuser_messageum;structuser_message{ charmessage[100]; charname[20]; intl;//用戶標(biāo)識(shí)};voidmenu() {?? printf(”\t在輸入消息后回車,\n"); ?printf(”\t然后再輸入用戶客戶端的編號(hào),進(jìn)入私聊發(fā)送給對(duì)應(yīng)用戶\n”);??printf(”\t當(dāng)輸入—1的時(shí)候?yàn)?為群聊!\n");? printf("\t輸入消息為quit的時(shí)候退出該聊天室\n”);?}intmain(intargc,char*argv[]){structsockaddr_inclientaddr;//定義地址結(jié)構(gòu)pid_tpid;intn,clientfd;//定義客戶端套接字structhostent*host;char*buf,*buf_r;if(argc<3){printf(”usage:\n”);printf("%shostportname\n",argv[1]);exit(1);}printf(”%s\n”,argv[3]); strcpy(,argv[3]);host=gethostbyname(argv[1]);//服務(wù)器IPclientaddr.sin_family=AF_INET;clientaddr.sin_port=htons((uint16_t)atoi(argv[2]));clientaddr。sin_addr=*((structin_addr*)host->h_addr);bzero(&(clientaddr.sin_zero),0);if((clientfd=socket(AF_INET,SOCK_STREAM,0))==—1)//綁定客戶端套接字{perror(”socket\n");exit(1);}if(connect(clientfd,(structsockaddr*)&clientaddr,sizeof(structsockaddr))==—1)//連接服務(wù)端{(lán)perror("connect\n”);exit(1);}elsemenu();?pthread_tth1,th2;?if(pthread_creat(yī)e(&th1,NULL,send_fun,(void*)&clientfd))?{? perror(”createthreadfail"); exit(1); } if(pthread_create(&th2,NULL,recv_fun,(void*)&clientfd))?{ perror("createthreadfail”); exit(1); } pthread_join(th1,NULL);?pthread_join(th2,NULL);?as:return0;}void*send_fun(void*arg){ intsfd=*((int*)arg); while(1) {? printf("輸入要發(fā)送的信息:");??bzero(um.message,100);? scanf("%s",um.message); ?printf(”發(fā)送選項(xiàng)(-1—>群聊):”); scanf("%d",&um。l);??if(um.l!=—1)? strcat(yī)(um.message,”(私密消息)”); ?intn=send(sfd,(char*)&um,sizeof(um),0);??if(n!=sizeof(um))??{ printf("sendfail!\n"); } }}void*recv_fun(void*arg){ intsfd=*((int*)arg); //charrecv_message[100]; structuser_messagemy;?while(1) {? intn=recv(sfd,(char*)&my,sizeof(my),0);? if(n==-1) { printf(”recvfail!\n"); ?exit(1);? } //get_system_time(time_str); printf(”\n收到來(lái)自%s的消息:%s",my。name,my。message);? show_system_time();?}}服務(wù)器端代碼!//Sever。c#include<stdio.h〉#include〈ctype。h〉#include<sys/socket.h>#include〈arpa/inet.h>#include<strings.h>#include〈string.h>#include<
溫馨提示
- 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ù)覽,若沒有圖紙預(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025標(biāo)準(zhǔn)的攝影作品使用許可合同
- 二零二五年度凈水器綠色環(huán)保認(rèn)證采購(gòu)合同
- 2025年度文化產(chǎn)業(yè)分紅合作協(xié)議范本(含IP授權(quán))3篇
- 2025年度公司設(shè)立前股東合作協(xié)議書(含知識(shí)產(chǎn)權(quán)保護(hù))3篇
- 2025年度公司股東間應(yīng)急事件處理合作協(xié)議書3篇
- 2025年度農(nóng)產(chǎn)品電商平臺(tái)農(nóng)產(chǎn)品物流配送優(yōu)化合同版3篇
- 2025年度農(nóng)機(jī)租賃與農(nóng)業(yè)科研合作開發(fā)合同3篇
- 二零二五年度農(nóng)村宅基地租賃及土地流轉(zhuǎn)服務(wù)協(xié)議
- 2025年度農(nóng)產(chǎn)品深加工項(xiàng)目原料供應(yīng)合同版3篇
- 二零二五年度婚慶服務(wù)市場(chǎng)區(qū)域保護(hù)競(jìng)業(yè)禁止合同2篇
- 貼磚勞務(wù)合同
- 三年級(jí)語(yǔ)文學(xué)情全面分析
- 評(píng)審專家個(gè)人評(píng)審意見表
- 【語(yǔ)文】江蘇省蘇州市實(shí)驗(yàn)小學(xué)小學(xué)三年級(jí)上冊(cè)期末試題(含答案)
- 過(guò)敏性休克搶救步驟流程圖
- 【大二英語(yǔ)】【中國(guó)文化概況】中國(guó)文化概況期末資料
- 醫(yī)療器械經(jīng)營(yíng)質(zhì)量管理制度匯編
- 中國(guó)八大植被區(qū)域劃分
- 廠內(nèi)機(jī)動(dòng)叉車日常檢查記錄表
- 各類儀器儀表校驗(yàn)記錄表18篇
- 自動(dòng)生產(chǎn)排程 SMT 多線體 版
評(píng)論
0/150
提交評(píng)論