62、伺服器端的實現
我們還是先實現伺服器端的功能。你可以先參考前面的描述的介面,先把介面設計好,由於比較簡單,這裡我就不講解了。
一、實現伺服器對應每個客戶端的執行緒類。
在com.dao包中新建一個Server2ClientThread類,該類是伺服器端類的核心功能,其實現思路與上一天所講的差不多,也是每一個客戶端就對應一個執行緒來維護,不同的是,伺服器需要記錄所有的線上使用者和資訊,而這些資訊是所有的使用者共享的,所以這裡我們把這些變數定義為靜態變數(static),這點要注意。實現程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
class Server2ClientThread extends Thread {
|
二、實現伺服器端的功能類。
我們把啟動服務和關閉服務功能封裝成為兩個方法,在com.dao中新建類ServerStart。實現程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
|
三、繫結按鈕事件。
接下我們繫結前臺的啟動按鈕的單擊事件,由於程式執行ServerSocket的accept()時會產生阻塞程式的效果,為了不影響介面程式的正常執行,所以我們需要把Socket服務的啟動放入另外一個執行緒中,非同步執行。
使用者點選了啟動後,同時會不斷的重新整理線上使用者和最新聊天資訊,所以這裡我們有定義一個執行緒處理這個事情,每個500毫秒就讀取儲存在Server2ClientThread中的靜態變數(儲存了線上使用者和最新聊天資訊),以達到重新整理介面的效果。
使用者點選了啟動後,按鈕將會變成關閉。使用者在此點選按鈕就表示關閉服務。
實現程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|
好,我們的伺服器端功能就完成了。