日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java】JavaSocket编程开发聊天室-服务器端部分

發(fā)布時間:2023/12/10 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java】JavaSocket编程开发聊天室-服务器端部分 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Server服務器端.

服務器是計算機的一種,它比普通計算機運行更快、負載更高、價格更貴。服務器在網(wǎng)絡中為其它客戶機(如PC機、智能手機、ATM等終端甚至是火車系統(tǒng)等大型設備)提供計算或者應用服務。服務器具有高速的CPU運算能力、長時間的可靠運行、強大的I/O外部數(shù)據(jù)吞吐能力以及更好的擴展性。根據(jù)服務器所提供的服務,一般來說服務器都具備承擔響應服務請求、承擔服務、保障服務的能力。服務器作為電子設備,其內(nèi)部的結構十分的復雜,但與普通的計算機內(nèi)部結構相差不大,如:cpu、硬盤、內(nèi)存,系統(tǒng)、系統(tǒng)總線等。

ServerLauncher.

ServerLauncher是管理員看到的服務器端界面的啟動器,當管理員運行ServerLauncher時,有啟動一個進程來對于從屬性文件中預先配置的端口號到達的用戶進行監(jiān)聽,對應于每一個到達的用戶,都啟動一個對應的進程為其服務。

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是表示管理員實際上看到的圖形界面的類,其中包括了在線用戶列表、已注冊用戶列表的顯示、管理員廣播功能、管理員私聊用戶功能以及管理員強制用戶下線功能的控件與實現(xiàn)。最終的GUI界面如下所示,并且我們從GUI入手,逐步講述功能以及有關控件的實現(xiàn)細節(jié):

管理員廣播功能

這一功能其實并不是很復雜,它和某一個用戶在群聊中發(fā)送消息并沒有什么不同,只不過現(xiàn)在這一"用戶"的身份比較特殊,它代表了聊天室系統(tǒng)本身。獲取了ServerUI界面上管理員編輯完成的廣播消息內(nèi)容之后,服務器端就向每一個客戶端發(fā)送一個標記為【廣播】回復,而客戶端對于這樣的消息處理和標記為【聊天】的消息處理并沒有不同,只需要顯示在用戶看到的界面上即可。下面我們給出展示邏輯的代碼,以及廣播功能的展示:

//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右側那塊,根據(jù)管理員的選擇呈現(xiàn)出不同內(nèi)容的部分:

如上圖所示,分別能夠顯示出OnlineUsers以及RegisteredUsers,選項卡面板的代碼部分如下所示(注意其中的變量OnlineUsers和RegisteredUsers都已繼承自AbstractTableModel的類的實例化,所以能夠基于它們構造出JTable類型的變量供后續(xù)的addTab操作):

//Create a JTabbedPane. JTabbedPane TabbedPane = new JTabbedPane();//Get online users and registered users's data,and convert to JTable. OnlineUsersTable = new JTable(OnlineUsers); RegistedUsersTable = new JTable(RegisteredUsers);//Add tab. TabbedPane.addTab("OnlineUsersList", new JScrollPane(OnlineUsersTable)); TabbedPane.addTab("RegistedUsersList", new JScrollPane(RegistedUsersTable));

JPopupMenu的使用

顧名思義,這是一種彈出式的菜單,能夠提供一些自定義的功能,在ServerUI的界面上,管理員能夠選擇某一個在線用戶,進行【私聊】或者【強制下線】操作。

前面我們以及說過,此處JTabbedPane中的選項卡中的元素都是JTable類型的,并且其中實際的數(shù)據(jù)也是早已保存在服務器端的,所以剩下的問題就是,如何在JTable類型上添加進彈出式的菜單呢?我們只需要創(chuàng)建一個JPopupMenu,向其中加入綁定了對應動作的JMenuItem,最后再將JPopupMenu添加到JTable中即可,是一個層層包含的關系。

//Create JPopupMenu and JMenuItem respectfully. JPopupMenu PopupMenu = new JPopupMenu(); JMenuItem SendItem = new JMenuItem("SendMessage"); JMenuItem KickOutItem = new JMenuItem("KickOut");//Set command for distinguish. SendItem.setActionCommand("SendMessage"); KickOutItem.setActionCommand("KickOut");//Create ActionListener. ActionListener Do = new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e){//Get command.String command = e.getActionCommand();//Conduct differet action via difference between commands.ConductCommand(command);} };//Add actionListener SendItem.addActionListener(Do); KickOutItem.addActionListener(Do);//Add menu item into popup menu. PopupMenu.add(SendItem); PopupMenu.add(KickOutItem);//Add popup menu into table. OnlineUsersTable.setComponentPopupMenu(PopupMenu);

管理員私聊功能

這一功能和前面敘述過的聊天室中群聊消息的發(fā)送、管理員廣播功能的實現(xiàn)大同小異。只不過現(xiàn)在的用戶是特殊的用戶’System’,原理還是服務器端獲得了被私聊用戶的ID以后,向其發(fā)送一個標記為【聊天】的回復,后續(xù)該用戶的客戶端像對待普通消息那樣處理這一回復。

//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發(fā)送了一條系統(tǒng)通知,只有Hoe能看到這條消息,在線的其他用戶是無法看到的。

Hoe的確收到了這條消息,而Mega的界面中沒有這條消息:

管理員強制下線功能

強制下線功能只需要服務器向被選中用戶的客戶端發(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(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í)行強制下線功能,結果如下所示:

總結

以上是生活随笔為你收集整理的【Java】JavaSocket编程开发聊天室-服务器端部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。