Linux下socket多人聊天室

2021-10-07 04:04:16 字數 2603 閱讀 3509

四、功能模組流程圖

五、實驗截圖

六、問題及解決

七、參考文獻

附錄由於疫情原因,在家上了一學期的課,本次作業是作為「linux程式設計」的期末考核而布置的,代替了原本的線上答題考試,對於我這種比較喜歡動手的菜雞來說,還是很舒服的。

1.服務端功能模組圖

圖3.1 服務端功能模組圖

服務端主要完成的工作是對客戶端的請求進行對應的處理,以及對客戶端傳送的聊天記錄進行處理**。同時,在服務端選擇開啟聊天系統的同時,應當啟動乙個對應的守護程序以便於在後台記錄聊天系統的開啟關閉時間和使用者的登入推出時間。因此服務端具有開啟、關閉聊天系統,註冊使用者資訊,驗證使用者資訊,**聊天記錄以及開啟守護程序的功能。

2.客戶端功能模組圖

圖3.2 客戶端功能模組圖

客戶端主要完成的工作是註冊使用者,登入使用者以及檢視聊天記錄。需要說明的是,在使用者登入且資訊成功匹配後,才能進行聊天記錄的檢視。此外,考慮到使用者成功登入後會有退出的需求,客戶端開啟後會有關閉的需求,因此,客戶端功能模組中還具有退出使用者登入以及退出客戶端的功能。

3.守護程序功能模組圖

圖3.1 守護程序功能模組圖

守護程序使用者在服務端開啟後,實時記錄聊天系統的開啟、關閉時間,以及某一使用者的登入、退出時間。因此,守護程序具有持續接收服務端資訊,以及將接收的資訊寫入到系統日誌的功能。

由於服務端邏輯稍複雜,因此這裡對服務端的流程圖進行解釋。

1.服務端流程圖

(2)當輸入為 2 時,直接關閉服務端。

(3)當輸入為 3 時,訪問系統日誌檔案,並將系統日誌讀出,列印在服務端視窗。

2.客戶端流程圖

3.守護程序流程圖

說明:makefile檔案中共有四個target,包括server、client、daemon以及clean。

圖6.1 未make前的檔案目錄結構

2.執行批處理檔案run.bat執行makefile來編譯鏈結程式

3.開啟服務端,登入乙個客戶端並註冊未存在使用者

圖6.3 開啟服務端與客戶端,在客戶端註冊未註冊的使用者資訊

4.註冊已存在使用者zhangsan

圖6.4 在客戶端註冊已存在使用者,提示user has exist

5.另外開啟兩個客戶端,登入剛剛註冊的使用者以及兩個已存在使用者,模擬使用者聊天。

6.zhangsan和lisi輸入指定命令#bye退出聊天,cuiyanran輸入指定命令#chat record在聊天視窗檢視歷史聊天記錄。

7.cuiyanran退出聊天系統,此時所有使用者業已退出。在服務端根據提示輸入2,以退出伺服器。(輸入其他字元無效,程式不做處理)

圖6.7 在服務端輸入2以關閉伺服器

8.重新開啟服務端,按提示輸入3,以檢視系統日誌。

圖中圈起部分為上面的演示中系統記錄日誌得到的。

圖6.8 在服務端檢視系統日誌

對socket定義及格式、select函式使用、檔案描述符等的定義印象模糊:檢視《linux程式設計》[1]以及大量部落格進行學習,這裡只是概念及使用的問題。

由誰實現需求的核心功能:這裡的「核心功能」指的是驗證登入,在後台註冊資訊等。我最初規劃時將這些功能併入到客戶端,但轉念一想,這樣實現雖然簡單,但並不現實——客戶端顯然不能去訪問一些重要的檔案——若這些訪問功能在客戶端實現,那系統肯定是不安全的。如果把檔案儲存形式轉化為資料庫儲存,那客戶端豈不是可以直接訪問資料庫了。因此應該通過客戶端向服務端傳送相應請求,由服務端對這些請求進行相應的處理操作。

資料格式的設計:在編寫客戶端時,由於有功能需要傳送使用者名稱及密碼到服務端做驗證,因此我在客戶端連續兩次send,並在服務端的開頭連續兩次recv——這直接導致了聊天系統每隔一次才**一次資料。後來通過其他人的問答[6]才知道,服務端單獨接收連續兩條資料時,可以在客戶端按照一定格式拼裝兩條輸入為一條,這樣在服務端就可以用一條recv接收,並根據客戶端的拼裝格式在服務端解析。

Linux 下基於socket的簡單網路聊天室

原文 經過親測除錯修改了部分內容 服務端程式 server.c include include 包含套接字函式庫 include include 包含af inet相關結構 include 包含af inet相關操作的函式 include include include include includ...

多人暢聊系統

利用socket網路程式設計技術,實現客戶端和伺服器模型。利用多執行緒技術,通過訊號量控制線程的同步與互斥。伺服器端利用生產者與消費者模型對資料進行收發。利用開源jsoncpp和ncurses庫。模擬http協議自定義協議,進行註冊 登入 退出操作。註冊 登入 退出用的是tcp協議,而聊天用的是ud...

Linux下基於socket和多執行緒的聊天室小程式

要求 基於tcp編寫,乙個聊天室最多100人。客戶端 1 使用者需要登入,登入時只需要輸入乙個暱稱即可無需判斷暱稱是否重複 如果其他功能都ok考慮 2 使用者登入後連線伺服器端,進入聊天室 3 使用者可以輸入聊天資訊,也可以收到別人的聊天資訊。4 使用者可以用某個特殊單詞代表退出聊天室。額外功能 可...