概述
詳細
一、項目功能
本項目使用java socket編程,實現一個具有GUI界面的在線聊天室:

該項目具有以下幾項功能:
-
構建一個服務器 S 和若干個客戶機 C;
-
每一台客戶機 C 都可以與服務器 S 和其他客戶機連接;
-
每一台客戶機 C 都可以通過 S 獲得其他客戶機發來的信息,並顯示哪一台客戶機在線,使用的是什么 IP 等;
-
群聊功能:每一台客戶機 C 可以通過服務器 S 的群聊天室與其他客戶機通信,即既可接收信息也可發送信息;
-
私聊功能:客戶機 C 通過選擇在線的用戶並進行連接,進行私聊;
-
支持文件傳輸
二、項目文件結構
項目機構圖如下:

客戶端和服務器分離,其中beautyeye_lnf.jar是GUI用到的第三方庫,compile.sh是編譯的腳本,里面的內容是編譯的命令,如下圖
rm -f *.class client/*.class server/*.class cd server javac *.java cd ../client javac *.java -classpath .:beautyeye_lnf.jar cd .. javac *.java
需要注意的是編譯客戶端的java文件時classpath為 .:beautyeye_lnf.jar ,編譯之后先運行服務器,端口號可換為其他端口
java ServerMain 8080
然后運行客戶端,可同時運行多個客戶端,在客戶端的GUI界面,填寫服務器IP和端口以及用戶姓名即可連接。
java -classpath .:client/beautyeye_lnf.jar ClientMain
三、實驗設計
1. 服務器設計思路
一共有兩台服務器,一台聊天服務器 ChatServer 和一台文件服務器 FileServer。
ChatServer
ChatServer 主要負責轉發聊天內容和用戶信息給所有用戶,用於支持跟進用戶信息功能和群聊功能。用戶 A 連接服務器的時候,首先向服務器發送一個用戶名,服務器收到之后搭建 socket 連接,然后記錄用戶 A 的 IP 和端口號,接着服務器將所有當前在線的用戶的名字、IP 和端口信息發送給這位剛上線的用戶 A,最后服務器向其他在線的用戶群發用戶 A 的名字、IP 和端口號以提示新用戶上線,這里IP 和端口號的作用是方便客戶端進行私聊。用戶 A 要下線的時候,發送一個命令"[OFFLINE]"給服務器提示下線,服務器清除相關資源並關閉連接,同時將用戶 A 要下線的消息轉發給其他在線用戶。在使用群聊功能時,某個客戶端發起群聊消息給服務器,服務器會把該消息轉發給其他在線用戶,從而實現群聊的功能。私聊時,客戶端向服務器發送私聊消息,由服務器轉發給指定的接收用戶。
下面是服務器與客戶端的交互的過程以及發送數據的格式:

FileServer
FileServer 主要為整個應用提供傳輸文件服務器,包括群發文件和私發文件。客戶端想要發送文件的時候,將文件發送給服務器並附加相關信息(群發/私發), 服務器根據客戶端的需求將文件轉發給其他在線⽤戶。下面是文件服務器和客戶端的交互過程:


2. 客戶端設計思路
群聊和私聊
與服務器交互,直接按照前面所述的格式向服務器發送數據,並且接受來自服務器的數據即可。發送數據時,將相關的數據按照相應的格式封裝好再進行發送, 接收數據時,將來自服務器的數據按照"[#]"進行切割,提取相關字段的數據之后呈遞給 GUI 層使用。
文件傳輸
客戶端不管是私聊還是群聊的文件都直接發送給服務器,再由服務器完成相應的轉發。通信過程在前面已經有所闡述,這里不再重復。
與 GUI 層的交互
客戶端和 GUI 分別是兩個線程,GUI 負責用戶界面的渲染和相關操作的響應,客戶端則是負責跟服務器進行數據交互或者私聊的時候跟其他客戶端進行交互,並且將交互的數據呈遞給 GUI 使用。下面簡單描述 GUI 與服務器的交互過程。

四、其他說明
第一次發布,有疑問的可以評論或聯系我
另外,說明一點:
本項目代碼不是直接的eclipse項目形式,不能直接導入eclipse運行,放入到eclipse運行,需要自己建java項目。
注:本文著作權歸作者,由demo大師發表,拒絕轉載,轉載需要作者授權
