socket(java) 搭建一个多人在线聊天室
目錄
- 說明
- Socket及java編程方法
- 功能結構
- 共享類
- 服務器端
- 客戶端
- 效果展示
- 代碼
說明
今年由于疫情原因只能在家里學習,今年學校有一門很重要的課程《面向對象》,學習了java中的編程思想、多線程、JML、UML等等東西,為了檢驗自己學習得好不好,再加上聽說 java 很適合 socket 編程,并且阿里云的服務器一年才九十多塊錢,我就決定(其實以上都不是主要原因,主要原因就是考完試在家閑的發慌)決定搭建一個多人在線聊天室,并且從中也可以學習 Swing、socket 等等。
后面代碼中所有GUI界面布局的內容,參見我之前的一篇博客 Swing的簡要學習記錄 。
本次實現的聊天室功能比較簡單,主要實現的功能如下:
- 帶有優美的 GUI界面(才怪);
- 在服務器允許的壓力下支持多人實時聊天;
- 支持賬戶登錄功能(不支持注冊功能,也就是服務器端預先設好了賬號)
以下是或許下一次要改進的內容:
- 實現注冊功能;
- 實現單人聊天;
- 實現好友功能
Socket及java編程方法
socket(套接字)是計算機之間進行通信的一種約定。如果學過操作系統應該會知道,進程之間的通信(IPC)包括管道、FIFO、共享內存、信號量機制等等,這里socket就是一種可用于不同計算機的進程之間的通信機制,用來解決網絡通信問題。
socket的通信基于TCP/IP協議,用(ip地址,協議,端口號)唯一標識某一個主機中的某一個進程,socket通信的數據傳輸方式包括兩種:SOCK_STREAM(流套接字,基于TCP協議,特點是不易出錯)和SOCK_DGRAM(數據報套接字,基于UDP協議,特點是速度快)。java中的socket編程應該主要是基于TCP協議的。TCP連接時有什么三次握手建立連接(connect)、四次握手斷開連接(close),這些說實話具體過程我都不了解。
我只知道 java 中應該怎么寫(注意里面的Macro是我自己定義的一個類,可以忽略):
- 服務器端:
主要的socket連接建立其實就這兩個,一般實現時會每當有客戶端連接時,新建一個線程去處理。
- 客戶端:
就這樣服務器和客戶端的socket連接就如此方便地建立好了!
- 常用文件流:
這些文件流跟本地的標準輸入輸出以及文件操作其實差不多,就是寫入讀出這些操作。
然后就可以服務器和客戶端就可以通過這兩個流進行通信了。
功能結構
共享類
這是服務器和客戶端共享的類,這些類不管在打包服務器的jar或者客戶端的jar時都應該包括在內,這些類包括Macro和Message,前者定義了一些通信中encode和decode的規則,以及服務器ip、端口號等等,后者用于雙方發送消息的載體。
- Macro類:定義通信規則(包括對LOGIN請求的加密和解密、LOGOUT請求的加密和解密、MESSAGE的加密和解密、登錄是否成功信號的定義)、服務器相關信息、一些信號的宏定義等等;
- Message類:定義了用戶發送的一個message需要包含的信息,有:發送者、發送時間、發送內容。
服務器端
服務器端處理用戶登錄登出請求、維護當前登錄狀態、維護用戶賬號密碼信息、處理message發送請求,并且要支持多用戶服務,主要包含的類如下:
- server類:一直運行,初始加載Info類和MessageSend類,并且一直調用serverSocket.accept()進行socket連接監聽,一但有socket連接成功,新建一個serverThread線程進行socket通信。
- serverThread類:這個類與Info類和MessageSend類有關聯關系,用于與socket通信。這個類需要一直讀入用戶請求,并且支持三種請求:
- LOGIN請求:通過Info類判斷該用戶是否合法,密碼是否正確,如果正確就在MessageSend中設定該用戶在線,并且通過socket返回登錄成功信號;
- LOGOUT請求:直接在MessageSend中設定該用戶注銷(不在線);
- MESSAGE請求:MessageSend中調用函數,給所有在線用戶發送該message。
- Info類:記錄用戶賬號密碼信息,提供賬號密碼是否正確的服務。
- MessageSend類:記錄在線用戶(username)以及與他們socket通信中的PrintWriter,實現發送Message的功能。
客戶端
客戶端用于用戶登錄以及聊天,主要實現了兩個GUI界面(登錄界面和聊天界面),包括的類如下:
- Client類:調用登錄界面。
- Login類:實現登錄界面的JFrame,與服務器建立連接,每當進行登錄操作時向服務器發送登錄請求,然后讀取登錄是否成功的信息,如果成功調用Dialog類運行并且向之傳送socket信息,然后銷毀自己。
- Dialog類:實現聊天界面的JFrame,通過socket與服務器通信,每當進行發送操作時,打包輸入框中的文字為Message,然后發送給服務器。并且一直讀入服務器傳來的數據,進行decode然后顯示在聊天框中。還要對窗體的關閉鍵進行監聽,關閉窗體時向服務器發送LOGOUT請求,并且關閉當前的socket,然后銷毀自己。
效果展示
代碼
詳細的代碼和運行方法,參見 這里 。
總結
以上是生活随笔為你收集整理的socket(java) 搭建一个多人在线聊天室的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv_图像修复
- 下一篇: 小博无线认证无法连接服务器,路由器wan