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