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