【Java】JavaSocket编程开发聊天室-服务器端部分
Server服務器端.
服務器是計算機的一種,它比普通計算機運行更快、負載更高、價格更貴。服務器在網絡中為其它客戶機(如PC機、智能手機、ATM等終端甚至是火車系統等大型設備)提供計算或者應用服務。服務器具有高速的CPU運算能力、長時間的可靠運行、強大的I/O外部數據吞吐能力以及更好的擴展性。根據服務器所提供的服務,一般來說服務器都具備承擔響應服務請求、承擔服務、保障服務的能力。服務器作為電子設備,其內部的結構十分的復雜,但與普通的計算機內部結構相差不大,如:cpu、硬盤、內存,系統、系統總線等。
ServerLauncher.
ServerLauncher是管理員看到的服務器端界面的啟動器,當管理員運行ServerLauncher時,有啟動一個進程來對于從屬性文件中預先配置的端口號到達的用戶進行監聽,對應于每一個到達的用戶,都啟動一個對應的進程為其服務。
int ServerPort = Integer.parseInt(getProperty("Port")); serverSocket = new ServerSocket(ServerPort);Socket socket = serverSocket.accept();//Create a new thread. new Thread(socket).start();并且在ServerLauncher中也對整個服務器端的UI風格進行了設置,同樣使用了Java獨特的跨平臺界面風格:
JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true);UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());//Display server UI. new ServerUI()ServerUI.
ServerUI是表示管理員實際上看到的圖形界面的類,其中包括了在線用戶列表、已注冊用戶列表的顯示、管理員廣播功能、管理員私聊用戶功能以及管理員強制用戶下線功能的控件與實現。最終的GUI界面如下所示,并且我們從GUI入手,逐步講述功能以及有關控件的實現細節:
管理員廣播功能
這一功能其實并不是很復雜,它和某一個用戶在群聊中發送消息并沒有什么不同,只不過現在這一"用戶"的身份比較特殊,它代表了聊天室系統本身。獲取了ServerUI界面上管理員編輯完成的廣播消息內容之后,服務器端就向每一個客戶端發送一個標記為【廣播】回復,而客戶端對于這樣的消息處理和標記為【聊天】的消息處理并沒有不同,只需要顯示在用戶看到的界面上即可。下面我們給出展示邏輯的代碼,以及廣播功能的展示:
//Special user:system. ADT_of_User system = new ADT_of_User(8888,"system");//Set sender with system. Message message = new Message(); message.setSender(system);//Mark reply with 'BROADCAST'. reply.setType(ReplyType.BROADCAST);//Reply to every client. SendReplyOfficial(ServerDataStore.OnlineInfoMap.get(ID),reply);
兩個在線的用戶顯然都收到了來自System的信息"We are under attack".
JTabbedPane的使用
選項卡面板是指ServerUI右側那塊,根據管理員的選擇呈現出不同內容的部分:
如上圖所示,分別能夠顯示出OnlineUsers以及RegisteredUsers,選項卡面板的代碼部分如下所示(注意其中的變量OnlineUsers和RegisteredUsers都已繼承自AbstractTableModel的類的實例化,所以能夠基于它們構造出JTable類型的變量供后續的addTab操作):
JPopupMenu的使用
顧名思義,這是一種彈出式的菜單,能夠提供一些自定義的功能,在ServerUI的界面上,管理員能夠選擇某一個在線用戶,進行【私聊】或者【強制下線】操作。
前面我們以及說過,此處JTabbedPane中的選項卡中的元素都是JTable類型的,并且其中實際的數據也是早已保存在服務器端的,所以剩下的問題就是,如何在JTable類型上添加進彈出式的菜單呢?我們只需要創建一個JPopupMenu,向其中加入綁定了對應動作的JMenuItem,最后再將JPopupMenu添加到JTable中即可,是一個層層包含的關系。
管理員私聊功能
這一功能和前面敘述過的聊天室中群聊消息的發送、管理員廣播功能的實現大同小異。只不過現在的用戶是特殊的用戶’System’,原理還是服務器端獲得了被私聊用戶的ID以后,向其發送一個標記為【聊天】的回復,后續該用戶的客戶端像對待普通消息那樣處理這一回復。
//Create user 'System' ADT_of_User system = new ADT_of_User(8888,"system"); Message message = new Message();//Set sender and receiver. message.setSender(system); message.setReceiver(ThatUser);//Mark reply with 'CHAT'. Reply reply = new Reply(); reply.setType(ReplyType.CHAT);//Reply to receiver. ServerRecordClient receiver = get(message.getReceiver().getID()); SendReply(receiver,reply);作為測試,我們讓管理員System給Hoe發送了一條系統通知,只有Hoe能看到這條消息,在線的其他用戶是無法看到的。
Hoe的確收到了這條消息,而Mega的界面中沒有這條消息:
管理員強制下線功能
強制下線功能只需要服務器向被選中用戶的客戶端發送一個標記為【退出】的回復,客戶端收到這樣的回復之后,就會自動關閉,從而完成了管理員強制下線的功能。
//Create user 'System' ADT_of_User system = new ADT_of_User(8888,"system"); Message message = new Message();//Set sender and receiver. message.setSender(system); message.setReceiver(KickedUser);//Mark reply with 'KICK_OUT'. Reply reply = new Reply(); reply.setType(ReplyType.KICK_OUT);//Reply to receiver. ServerRecordClient receiver = get(message.getReceiver().getID()); SendReply(receiver,reply);我們讓管理員向Mega執行強制下線功能,結果如下所示:
總結
以上是生活随笔為你收集整理的【Java】JavaSocket编程开发聊天室-服务器端部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Page Cache的落地问题
- 下一篇: Java Web开发技术教程入门-Jav