版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于JAVA的談天室設(shè)計(jì)與實(shí)現(xiàn)設(shè)計(jì)目的:信息技術(shù)的高速進(jìn)展給人類生產(chǎn),生活帶來(lái)了廣泛而深遠(yuǎn)的影響?!吧暇W(wǎng)沖浪”、“數(shù)碼相機(jī)”“PDA”、“彩屏手機(jī)”、“藍(lán)牙技術(shù)"等新產(chǎn)品,新概念層出不窮,不斷沖擊著人們的視聽(tīng)。這些高科技成果為人們帶來(lái)便捷、快樂(lè)的同時(shí),也促進(jìn)了人機(jī)交互技術(shù)的進(jìn)展。人機(jī)交互是關(guān)于設(shè)計(jì)、評(píng)價(jià)和實(shí)現(xiàn)供人們使用的交互式計(jì)算機(jī)系統(tǒng),并圍繞相關(guān)的主要現(xiàn)象進(jìn)行討論的科學(xué)。它主要討論人與計(jì)算機(jī)之間的信息交換,涉及計(jì)算機(jī)科學(xué),心理學(xué),認(rèn)知科學(xué)等諸多學(xué)科,是信息技術(shù)的一個(gè)重要組成部分,并將連續(xù)對(duì)信息技術(shù)的進(jìn)展產(chǎn)生巨大影響。談天室是一項(xiàng)應(yīng)用廣泛,并且有用性強(qiáng)的一個(gè)格外典型的人機(jī)交互系統(tǒng).在信息世界里,談天工具的使用是格外頻繁的,如MSN、QQ、校內(nèi)通,之類的談天工具很多人都正在使用。此次設(shè)計(jì)的談天室系統(tǒng)雖然其功能簡(jiǎn)潔,但是在開(kāi)發(fā)技術(shù)和過(guò)程中,能夠充分學(xué)習(xí)和使用JAVA的技術(shù),進(jìn)一步培育同學(xué)面對(duì)對(duì)象程序設(shè)計(jì)的思想,加深對(duì)面對(duì)對(duì)象程序設(shè)計(jì)四大特性的理解。二、需求分析人們?nèi)粘I钪性絹?lái)越多地使用談天室這項(xiàng)應(yīng)用來(lái)為自己的工作和學(xué)習(xí)服務(wù)。一個(gè)操作簡(jiǎn)潔,界面友好、運(yùn)行穩(wěn)定的談天室對(duì)于小型局域網(wǎng)的用戶可以起到很好的溝通作用。所謂談天室就是一個(gè)可以讓很多用戶同時(shí)相互通信的網(wǎng)上園地,個(gè)人用戶可以通過(guò)談天室將自己融入整個(gè)主流社會(huì)中。依據(jù)目前使用談天室的用戶需求顯示,用戶對(duì)于談天室主要有以下幾點(diǎn)要求:(1)、談天功能:可以實(shí)時(shí)接收和發(fā)送信息,并能支持公聊和私聊的的方式,能夠查看談天記錄,談天過(guò)程中能對(duì)字體、表情等進(jìn)行設(shè)定等。(2)、用戶功能:可以隨時(shí)注冊(cè)和登錄及注銷(xiāo),并能選擇性加好友和刪除好友以及查看對(duì)方的開(kāi)放信息,還能看到對(duì)方的登錄狀態(tài)。(3)、文件傳輸功能:用戶可以共享資源,能發(fā)送及接收文件。(4)、保密功能:用戶可以設(shè)定自己的保密狀態(tài),使某些信息對(duì)于其他用戶是不行見(jiàn)的。(5)、系統(tǒng)穩(wěn)定:客戶端與服務(wù)端的連接穩(wěn)定,不消滅或者少消滅連接不上的情況。該簡(jiǎn)易談天室是為很多喜愛(ài)談天的用戶開(kāi)發(fā)設(shè)計(jì)的,和很多大型的網(wǎng)絡(luò)談天室相比該小談天室功能比較簡(jiǎn)潔,但能實(shí)現(xiàn)基本的談天功能,點(diǎn)對(duì)多、點(diǎn)對(duì)點(diǎn)談天和基本的用戶功能,登錄、注銷(xiāo)、查看在線用戶等。三、軟件功能描述(1)、用戶設(shè)置:功能描述:用戶自定義自己的登錄名,成功設(shè)置后,服務(wù)端能接收到新設(shè)置的用戶名;(2)、登錄功能:功能描述:在服務(wù)端開(kāi)啟的情況下,用戶可以以自己自定義或者默認(rèn)的登錄名和登錄地址端口登錄到客戶端,并能在服務(wù)器端顯示登錄狀態(tài);(3)、公聊:功能描述:用戶在談天室中可以選擇與“全部人”談天,談天室中的其他在線用戶可以正常接收并正確顯示公聊消息。(4)、私聊:功能描述:用戶可以選擇與談天室的在線用戶列表中的其他用戶談天。雙方的談天記錄對(duì)于談天室的其他用戶是不行見(jiàn)的。(5)、談天心情:功能描述:用戶在談天的過(guò)程中可以選擇相應(yīng)的心情來(lái)表達(dá)自己的情感.(6)、系統(tǒng)消息:功能描述:服務(wù)端正常運(yùn)行的過(guò)程中,在談天室的每一個(gè)用戶都能接收服務(wù)器端發(fā)送的信息提示信息。(7)、用戶的狀態(tài)。功能描述:每一個(gè)客戶端用戶都可以實(shí)時(shí)看到目前其他在線用戶的狀態(tài)。(8)、用戶注銷(xiāo):功能描述:用戶可以注銷(xiāo)自己的賬號(hào),并重新登記登錄名和地址。(9)、用戶退出:功能描述:用戶可以在正常情況下退出談天室。(10)、服務(wù)端掌握:功能描述:只有在服務(wù)端開(kāi)啟的情況下,用戶才能登陸成功和談天;用戶設(shè)置的地址端口也必須與服務(wù)端的偵聽(tīng)端口全都,否則不能登錄.四:主要模塊描述及流程圖模塊描述本談天室分為談天室服務(wù)端和談天室客戶端,服務(wù)端與客戶端之間通過(guò)套接口Socket(TCP)連接.在java中使用套接口相當(dāng)簡(jiǎn)潔,JavaAPI為處理套接口的通信供應(yīng)了一個(gè)類ja.Socket.,使得編寫(xiě)網(wǎng)絡(luò)應(yīng)用程序相對(duì)容易。服務(wù)器采納多線程以滿意多用戶的懇求,通過(guò)JDBC與后臺(tái)數(shù)據(jù)庫(kù)連接,并通過(guò)創(chuàng)建一個(gè)ServerSocket對(duì)象來(lái)監(jiān)聽(tīng)來(lái)自客戶的連接懇求,默認(rèn)IP地址為:127。0.0.1默認(rèn)端口為8888。(1)談天室服務(wù)端模塊圖:聊天室服務(wù)端聊天室服務(wù)端發(fā)送系統(tǒng)消息退出服務(wù)器消息顯示停止服務(wù)啟動(dòng)服務(wù)發(fā)送系統(tǒng)消息退出服務(wù)器消息顯示停止服務(wù)啟動(dòng)服務(wù)端口服務(wù)端口服務(wù):輸入要偵聽(tīng)的端口,默認(rèn)為8888;啟動(dòng)服務(wù):啟動(dòng)服務(wù)器,并開(kāi)頭在設(shè)置的端口中偵聽(tīng),客戶端用戶可以登錄并開(kāi)頭談天;停止服務(wù):關(guān)閉服務(wù)器,偵聽(tīng)結(jié)束.客戶端用戶不能再談天;發(fā)送系統(tǒng)消息:服務(wù)器端給全部人或者個(gè)別用戶發(fā)送消息.消息顯示:可以顯示全部用戶的談天記錄,和上線、下線信息。退出服務(wù)器:退出程序,并停止服務(wù);(2)談天室客戶端模塊圖:聊天室客戶端用戶設(shè)置聊天室客戶端用戶設(shè)置用戶注銷(xiāo)用戶注銷(xiāo)發(fā)送/接收聊天消息退出用戶登錄發(fā)送/接收聊天消息退出用戶登錄連接設(shè)置用戶設(shè)置:用戶可以設(shè)置自己的用戶名進(jìn)行談天;連接設(shè)置:用戶可以設(shè)置自己的服務(wù)器的IP地址和端口號(hào),默認(rèn)的連接地址為:127.0。0.1:8888;用戶登錄:只能在談天室服務(wù)端已開(kāi)啟的情況下,用戶才能登錄,用戶登錄之后才能開(kāi)頭談天,登錄后不能再修改用戶設(shè)置和連接設(shè)置;用戶注銷(xiāo):退出談天,可以連續(xù)修改用戶設(shè)置和連接設(shè)置;發(fā)送和接收談天信息:用戶可以給全部人或者個(gè)別用戶發(fā)送信息,并能看到其他用戶發(fā)送給自己或全部人的消息;退出:關(guān)閉全部談天并退出客戶端。流程圖聊天室服務(wù)器啟動(dòng)服務(wù)端口服務(wù)設(shè)置偵聽(tīng)端口聊天室服務(wù)器啟動(dòng)服務(wù)端口服務(wù)默認(rèn)端口:8888聊天登錄用戶設(shè)置聊天室客戶端聊天登錄用戶設(shè)置聊天室客戶端設(shè)置用戶名默認(rèn)連接地址或用戶名連接設(shè)置退出設(shè)置IP地址和端口連接設(shè)置退出五.主要類UML關(guān)系圖:ActionListenerChatServer-port:publicstaticinActionListenerChatServer-port:publicstaticin-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:UserLinkList-showStatus:JTextField+ChatServer():public+init():publicvoid+startService():publicvoid+stopService():publicvoid+sendStopToAll():publicvoid+sendMsgToAll(String):publicvoid+sendSystemMessage():publicvoidJFrameThreadServerListen-server:ServerSocket-userLinkList:UserLinkList -isStop:publicBoolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)ServerReceive-textarea:JTextArea-userLinkList:UserLinkList -isStop:publicBoolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)ServerListenServerListen-server:ServerSocket-userLinkList:UserLinkList -isStop:publicBoolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)1、談天室服務(wù)器端設(shè)計(jì):談天室服務(wù)端主要包括7個(gè)文件,它們的功能如下:(1)ChatServer.java:包含名為ChatServer的public類,其主要功能為定義服務(wù)器端的界面,添加大事偵聽(tīng)與大事處理。調(diào)用ServerListen類來(lái)實(shí)現(xiàn)服務(wù)端用戶上線與下線的偵聽(tīng),調(diào)用ServerReceive類來(lái)實(shí)現(xiàn)服務(wù)器端的消息的收發(fā)。(2)ServerListen.java:該類實(shí)現(xiàn)服務(wù)端用戶上線與下線的偵聽(tīng)。該類對(duì)用戶上線下線的偵聽(tīng)是通過(guò)調(diào)用用戶鏈表類(UserLinkList)來(lái)實(shí)現(xiàn)的,當(dāng)用戶上線與下線情況發(fā)生變化時(shí),該類會(huì)對(duì)主類的界面進(jìn)行相應(yīng)的修改。(3)ServerReceive.java:該類是實(shí)現(xiàn)服務(wù)器端的消息的收發(fā)的類.該類分別定義了向某用戶及全部人發(fā)送消息的方法,發(fā)送的消息會(huì)顯示在主界面類的界面上。(4)PortConf.java:該類繼承自JDialog,是用戶對(duì)服務(wù)器端偵聽(tīng)端口進(jìn)行修改配置的類.(5)Node。java:用戶鏈表的節(jié)點(diǎn)類,定義了鏈表中的用戶。該類與前面所講的鏈表節(jié)點(diǎn)Node類的功能相當(dāng)。(6)UserLinkList.java:用戶鏈表節(jié)點(diǎn)的簡(jiǎn)略實(shí)現(xiàn)類.該類通過(guò)構(gòu)造函數(shù)構(gòu)造用戶鏈表,定義了添加用戶,刪除用戶、返回用戶數(shù)、依據(jù)用戶名查找用戶、依據(jù)索引查找用戶這5個(gè)方法。(7)Help.java:服務(wù)端程序的幫助類。Thread談天室客戶端設(shè)計(jì):ThreadActionListenerActionListenerChatClient-port:publicstaticin-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:UserLinkList-showStatus:JTextField+ChatClient():public+init():publicvoid+Connect():publicvoid+DisConnect():publicvoid+SendMessage():publicvoidJFrameClientReceiveClientReceive-socket:Socket-output:ObjectOutputStream-input:ObjectInputStream+ClientReceive(Socket,ObjectOutputStream,ObjectInputStream,JComboBox,JTextArea,JTextField)談天室客戶端主要包括5個(gè)文件,它們的功能如下:(1)ChatClient.java:包含名為Chat(yī)Client的public類,其主要功能為定義客戶端的界面,添加大事偵聽(tīng)與大事處理。該類定義了Connect()與DisConnect()方法實(shí)現(xiàn)與服務(wù)器的連接與斷開(kāi)連接.當(dāng)?shù)卿浀街付ǖ姆?wù)器時(shí),調(diào)用ClientReceive類實(shí)現(xiàn)消息收發(fā),同時(shí)該類還定義了SendMessage()方法來(lái)向其他用戶發(fā)送帶有表情的消息或者靜靜話.(2)ClientReceive.java:該類是實(shí)現(xiàn)服務(wù)器端與客戶端消息收發(fā)的類。(3)ConnectConf.java:該類繼承自JDialog,是用戶對(duì)所要連接的服務(wù)器IP及偵聽(tīng)端口進(jìn)行修改配置的類。(4)UserConf.java:該類繼承自JDialog,是用戶對(duì)連接到服務(wù)器所顯示的用戶名進(jìn)行修改配置的類。(5)Help。java:客戶端程序的幫助類。六.主要程序代碼清單和注釋說(shuō)明:******************ChatServer.java****************************************?publicvoidactionPerformed(ActionEvente){??Objectobj=e。getSource();??if(obj==startServer||obj==startItem){//啟動(dòng)服務(wù)端 ??startService();??}? elseif(obj==stopServer||obj==stopItem){//停止服務(wù)端 ? intj=JOptionPane.showConfirmDialog(?? ?this,"真的停止服務(wù)嗎?",”停止服務(wù)”,? ??JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);???if(j==JOptionPane。YES_OPTION){? ??stopService(); ??}??}? elseif(obj==portSet||obj==portItem){//端口設(shè)置???//調(diào)出端口設(shè)置的對(duì)話框 ? PortConfportConf=newPortConf(this);???portConf.show();??}??elseif(obj==exitButton||obj==exitItem){//退出程序???intj=JOptionPane.showConfirmDialog(????this,"真的要退出嗎?","退出”,? ?JOptionPane。YES_OPTION,JOptionPane。QUESTION_M(jìn)ESSAGE);?? if(j==JOptionPane.YES_OPTION){?? ?stopService();?? ?System。exit(0);? ?}??}? elseif(obj==helpItem){//菜單欄中的幫助? ?//調(diào)出幫助對(duì)話框? HelphelpDialog=newHelp(this);?? helpDialog。show();??}??elseif(obj==sysMessage||obj==sysMessageButton){//發(fā)送系統(tǒng)消息???sendSystemMessage(); ?} }?/**?*啟動(dòng)服務(wù)端 */ publicvoidstartService(){??try{? ?serverSocket=newServerSocket(port,10);???messageShow。append(”服務(wù)端已經(jīng)啟動(dòng),在"+port+"端口偵聽(tīng)...\n");?? startServer.setEnabled(false);???startItem。setEnabled(false);???portSet。setEnabled(false);???portItem。setEnabled(false);???stopServer。setEnabled(true);???stopItem.setEnabled(true);?? sysMessage。setEnabled(true);??}??catch(Exceptione){???//System.out。println(e);??}? userLinkList=newUserLinkList();? listenThread=newServerListen(serverSocket,combobox,?? messageShow,showStatus,userLinkList);??listenThread.start();?}?/** *關(guān)閉服務(wù)端?*/ publicvoidstopService(){??try{???//向全部人發(fā)送服務(wù)器關(guān)閉的消息?? sendStopToAll();???listenThread.isStop=true;???serverSocket.close();? ?intcount=userLinkList。getCount();? ?inti=0; ??while(i〈count){????Nodenode=userLinkList.findUser(i);??? node.input.close();?? ?node。output.close(); ???node。socket.close(); ???i++;???}???stopServer.setEnabled(false); ??stopItem.setEnabled(false);???startServer.setEnabled(true); ??startItem。setEnabled(true);???portSet.setEnabled(true);???portItem.setEnabled(true);? ?sysMessage.setEnabled(false);???messageShow.append("服務(wù)端已經(jīng)關(guān)閉\n");???combobox。removeAllItems(); ? combobox。addItem("全部人"); ?}? catch(Exceptione){ ??//System。out.println(e); ?} } /** *向全部人發(fā)送服務(wù)器關(guān)閉的消息?*/?publicvoidsendStopToAll(){ ?intcount=userLinkList。getCount();??inti=0;??while(i<count){ ? Nodenode=userLinkList。findUser(i);? ?if(node==null){??? i++;? ??continue;???}? ?try{??? node.output。writeObject("服務(wù)關(guān)閉");? ??node.output.flush();?? }???cat(yī)ch(Exceptione){????//System.out.println("$$$"+e);? ?}???i++;? } }?/**?*向全部人發(fā)送消息?*/?publicvoidsendMsgToAll(Stringmsg){? intcount=userLinkList.getCount();//用戶總數(shù) ?inti=0;??while(i〈count){???Nodenode=userLinkList.findUser(i);???if(node==null){????i++;?? continue;???}? ?try{? ?node.output.writeObject("系統(tǒng)信息");? ??node。output。flush();????node。output.writeObject(msg);????node。output.flush();? ?}???catch(Exceptione){? ??//System.out.println("@@@”+e);???} ? i++;??} ?sysMessage。setText("”);?} /**?*向客戶端用戶發(fā)送消息?*/ publicvoidsendSystemMessage(){ ?StringtoSomebody=combobox.getSelectedItem().toString();??Stringmessage=sysMessage。getText()+"\n";??messageShow.append(message);??//向全部人發(fā)送消息? if(toSomebody.equalsIgnoreCase("全部人”)){???sendMsgToAll(message);??}? else{???//向某個(gè)用戶發(fā)送消息?? Nodenode=userLinkList.findUser(toSomebody);???try{????node。output.writeObject("系統(tǒng)信息");? ??node.output.flush();????node.output.writeObject(message);? ??node.output。flush();???} ??catch(Exceptione){? ?//System.out.println(”!!?。?e);???}?? sysMessage。setText("”);//將發(fā)送消息欄的消息清空? }?}?publicstat(yī)icvoidmain(String[]args){? Chat(yī)Serverapp=newChatServer();?}}************************ServerListen.java:***************************publicclassServerListenextendsThread{?ServerSocketserver;??JComboBoxcombobox;?JTextAreatextarea;?JTextFieldtextfield;?UserLinkListuserLinkList;//用戶鏈表?Nodeclient; ServerReceiverecvThread;??publicbooleanisStop;?/*?*談天服務(wù)端的用戶上線于下線偵聽(tīng)類?*/?publicServerListen(ServerSocketserver,JComboBoxcombobox,??JTextAreat(yī)extarea,JTextFieldtextfield,UserLinkListuserLinkList){??this.server=server; bobox=combobox; ?this.textarea=textarea;??this。textfield=textfield;??this.userLinkList=userLinkList; ??isStop=false;?}?publicvoidrun(){??while(!isStop&&?。骵rver。isClosed()){ ??try{????client=newNode();????client.socket=server.accept(); ? client。output=newObjectOutputStream(client.socket。getOutputStream()); ???client。output。flush();????client。input=newObjectInputStream(client.socket。getInputStream());????client.username=(String)client。input.readObject();????? ??//顯示提示信息????combobox.a(chǎn)ddItem(client.username);? ??userLinkList.addUser(client);????textarea。append("用戶"+client。username+"上線"+”\n"); ???textfield.setText(”在線用戶”+userLinkList.getCount()+"人\n”);??? ?? recvThread=newServerReceive(textarea,textfield,? ???combobox,client,userLinkList);?? ?recvThread。start(); ??} ? catch(Exceptione){?? }??} }}********************************ServerReceive.java***********************/**服務(wù)器收發(fā)消息的類*/publicclassServerReceiveextendsThread{ JTextAreatextarea;?JTextFieldtextfield;?JComboBoxcombobox; Nodeclient;?UserLinkListuserLinkList;//用戶鏈表?publicbooleanisStop;??publicServerReceive(JTextAreatextarea,JTextFieldtextfield, ?JComboBobobox,Nodeclient,UserLinkListuserLinkList){??this.textarea=textarea;? this。textfield=textfield; ?this。client=client;??this.userLinkList=userLinkList; bobox=combobox;? ??isStop=false;?}?publicvoidrun(){??//向全部人發(fā)送用戶的列表? sendUserList();??? while(!isStop&&!client.socket。isClosed()){? ?try{?? ?Stringtype=(String)client。input.readObject(); ???if(type.equalsIgnoreCase("談天信息")){?? ??StringtoSomebody=(String)client.input。readObject();??? Stringstat(yī)us=(String)client.input.readObject();?????Stringaction=(String)client.input。readObject();?????Stringmessage=(String)client。input.readObject();?? ?? ? ?Stringmsg=client.username??? ? ?+""+action????? +"對(duì)"???????+toSomebody ??? ?+"說(shuō):" ?? ? +message ?? ?? +”\n"; ? ?if(status。equalsIgnoreCase(”靜靜話")){?? ?? msg="[靜靜話]”+msg;?????}?????textarea.append(msg); ??? ??if(toSomebody.equalsIgnoreCase("全部人")){??????sendToAll(msg);//向全部人發(fā)送消息?????}???? else{??????try{ ??????client.output.writeObject(”談天信息”);?? ??? client.output.flush();??? ??client.output.writeObject(msg); ? client.output。flush();? ???} ?? ? catch(Exceptione){ ???? ?//System.out.println("###"+e);??? ??}? ???????? Nodenode=userLinkList。findUser(toSomebody);??? ? ??? ??if(node!=null){???????node.output。writeObject("談天信息”); ? ?? node.output.flush();? ?????node。output.writeObject(msg);?? ? ??node.output.flush(); ?????} ????} ? ?}????elseif(type.equalsIgnoreCase("用戶下線")){?????Nodenode=userLinkList.findUser(client.username); ? ??userLinkList.delUser(node);??????????Stringmsg="用戶"+client.username+”下線\n"; ?intcount=userLinkList。getCount();?????combobox.removeAllItems();?????combobox.a(chǎn)ddItem("全部人");?????inti=0;?????while(i〈count){ ???? node=userLinkList.findUser(i);?? ???if(node==null){?? ??i++;? ??? ?continue;????? }??????combobox.addItem(node.username);?? ???i++;? ???}??? ?combobox.setSelectedIndex(0);?????textarea。append(msg); ???textfield。setText(”在線用戶"+userLinkList。getCount()+"人\n”);?????sendToAll(msg);//向全部人發(fā)送消息?????sendUserList();//重新發(fā)送用戶列表,刷新???? ? ???break;?? }???}?? cat(yī)ch(Exceptione){? ??//System。out。println(e);?? }? }?} /* *向全部人發(fā)送消息?*/?publicvoidsendToAll(Stringmsg){??intcount=userLinkList。getCount();????inti=0;??while(i<count){ ??Nodenode=userLinkList。findUser(i);???if(node==null){ ???i++;?? ?continue;???}???try{ ?? node。output.writeObject("談天信息");????node.output。flush();?? ?node。output。writeObject(msg);????node。output.flush();?? }? ?catch(Exceptione){??? //System。out.println(e);???} ? ? ?i++;? } }?/*?*向全部人發(fā)送用戶的列表?*/?publicvoidsendUserList(){??Stringuserlist="”; ?intcount=userLinkList。getCount(); ?inti=0; ?while(i<count){ ? Nodenode=userLinkList。findUser(i);?? if(node==null){????i++; ? continue;? ?}???userlist+=node。username;?? userlist+='\n'; ??i++;? }??i=0;??while(i〈count){ Nodenode=userLinkList.findUser(i);?? if(node==null){????i++; ??continue; ??}???try{??? node.output.writeObject(”用戶列表”); ? ?node.output.flush();?? ?node。output.writeObject(userlist);????node.output。flush();???}? ?catch(Exceptione){????//System.out.println(e);? }? ?i++; }?}}*************************PortConf.java***********************************/***生成端口設(shè)置對(duì)話框的類*/publicclassPortConfextendsJDialog{?JPanelpanelPort=newJPanel();?JButtonsave=newJButton();?JButtoncancel=newJButton(); publicstaticJLabelDLGINFO=newJLabel(??”默認(rèn)端口號(hào)為:8888"); JPanelpanelSave=newJPanel();?JLabelmessage=newJLabel();?publicstaticJTextFieldportNumber;?publicPortConf(JFrameframe){ ?super(frame,true);??try{? ?jbInit();? }??catch(Exceptione){ ??e.printStackTrace(); ?} //設(shè)置運(yùn)行位置,使對(duì)話框居中 Dimensionscree(cuò)nSize=Toolkit.getDefaultToolkit().getScreenSize();??this.setLocation((int)(screenSize.width—400)/2+50,???? ?(int)(screenSize.height-600)/2+150); this。setResizable(false);?}?privat(yī)evoidjbInit()throwsException{??this。setSize(newDimension(300,120));??this.setTitle("端口設(shè)置");? message。setText("請(qǐng)輸入偵聽(tīng)的端口號(hào):");??portNumber=newJTextField(10);? portNumber.setText(””+ChatServer.port);??save.setText("保存");??cancel.setText("取消");??panelPort。setLayout(newFlowLayout());??panelPort。add(message);? panelPort.add(portNumber);? panelSave。add(newLabel(””));??panelSave。add(save); panelSave.a(chǎn)dd(cancel);??panelSave.a(chǎn)dd(newLabel(""));??ContainercontentPane=getContentPane();??contentPane.setLayout(newBorderLayout()); ?contentPane.add(panelPort,BorderLayout。NORTH);? contentPane.add(DLGINFO,BorderLayout.CENTER); contentPane.a(chǎn)dd(panelSave,BorderLayout.SOUTH); ?//保存按鈕的大事處理? save.addActionListener( ??newActionListener(){????publicvoidactionPerformed(ActionEventa){? ? ?intsavePort;??? ?try{? ??? ?? ? ?savePort=Integer.parseInt(PortConf.portNumber.getText());? ????if(savePort<1||savePort〉65535){???????PortConf.DLGINFO.setText("偵聽(tīng)端口必須是0-65535之間的整數(shù)!");???????PortConf.portNumber。setText("”);???? ?return;??? ??}??? ? ChatServer.port=savePort; ?? dispose(); ????}??? ?catch(NumberFormatExceptione){ ? ???PortConf。DLGINFO.setText("錯(cuò)誤的端口號(hào),端口號(hào)請(qǐng)?zhí)顚?xiě)整數(shù)!");??????PortConf.portNumber.setText("");? ???return;?? ??}? }???} );??//關(guān)閉對(duì)話框時(shí)的操作 ?this.a(chǎn)ddWindowListener(???newWindowAdapter(){? ??publicvoidwindowClosing(WindowEvente){?? ??DLGINFO。setText(”默認(rèn)端口號(hào)為:8888"); ??}? }??);? //取消按鈕的大事處理??cancel。addActionListener(???newActionListener(){? ??publicvoidactionPerformed(ActionEvente){??? ?DLGINFO。setText("默認(rèn)端口號(hào)為:8888");?????dispose();??? }???});?}}**********************Node.java*****************************************/***用戶鏈表的結(jié)點(diǎn)類*/publicclassNode{?Stringusername=null;?Socketsocket=null;?ObjectOutputStreamoutput=null;?ObjectInputStreaminput=null; Nodenext=null;}**************************UserLinkList.java*****************************/***用戶鏈表*/publicclassUserLinkList{?Noderoot;?Nodepointer;?intcount;?/** *構(gòu)造用戶鏈表?*/?publicUserLinkList(){ ?root=newNode();??root.next=null;??pointer=null;??count=0; }?/**?*添加用戶?*/?publicvoidaddUser(Noden){ ?pointer=root;?? ?while(pointer.next!=null){ ??pointer=pointer.next;??}??pointer.next=n;? n.next=null; ?count++;? ?} /**?*刪除用戶 */ publicvoiddelUser(Noden){? pointer=root;? while(pointer。next!=null){?? if(pointer。next==n){ ???pointer.next=n.next;??? count——;????????break;???}? pointer=pointer。next;??}?}?/**?*返回用戶數(shù)?*/?publicintgetCount(){??returncount;?}?/**?*依據(jù)用戶名查找用戶?*/?publicNodefindUser(Stringusername){? if(count==0)returnnull;? pointer=root; while(pointer。next!=null){ ? pointer=pointer.next;???if(pointer.username.equalsIgnoreCase(username)){? ??returnpointer; ??} ?}??returnnull; }?/**?*依據(jù)索引查找用戶?*/?publicNodefindUser(intindex){??if(count==0){? ?returnnull;? }? if(index〈0){ ?returnnull; ?}??pointer=root;??inti=0; ?while(i<index+1){?? if(pointer。next!=null){? ??pointer=pointer.next;? } ? else{ ??returnnull; }???i++; ?}? returnpointer;?}}**************************Help。java*************************************/***生成設(shè)置對(duì)話框的類*/publicclassHelpextendsJDialog{ JPaneltitlePanel=newJPanel();?JPanelcontentPanel=newJPanel(); JPanelclosePanel=newJPanel();?JButtonclose=newJButton(); JLabeltitle=newJLabel(”談天室服務(wù)端幫助");?JTextAreahelp=newJTextArea();?Colorbg=newColor(255,255,255);?publicHelp(JFrameframe){??super(frame,true);??try{ ??jbInit();??}??catch(Exceptione){ ??e.printStackTrace(); }? //設(shè)置運(yùn)行位置,使對(duì)話框居中??DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();? this.setLocation((int)(screenSize.width-400)/2,? ?? ?(int)(screenSize.height-320)/2);? this。setResizable(false);?}?privatevoidjbInit()throwsException{? this。setSize(newDimension(400,200)); ?this.setTitle("幫助"); titlePanel.setBackground(bg);;??contentPanel.setBackground(bg);??closePanel.setBackground(bg); ?help.setText(”1、設(shè)置服務(wù)端的偵聽(tīng)端口(默認(rèn)端口為8888)。\n"+ ?”2、點(diǎn)擊啟動(dòng)服務(wù)按鈕便可在指定的端口啟動(dòng)服務(wù).\n"+? ?”3、選擇需要接受消息的用戶,在消息欄中寫(xiě)入消息,之后便可發(fā)送消息。\n"+???"4、信息狀態(tài)欄中顯示服務(wù)器當(dāng)前的啟動(dòng)與停止?fàn)顟B(tài)、"+ ??”用戶發(fā)送的消息和\n服務(wù)器端發(fā)送的系統(tǒng)消息。");? help.setEditable(false);??titlePanel.add(newLabel(""));??titlePanel.add(title);??titlePanel.a(chǎn)dd(newLabel("”)); ?contentPanel.a(chǎn)dd(help);? closePanel.add(newLabel(""));??closePanel。add(close);??closePanel。add(newLabel("”));??ContainercontentPane=getContentPane();? contentPane.setLayout(newBorderLayout());? contentPane。add(titlePanel,BorderLayout.NORTH);??contentPane.add(contentPanel,BorderLayout.CENTER);? contentPane.add(closePanel,BorderLayout.SOUTH);??close.setText("關(guān)閉");? //大事處理??close.addActionListener(???newActionListener(){????publicvoidactionPerformed(ActionEvente){?? ??dispose();?? ?}???}); }}談天室客戶端設(shè)計(jì):****************************Chat(yī)Client.java******************************/**談天客戶端的主框架類*/publicclassChat(yī)ClientextendsJFrameimplementsActionListener{?/**?*?*/?privatestaticfinallongserialVersionUID=1L;?Stringip="127.0。0.1”;//連接到服務(wù)端的ip地址 intport=8888;//連接到服務(wù)端的端口號(hào)?StringuserName="狂狂";//用戶名?inttype=0;//0表示未連接,1表示已連接?JComboBoxcombobox;//選擇發(fā)送消息的接受者?JTextAreamessageShow;//客戶端的信息顯示?JScrollPanemessageScrollPane;//信息顯示的滾動(dòng)條?JLabelexpress,sendToLabel,messageLabel;?JTextFieldclientMessage;//客戶端消息的發(fā)送?JCheckBoxcheckbox;//靜靜話?JComboBoxactionlist;//表情選擇 JButtonclientMessageButton;//發(fā)送消息?JTextFieldshowStatus;//顯示用戶連接狀態(tài)?Socketsocket; ObjectOutputStreamoutput;//網(wǎng)絡(luò)套接字輸出流?ObjectInputStreaminput;//網(wǎng)絡(luò)套接字輸入流 ClientReceiverecvThread;?//建立菜單欄 JMenuBarjMenuBar=newJMenuBar(); //建立菜單組 JMenuoperat(yī)eMenu=newJMenu("操作(O)");?//建立菜單項(xiàng) JMenuItemloginItem=newJMenuItem("用戶登錄(I)",newImageIcon("face/98.gif”)); JMenuItemlogoffItem=newJMenuItem("用戶注銷(xiāo)(L)",newImageIcon("face/icon.gif”));?JMenuItemexitItem=newJMenuItem("退出(X)”,newImageIcon("face/smile.gif"));?JMenuconMenu=newJMenu("設(shè)置(C)");?JMenuItemuserItem=newJMenuItem(”用戶設(shè)置(U)”,newImageIcon("face/messenger_big.gif”));?JMenuItemconnectItem=newJMenuItem(”連接設(shè)置(C)",newImageIcon(”face/Uabrand。gif”));?JMenuhelpMenu=newJMenu(”幫助(H)”); JMenuItemhelpItem=newJMenuItem(”幫助(H)”,newImageIcon("face/HelpCenter.gif"));?//建立工具欄 JToolBartoolBar=newJToolBar();?//建立工具欄中的按鈕組件?JButtonloginButton;//用戶登錄?JButtonlogoffButton;//用戶注銷(xiāo) JButtonuserButton;//用戶信息的設(shè)置 JButtonconnectButton;//連接設(shè)置?JButtonexitButton;//退出按鈕?//框架的大小?DimensionfaceSize=newDimension(400,600);?JPaneldownPanel;?GridBagLayoutgirdBag; GridBagConstraintsgirdBagCon;?publicChatClient(){??init();//初始化程序??//添加框架的關(guān)閉大事處理? this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);??this。pack(); ?//設(shè)置框架的大小??this.setSize(faceSize);??this.setVisible(true); ?setIconI(lǐng)mage(getToolkit().getImage(”face/love.gif"));??//設(shè)置運(yùn)行時(shí)窗口的位置? DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize(); ?this。setLocation((int)(screenSize。width-faceSize.getWidth())/2,? ? ?(int)(screenSize.height—faceSize。getHeight())/2); ?this.setResizable(false);??this.setTitle("談天室客戶端");//設(shè)置標(biāo)題??//為操作菜單欄設(shè)置熱鍵’V'??operateMenu.setMnemonic(’O’);??//為用戶登錄設(shè)置快捷鍵為ctrl+i??loginItem.setMnemonic(’I’); ?loginI(lǐng)tem.setAccelerator(KeyStroke。getKeyStroke(KeyEvent。VK_I,InputEvent.CTRL_MASK));? //為用戶注銷(xiāo)快捷鍵為ctrl+l logoffItem.setMnemonic(’L');? logoffItem.setAccelerat(yī)or(KeyStroke.getKeyStroke(KeyEvent.VK_L,InputEvent.CTRL_MASK));??//為退出快捷鍵為ctrl+x exitItem.setMnemonic(’X’);??exitItem.setAccelerat(yī)or(KeyStroke.getKeyStroke(KeyEvent。VK_X,InputEvent.CTRL_MASK));??//為設(shè)置菜單欄設(shè)置熱鍵’C'? conMenu.setMnemonic('C');? //為用戶設(shè)置設(shè)置快捷鍵為ctrl+u? userItem。setMnemonic(’U');??userItem。setAccelerator(KeyStroke.getKeyStroke(KeyEvent。VK_U,InputEvent.CTRL_MASK)); ?//為連接設(shè)置設(shè)置快捷鍵為ctrl+c??connectItem。setMnemonic('C');??connectItem.setAccelerat(yī)or(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK)); ?//為幫助菜單欄設(shè)置熱鍵'H’??helpMenu.setMnemonic(’H’);??//為幫助設(shè)置快捷鍵為ctrl+p??helpItem.setMnemonic(’H');??helpItem。setAccelerator(KeyStroke。getKeyStroke(KeyEvent.VK_H,InputEvent。CTRL_MASK));?} /**?*程序初始化函數(shù)?*/?publicvoidinit(){? ContainercontentPane=getContentPane();? contentPane.setLayout(newBorderLayout()); ?//添加菜單欄??operateMenu.add(loginItem); ?operateMenu。add(logoffItem);??operateMenu.addSeparator();??operateMenu.add(exitItem);? jMenuBar。add(operateMenu);??conMenu.a(chǎn)dd(userItem);??conMenu.addSeparator();??conMenu.add(connectItem);??jMenuBar.a(chǎn)dd(conMenu);? helpMenu.add(helpItem); ?jMenuBar。add(helpMenu);? setJMenuBar(jMenuBar);??//初始化按鈕??loginButton=newJButton("登錄”);??logoffButton=newJButton("注銷(xiāo)");??userButton=newJButton("用戶設(shè)置"); connectButton=newJButton("連接設(shè)置”);? exitButton=newJButton(”退出");??//當(dāng)鼠標(biāo)放上顯示信息? loginButton.setToolTipText(”連接到指定的服務(wù)器"); ?logoffButton。setToolTipText("與服務(wù)器斷開(kāi)連接"); userButton.setToolTipText(”設(shè)置用戶信息”);? connectButton。setToolTipText("設(shè)置所要連接到的服務(wù)器信息"); ?//將按鈕添加到工具欄? toolBar.a(chǎn)dd(userButton); ?toolBar。add(connectButton);??toolBar.addSeparator();//添加分隔欄 toolBar。add(loginButton);??toolBar.a(chǎn)dd(logoffButton); ?toolBar.a(chǎn)ddSeparator();//添加分隔欄??toolBar。add(exitButton);??contentPane.add(toolBar,BorderLayout。NORTH); ?checkbox=newJCheckBox("靜靜話");??checkbox。setSelected(false); actionlist=newJComboBox(); ?actionlist.addItem(”微笑地");? actionlist.addItem(”高興地”);??actionlist.addItem(”輕輕地");??actionlist。addItem(”生氣地"); ?actionlist。setSelectedIndex(0); ?//初始時(shí)??loginButton.setEnabled(true);??logoffButton。setEnabled(false);? //為菜單欄添加大事監(jiān)聽(tīng) ?loginItem.a(chǎn)ddActionListener(this);??logoffItem.a(chǎn)ddActionListener(this);??exitItem。addActionListener(this);??userItem。addActionListener(this);??connectItem.a(chǎn)ddActionListener(this);??helpItem.a(chǎn)ddActionListener(this);??//添加按鈕的大事偵聽(tīng)??loginButton.addActionListener(this);??logoffButton.a(chǎn)ddActionListener(this); userButton。addActionListener(this); ?connectButton.a(chǎn)ddActionListener(this);??exitButton.addActionListener(this);??combobox=newJComboBox();? combobox.insertItemAt("全部人",0);??combobox。setSelectedIndex(0); ?messageShow=newJTextArea();? messageShow.setEditable(false);? //添加滾動(dòng)條??messageScrollPane=newJScrollPane(messageShow, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, ??JScrollPane。HORIZONTAL_SCROLLBAR_AS_NEEDED);??messageScrollPane.setPreferredSize(newDimension(400,400)); messageScrollPane.revalidate();??clientMessage=newJTextField(23);??clientMessage.setEnabled(false); ?clientMessageButton=newJButton();? clientMessageButton.setText("發(fā)送”);??//添加系統(tǒng)消息的大事偵聽(tīng) ?clientMessage.a(chǎn)ddActionListener(this);??clientMessageButton.a(chǎn)ddActionListener(this);??sendToL(fēng)abel=newJLabel("發(fā)送至:");? express=newJLabel("表情:");??messageLabel=newJLabel("發(fā)送消息:”); ?downPanel=newJPanel(); ?girdBag=newGridBagLayout(); ?downPanel。setLayout(girdBag);??girdBagCon=newGridBagConstraints(); ?girdBagCon.gridx=0; ?girdBagCon.gridy=0;? girdBagCon.gridwidth=5;??girdBagCon.gridheight=2;??girdBagCon.ipadx=5;??girdBagCon。ipady=5;??JLabelnone=newJLabel("”);??girdBag.setConstraints(none,girdBagCon);??downPanel.a(chǎn)dd(none);??girdBagCon=newGridBagConstraints(); ?girdBagCon.gridx=0;? girdBagCon。gridy=2;??girdBagCon.insets=newInsets(1,0,0,0);? //girdBagCon。ipadx=5;??//girdBagCon。ipady=5; ?girdBag。setConstraints(sendToLabel,girdBagCon);??downPanel。add(sendToLabel);? girdBagCon=newGridBagConstraints();? girdBagCon.gridx=1;??girdBagCon.gridy=2;??girdBagCon。anchor=GridBagConstraints.LINE_START;? girdBag.setConstraints(combobox,girdBagCon); downPanel.add(combobox);??girdBagCon=newGridBagConstraints();??girdBagCon.gridx=2; girdBagCon.gridy=2;? girdBagCon.a(chǎn)nchor=GridBagConstraints.LINE_END;??girdBag.setConstraints(express,girdBagCon);??downPanel.add(express);??girdBagCon=newGridBagConstraints(); ?girdBagCon.gridx=3;??girdBagCon。gridy=2;??girdBagCon.anchor=GridBagConstraints。LINE_START;? //girdBagCon.insets=newInsets(1,0,0,0);? //girdBagCon.ipadx=5;??//girdBagCon.ipady=5;??girdBag.setConstraints(actionlist,girdBagCon);??downPanel.a(chǎn)dd(actionlist);? girdBagCon=newGridBagConstraints();??girdBagCon。gridx=4;? girdBagCon。gridy=2;??girdBagCon.insets=newInsets(1,0,0,0);??//girdBagCon。ipadx=5;? //girdBagCon.ipady=5; ?girdBag。setConstraints(checkbox,girdBagCon);??downPanel.a(chǎn)dd(checkbox); ?girdBagCon=newGridBagConstraints(); ?girdBagCon.gridx=0;??girdBagCon.gridy=3;? girdBag.setConstraints(messageLabel,girdBagCon); ?downPanel。add(messageLabel);??girdBagCon=newGridBagConstraints(); ?girdBagCon.gridx=1;? girdBagCon。gridy=3;??girdBagCon.gridwidth=3;??girdBagCon.gridheight=1;??girdBag.setConstraints(clientMessage,girdBagCon);??downPanel.a(chǎn)dd(clientMessage); ?gi
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年貼牌生產(chǎn)與質(zhì)量協(xié)議3篇
- 外貿(mào)企業(yè)行政員工錄用協(xié)議
- 保險(xiǎn)公司平整施工合同
- 社區(qū)電動(dòng)車(chē)安全使用公約承諾書(shū)
- 電力搶修司機(jī)招聘協(xié)議書(shū)
- 電子產(chǎn)品招投標(biāo)操作流程
- 硝酸領(lǐng)用與研發(fā)創(chuàng)新
- 影視制作質(zhì)量管理典范
- 2024年裝潢資助協(xié)議書(shū)3篇
- 眼鏡租賃協(xié)議范本
- 華東師大版科學(xué)七年級(jí)上冊(cè)期末測(cè)試卷2
- 危機(jī)管理與應(yīng)急響應(yīng)
- 《安全生產(chǎn)法》宣傳周活動(dòng)宣貫課件
- 2024年度廢鋼再生資源買(mǎi)賣(mài)合同樣本3篇
- 2024年綜合實(shí)踐活動(dòng)課程實(shí)施計(jì)劃(4篇)
- 2024-2025學(xué)年北師版八年級(jí)物理上冊(cè)期末考試綜合測(cè)試卷
- 陸軍第七十五集團(tuán)軍醫(yī)院招聘筆試真題2023
- 【MOOC】國(guó)際商務(wù)-暨南大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 人教版八年級(jí)英語(yǔ)上冊(cè)期末專項(xiàng)復(fù)習(xí)-完形填空和閱讀理解(含答案)
- GB/T 44592-2024紅樹(shù)林生態(tài)保護(hù)修復(fù)技術(shù)規(guī)程
- 2024新版有限空間作業(yè)安全大培訓(xùn)
評(píng)論
0/150
提交評(píng)論