資源描述:
《基于TCP的多線程聊天室實(shí)現(xiàn)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、基于TCP的多線程聊天室實(shí)現(xiàn)Linux網(wǎng)絡(luò)應(yīng)用技術(shù)基于TCP的多線程聊天室設(shè)計(jì)姓名:李元池,宋權(quán)學(xué)號(hào):班級(jí):14軟工云計(jì)算4班頁8基于TCP的多線程聊天室實(shí)現(xiàn)一:設(shè)計(jì)思想:創(chuàng)建通信套接字,進(jìn)行對(duì)于客戶端的監(jiān)聽,定義的有一個(gè)全局變量intuser_fd[MAX_USER];用來保存已經(jīng)連接的用戶的通信套接字;用戶選擇群聊的時(shí)候服務(wù)器會(huì)把接收到的信息發(fā)送給除了發(fā)送此消息的其他所有客戶端,用戶選擇私聊則通過服務(wù)器端定義的結(jié)構(gòu)體structuser_mess{charmessage[100];charn
2、ame[20];intk;}User[10];中的k;來判斷次編號(hào)對(duì)應(yīng)的客戶套接字,把此消息發(fā)送給指定的客戶端!利用shocket套接字進(jìn)行對(duì)于信息的傳遞,同時(shí)shocket套接字也是一種對(duì)于信息識(shí)別的判斷依據(jù),根據(jù)套接字可以找到接受的信息的意圖,并且進(jìn)行處理相應(yīng)的信息,而且服務(wù)器還可以通過對(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ā)送過來后,服務(wù)器會(huì)自動(dòng)通過套接
3、字將信息在全部轉(zhuǎn)發(fā)給其他的客戶,實(shí)現(xiàn)客戶端之間的通信二:流程圖服務(wù)器(sever.c)客戶端(client.c)客戶端發(fā)過來其它數(shù)字如1,2,3,….則服務(wù)器會(huì)根據(jù)儲(chǔ)存在user_fd[],數(shù)組的下標(biāo)找到對(duì)應(yīng)的客戶端套接字,并把私聊消息正確的發(fā)送給該客戶端!接收私聊消息請(qǐng)求客戶端發(fā)送過來-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ù),等
4、待客戶端連接后再運(yùn)行客戶端代碼……命令行參數(shù):IP+端口號(hào)+昵稱開啟監(jiān)聽listen……輸出錯(cuò)誤信息連接成功后創(chuàng)建兩個(gè)線程th1,th2用于發(fā)送和接收服務(wù)器的信息連接成功后創(chuàng)建一個(gè)線程,處理該用戶發(fā)送過來的消息和選項(xiàng)發(fā)送其它數(shù)字則把消息私聊發(fā)送給該客戶端三:分工合作頁8基于TCP的多線程聊天室實(shí)現(xiàn)李元池負(fù)責(zé)服務(wù)器端的編寫,宋權(quán)負(fù)責(zé)客戶端的編寫,在寫的過程中商量好用于收發(fā)消息的結(jié)構(gòu)體保持一致。四:運(yùn)行步驟及注意事項(xiàng):在服務(wù)器開啟監(jiān)聽服務(wù)之后,啟用客戶端段進(jìn)行連接,服務(wù)器程序編譯:gcc2_seve
5、r.c–osever–lpthread運(yùn)行:./s客戶端程序編譯:gcc1_client.c–oclient–lpthread運(yùn)行:./c+服務(wù)器的IP+端口號(hào)+你的昵稱目前代碼存在的問題有:用戶昵稱重復(fù)處理;異常退出處理;五:運(yùn)行截圖開啟一個(gè)服務(wù)器和三個(gè)客戶端昵稱分別為:李元池,更淵博,許陽,1:(群聊)李元池發(fā)送一個(gè)”Hello!everybody!”的消息:2:私聊:李元池給客戶端2更淵博發(fā)送消息:頁8基于TCP的多線程聊天室實(shí)現(xiàn)3:許陽給客戶端1,李元池發(fā)送消息:(????)??嗨bob
6、y!六:個(gè)人心得總結(jié)這兩個(gè)星期的課余時(shí)間主要和宋權(quán)一起寫了Linux網(wǎng)絡(luò)編程的大作業(yè),當(dāng)然學(xué)習(xí)的時(shí)候遇到了許多問題,比如:實(shí)踐做聊天室的時(shí)候問題百出,剛開始的時(shí)候不知道怎么實(shí)現(xiàn)多個(gè)客戶端通信,而通過測(cè)試發(fā)現(xiàn)每次客戶端連接時(shí)的套接字不一樣,都是從頁8基于TCP的多線程聊天室實(shí)現(xiàn)開始隨著客戶端連接的增多而遞增的,所以我把每次連接時(shí)的套接字都存到了數(shù)組里,接著問題是客戶端連接的時(shí)候要嗎不能做到同步發(fā)送,要嗎有的客戶端收不到信息,又或者是服務(wù)器多轉(zhuǎn)發(fā)幾次,通過上網(wǎng)搜索和交流發(fā)現(xiàn)是沒有實(shí)現(xiàn)并發(fā),而實(shí)現(xiàn)并發(fā)
7、的方式有i/o多線路,多進(jìn)程和多線程,而我用的是多線程實(shí)現(xiàn)的并發(fā)的。這些問題解決后,群聊實(shí)現(xiàn)了;那么,私聊呢,該如何實(shí)現(xiàn),在客戶端建立一個(gè)結(jié)構(gòu)體用于向服務(wù)器發(fā)送和接受消息,而在服務(wù)器里面這有一個(gè)結(jié)構(gòu)體數(shù)組保存鏈接在線的客戶端消息,還有一個(gè)套接字描述符的數(shù)組用于保存客戶端的套接字,服務(wù)器在接收到客戶端發(fā)過來的消息時(shí)會(huì)判斷客戶的發(fā)送選項(xiàng),根據(jù)選項(xiàng)來找到對(duì)應(yīng)下標(biāo)的客戶端套接字并把消息發(fā)送給該客戶端。通過此次雖然學(xué)到了不少,但是自身問題缺點(diǎn)也暴露了很多,最主要的是學(xué)到了提高如何處理問題的能力,遇到問題時(shí)
8、該如何查找問題產(chǎn)生的原因,該如何解決問題,解決問題時(shí)的思路思想;自身問題就是還是自己思路比較狹窄,學(xué)東西比較慢,感覺學(xué)過之后就忘了??偟膩碚f通過這兩個(gè)星期的學(xué)習(xí)學(xué)的東西還挺多的。頁8基于TCP的多線程聊天室實(shí)現(xiàn)七:附錄客戶端代碼!//Client.cpp#include#include#include#include#include#include#incl