java聊天程序設(shè)計(jì)說明書_第1頁
java聊天程序設(shè)計(jì)說明書_第2頁
java聊天程序設(shè)計(jì)說明書_第3頁
java聊天程序設(shè)計(jì)說明書_第4頁
java聊天程序設(shè)計(jì)說明書_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

摘要聊天工具大多數(shù)由客戶端程序和效勞器程序外加效勞器端用于存放客戶數(shù)據(jù)的數(shù)據(jù)庫組成,本系統(tǒng)采用客戶機(jī)/效勞器架構(gòu)模式通過Java提供的Socket類來連接客戶機(jī)和效勞器并使客戶機(jī)和效勞器之間相互通信,由于聊天是多點(diǎn)對多點(diǎn)的而Java提供的多線程功能用多線程可完成多點(diǎn)對多點(diǎn)的聊天,數(shù)據(jù)庫管理系統(tǒng)用SQLServer2005完成并通過JDBC數(shù)據(jù)庫。本設(shè)計(jì)建立在JAVA平臺上,本設(shè)計(jì)使用了面向?qū)ο蠹夹g(shù)和面向?qū)ο蟮脑O(shè)計(jì)原那么。系統(tǒng)采用C/S結(jié)構(gòu),客戶端與客戶端以及客戶端與效勞器端之間通過Socket傳送消息。使用JAVA語言編寫,開發(fā)工具采用Eclipse。效勞器端設(shè)計(jì)與實(shí)現(xiàn)過程中,采用了多線程技術(shù),可以在單個程序當(dāng)中同時運(yùn)行多個不同的線程,執(zhí)行不同的任務(wù)。大大增強(qiáng)了程序?qū)π谄髻Y源的利用。聊天系統(tǒng)完成后將可進(jìn)行多人對多人的聊天,對好友進(jìn)行添加、刪除,對新用戶的注冊,發(fā)送消息、接受消息等等功能。關(guān)鍵字:C/S;效勞器;Eclipse;Socket;多線程序言在網(wǎng)絡(luò)越來越興旺的今天,人們對網(wǎng)絡(luò)的依賴越來越強(qiáng),網(wǎng)絡(luò)聊天已經(jīng)成了許多人生活中必不可少的一局部,基于這樣的需求,出現(xiàn)了許多網(wǎng)絡(luò)聊天通信工具,像QQ,MSN等等,但是人們已經(jīng)不再滿足于單一的兩個人之間的聊天,而是對多人同時聊天產(chǎn)生了興趣,于是出現(xiàn)了網(wǎng)絡(luò)聊天室,不同地方的人可以在那個虛擬的聊天室里面熱烈聊天?;谶@樣的想法,我們用JAVA設(shè)計(jì)一個多人同時聊天的小程序,用Socket編程實(shí)現(xiàn)網(wǎng)絡(luò)通訊,面向連接的,采用多線程的實(shí)現(xiàn)技術(shù)?;赟ocket的局域網(wǎng)通信軟件可以為企業(yè)原有的局域網(wǎng)提供一種良好,平安,快速的通信機(jī)制。它的實(shí)現(xiàn)無需對企業(yè)原有的局域網(wǎng)硬件進(jìn)行任何改動,具有實(shí)現(xiàn)本錢低廉的優(yōu)點(diǎn),它的使用能有效地降低局域網(wǎng)通信負(fù)荷,提高局域網(wǎng)的使用效率,可以很好地解決企業(yè)內(nèi)部局域網(wǎng)的各種通信需求?;赟ocket的局域網(wǎng)聊天工具是此類局域網(wǎng)通信軟件的具體實(shí)例之一,它很好地詮釋了Socket通信的原理,并且在企業(yè)內(nèi)部通信、教學(xué)、討論等應(yīng)用中都具有一定的實(shí)用價值。它具有信息收發(fā)速度快,保密性好,占用網(wǎng)絡(luò)帶寬資源低,占用效勞器吞吐能力低,易于編程實(shí)現(xiàn)等優(yōu)點(diǎn)?;赟ocket的局域網(wǎng)通信軟件應(yīng)用范圍廣闊,不但可以處理傳統(tǒng)的通信需求,而且也能擴(kuò)展以適應(yīng)新型的網(wǎng)絡(luò)應(yīng)用,如網(wǎng)絡(luò)教育,數(shù)據(jù)影音傳輸?shù)龋瑩碛袕V泛的應(yīng)用前景。目錄23001摘要I2356序言II15563第1章系統(tǒng)分析與設(shè)計(jì)1117501.1系統(tǒng)功能需求1100811.1.1效勞器端1172131.1.2客戶端1191241.2模塊設(shè)計(jì)21883第2章詳細(xì)設(shè)計(jì)4275652.1聊天室效勞器端設(shè)計(jì):4301022.1.1客戶端面板模塊4251332.1.2效勞器監(jiān)聽模塊5124482.1.3效勞器接收模塊6120502.1.4生成端口模塊8171632.1.5用戶鏈表的結(jié)點(diǎn)模塊10130952.1.6用戶鏈表模塊1143342.1.7幫助模塊1358142.2聊天室客戶端設(shè)計(jì):14275742.2.1客戶端界面模塊15119342.2.2客戶端接收模塊173532.2.3生成連接信息模塊18212682.2.4生成用戶模塊1928156第3章系統(tǒng)測試2072193.1測試方案20242503.2測試結(jié)果20324703.2.1聊天效勞器效果演示20148113.2.2聊天客戶端效果演示2132620第4章軟件使用說明書25124884.1性能描述2594034.2使用約束25179814.3根本實(shí)現(xiàn)過程2526227設(shè)計(jì)總結(jié)2714715參考文獻(xiàn)2828095致謝29第1章系統(tǒng)分析與設(shè)計(jì)隨著互聯(lián)網(wǎng)的開展,網(wǎng)上聊天已經(jīng)成為當(dāng)今的一種時尚,QQ,MSN等聊天工具為人們提供一個更為廣闊的交流平臺。本設(shè)計(jì)的聊天系統(tǒng)實(shí)現(xiàn)了網(wǎng)絡(luò)聊天室的登錄,注冊,聊天室的選擇等功能,并支持單人和多人聊天方式,同時也參加了管理員的角色,管理員對聊天室的用戶進(jìn)行管理,包括刪除用戶和趕出聊天室。1.1系統(tǒng)功能需求本系統(tǒng)主要通過客戶端,效勞器端來表達(dá)聊天系統(tǒng)的根本功能。1.1.1效勞器端1.處理用戶效勞2.處理用戶幫助3.處理用戶發(fā)送信息,效勞器監(jiān)控聊天內(nèi)容4.處理用戶得到信息5.處理用戶端口設(shè)置6.處理用戶啟動效勞7.處理用戶停止效勞5.處理用戶退出1.1.2客戶端1.用戶設(shè)置界面2.用戶操作界面及結(jié)果 3.用戶幫助界面及結(jié)果4.用戶連接設(shè)置界面及結(jié)果5.用戶登錄界面及結(jié)果6.用戶注銷界面及結(jié)果7.用戶退出界面及結(jié)果1.2模塊設(shè)計(jì)本聊天室分為聊天室效勞端和聊天室客戶端,效勞端與客戶端之間通過套接口Socket(TCP)連接。在java中使用套接口相當(dāng)簡單,JavaAPI為處理套接口的通信提供了一個類.Socket.,使得編寫網(wǎng)絡(luò)應(yīng)用程序相對容易.效勞器采用多線程以滿足多用戶的請求,通過JDBC與后臺數(shù)據(jù)庫連接,并通過創(chuàng)立一個ServerSocket對象來監(jiān)聽來自客戶的連接請求,默認(rèn)IP地址為:默認(rèn)端口為8888。聊天室效勞端模塊圖如圖1-1所示聊天室效勞端聊天室效勞端端口效勞啟動效勞發(fā)送系統(tǒng)消息停止效勞退出效勞器消息顯示圖1-1聊天室效勞端模塊圖端口效勞:輸入要偵聽的端口,默認(rèn)為8888;啟動效勞:啟動效勞器,并開始在設(shè)置的端口中偵聽,客戶端用戶可以登錄并開始聊天;停止效勞:關(guān)閉效勞器,偵聽結(jié)束??蛻舳擞脩舨荒茉倭奶欤话l(fā)送系統(tǒng)消息:效勞器端給所有人或者個別用戶發(fā)送消息。消息顯示:可以顯示所有用戶的聊天記錄,和上線、下線信息。退出效勞器:退出程序,并停止效勞;聊天室客戶端模塊圖如圖1-2所示聊天室客戶端連接設(shè)置聊天室客戶端連接設(shè)置用戶登錄退出發(fā)送接收聊天消息用戶注銷用戶設(shè)置圖1-2聊天室客戶端模塊圖用戶設(shè)置:用戶可以設(shè)置自己的用戶名進(jìn)行聊天;連接設(shè)置:用戶可以設(shè)置自己的效勞器的IP地址和端口號,默認(rèn)的連接地址為::8888;用戶登錄:只能在聊天室效勞端已開啟的情況下,用戶才能登錄,用戶登錄之后才能開始聊天,登錄后不能再修改用戶設(shè)置和連接設(shè)置;用戶注銷:退出聊天,可以繼續(xù)修改用戶設(shè)置和連接設(shè)置;發(fā)送和接收聊天信息:用戶可以給所有人或者個別用戶發(fā)送信息,并能看到其他用戶發(fā)送給自己或所有人的消息;退出:關(guān)閉所有聊天并退出客戶端。(3)流程圖聊天室效勞器端口聊天室效勞器端口效勞啟動效勞聊天室客戶端登錄連接設(shè)置聊天退出默認(rèn)連接地址或用戶名默認(rèn)端口:8888用戶設(shè)置用戶設(shè)置設(shè)置用戶名設(shè)置IP地址和端口詳細(xì)設(shè)計(jì)2.1聊天室效勞器端設(shè)計(jì):ActionListenerActionListenerChatServer-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)聊天室效勞端主要包括7個文件,它們的功能如下:2.1.1客戶端面板模塊ChatServer.java:包含名為ChatServer的public類,其主要功能為定義效勞器端的界面,添加事件偵聽與事件處理。調(diào)用ServerListen類來實(shí)現(xiàn)效勞端用戶上線與下線的偵聽,調(diào)用ServerReceive類來實(shí)現(xiàn)效勞器端的消息的收發(fā),核心代碼如下。publicclassChatServerextendsJFrameimplementsActionListener{publicstaticintport=8888;//效勞端的偵聽端口ServerSocketserverSocket;//效勞端SocketImageicon;//程序圖標(biāo)JComboBoxcombobox;//選擇發(fā)送消息的接受者JTextAreamessageShow;//效勞端的信息顯示JScrollPanemessageScrollPane;//信息顯示的滾動條JTextFieldshowStatus;//顯示用戶連接狀態(tài)JLabelsendToLabel,messageLabel;JTextFieldsysMessage;//效勞端消息的發(fā)送JButtonsysMessageButton;//效勞端消息的發(fā)送按鈕UserLinkListuserLinkList;//用戶鏈表//建立菜單欄JMenuBarjMenuBar=newJMenuBar();//建立菜單組JMenuserviceMenu=newJMenu("效勞(V)");//建立菜單項(xiàng)JMenuItemportItem=newJMenuItem("端口設(shè)置(P)");JMenuItemstartItem=newJMenuItem("啟動效勞(S)");JMenuItemstopItem=newJMenuItem("停止效勞(T)");JMenuItemexitItem=newJMenuItem("退出(X)");JMenuhelpMenu=newJMenu("幫助(H)");JMenuItemhelpItem=newJMenuItem("幫助(H)");//建立工具欄JToolBartoolBar=newJToolBar();//建立工具欄中的按鈕組件JButtonportSet;//啟動效勞端偵聽JButtonstartServer;//啟動效勞端偵聽JButtonstopServer;//關(guān)閉效勞端偵聽25JButtonexitButton;//退出按鈕//框架的大小DimensionfaceSize=newDimension(400,600);ServerListenlistenThread;JPaneldownPanel;GridBagLayoutgirdBag;GridBagConstraintsgirdBagCon;}2.1.2效勞器監(jiān)聽模塊ServerListen.java:該類實(shí)現(xiàn)效勞端用戶上線與下線的偵聽。該類對用戶上線下線的偵聽是通過調(diào)用用戶鏈表類〔UserLinkList〕來實(shí)現(xiàn)的,當(dāng)用戶上線與下線情況發(fā)生變化時,該類會對主類的界面進(jìn)行相應(yīng)的修改,核心代碼如下。publicServerListen(ServerSocketserver,JComboBoxcombobox,JTextAreatextarea,JTextFieldtextfield,UserLinkListuserLinkList){this.server=server;thisbobox=combobox;this.textarea=textarea;this.textfield=textfield;this.userLinkList=userLinkList;isStop=false;}publicvoidrun(){while(!isStop&&!server.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.addItem(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){}}}}2.1.3效勞器接收模塊〔3〕ServerReceive.java:該類是實(shí)現(xiàn)效勞器端的消息的收發(fā)的類。該類分別定義了向某用戶及所有人發(fā)送消息的方法,發(fā)送的消息會顯示在主界面類的界面上,核心代碼如下。publicclassServerReceiveextendsThread{JTextAreatextarea;JTextFieldtextfield;JComboBoxcombobox;Nodeclient;UserLinkListuserLinkList;//用戶鏈表publicbooleanisStop;publicServerReceive(JTextAreatextarea,JTextFieldtextfield,JComboBoxcombobox,Nodeclient,UserLinkListuserLinkList){this.textarea=textarea;this.textfield=textfield;this.client=client;this.userLinkList=userLinkList;thisbobox=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();Stringstatus=(String)client.input.readObject();Stringaction=(String)client.input.readObject();Stringmessage=(String)client.input.readObject();Stringmsg=client.username+""+action+"對"+toSomebody+"說:"+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);40}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.addItem("所有人");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;}}catch(Exceptione){//System.out.println(e);}}}2.1.4生成端口模塊PortConf.java:該類繼承自JDialog,是用戶對效勞器端偵聽端口進(jìn)行修改配置的類,核心代碼如下。publicclassPortConfextendsJDialog{JPanelpanelPort=newJPanel();JButtonsave=newJButton();JButtoncancel=newJButton();publicstaticJLabelDLGINFO=newJLabel("默認(rèn)端口號為:8888");JPanelpanelSave=newJPanel();JLabelmessage=newJLabel();publicstaticJTextFieldportNumber;publicPortConf(JFrameframe){super(frame,true);try{jbInit();}catch(Exceptione){e.printStackTrace();}//設(shè)置運(yùn)行位置,使對話框居中DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((int)(screenSize.width-400)/2+50,(int)(screenSize.height-600)/2+150);this.setResizable(false);}privatevoidjbInit()throwsException{this.setSize(newDimension(300,120));this.setTitle("端口設(shè)置");message.setText("請輸入偵聽的端口號:");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.add(cancel);panelSave.add(newLabel(""));ContainercontentPane=getContentPane();contentPane.setLayout(newBorderLayout());contentPane.add(panelPort,BorderLayout.NORTH);contentPane.add(DLGINFO,BorderLayout.CENTER);contentPane.add(panelSave,BorderLayout.SOUTH);//保存按鈕的事件處理save.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventa){intsavePort;try{savePort=Integer.parseInt(PortConf.portNumber.getText());if(savePort<1||savePort>65535){PortConf.DLGINFO.setText("偵聽端口必須是0-65535之間的整數(shù)!");PortConf.portNumber.setText("");return;}ChatServer.port=savePort;dispose();}catch(NumberFormatExceptione){PortConf.DLGINFO.setText("錯誤的端口號,端口號請?zhí)顚懻麛?shù)!");PortConf.portNumber.setText("");return;}}});//關(guān)閉對話框時的操作this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){DLGINFO.setText("默認(rèn)端口號為:8888");}});//取消按鈕的事件處理cancel.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){DLGINFO.setText("默認(rèn)端口號為:8888");dispose();}});}}2.1.5用戶鏈表的結(jié)點(diǎn)模塊Node.java:用戶鏈表的節(jié)點(diǎn)類,定義了鏈表中的用戶。該類與前面所講的鏈表節(jié)點(diǎn)Node類的功能相當(dāng),核心代碼如下。publicclassNode{Stringusername=null;Socketsocket=null;ObjectOutputStreamoutput=null;ObjectInputStreaminput=null;Nodenext=null;}2.1.6用戶鏈表模塊UserLinkList.java:用戶鏈表節(jié)點(diǎn)的具體實(shí)現(xiàn)類。該類通過構(gòu)造函數(shù)構(gòu)造用戶鏈表,定義了添加用戶,刪除用戶、返回用戶數(shù)、根據(jù)用戶名查找用戶、根據(jù)索引查找用戶這5個方法,核心代碼如下。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; }}2.1.7幫助模塊Help.java:效勞端程序的幫助類,核心代碼如下。publicclassHelpextendsJDialog{JPaneltitlePanel=newJPanel();JPanelcontentPanel=newJPanel();JPanelclosePanel=newJPanel();JButtonclose=newJButton();JLabeltitle=newJLabel("聊天室效勞端幫助");JTextAreahelp=newJTextArea();Colorbg=newColor(255,255,255);publicHelp(JFrameframe){super(frame,true);try{jbInit();}catch(Exceptione){e.printStackTrace();}//設(shè)置運(yùn)行位置,使對話框居中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è)置效勞端的偵聽端口〔默認(rèn)端口為8888〕。\n"+"2、點(diǎn)擊啟動效勞按鈕便可在指定的端口啟動效勞。\n"+"3、選擇需要接受消息的用戶,在消息欄中寫入消息,之后便可發(fā)送消息。\n"+"4、信息狀態(tài)欄中顯示效勞器當(dāng)前的啟動與停止?fàn)顟B(tài)、"+"用戶發(fā)送的消息和\n效勞器端發(fā)送的系統(tǒng)消息。");help.setEditable(false);titlePanel.add(newLabel(""));titlePanel.add(title);titlePanel.add(newLabel(""));contentPanel.add(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();}});}}2.2聊天室客戶端設(shè)計(jì):ActionListenerActionListenerChatClient-port:publicstaticin-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:UserLinkList-showStatus:JTextField+ChatClient():public+init():publicvoid+Connect():publicvoid+DisConnect():publicvoid+SendMessage():publicvoidJFrameThreadThreadClientReceiveClientReceive-socket:Socket-output:ObjectOutputStream-input:ObjectInputStream+ClientReceive(Socket,ObjectOutputStream,ObjectInputStream,JComboBox,JTextArea,JTextField)聊天室客戶端主要包括5個文件,它們的功能如下:2.2.1客戶端界面模塊ChatClient.java:包含名為ChatClient的public類,其主要功能為定義客戶端的界面,添加事件偵聽與事件處理。該類定義了Connect()與DisConnect()方法實(shí)現(xiàn)與效勞器的連接與斷開連接。當(dāng)?shù)卿浀街付ǖ男谄鲿r,調(diào)用ClientReceive類實(shí)現(xiàn)消息收發(fā),同時該類還定義了SendMessage()方法來向其他用戶發(fā)送帶有表情的消息或者悄悄話,核心代碼如下。publicclassChatClientextendsJFrameimplementsActionListener{Stringip="";//連接到效勞端的ip地址intport=8888;//連接到效勞端的端口號StringuserName="匆匆過客";//用戶名inttype=0;//0表示未連接,1表示已連接//Imageicon;//程序圖標(biāo)JComboBoxcombobox;//選擇發(fā)送消息的接受者JTextAreamessageShow;//客戶端的信息顯示JScrollPanemessageScrollPane;//信息顯示的滾動條JLabelexpress,sendToLabel,messageLabel;JTextFieldclientMessage;//客戶端消息的發(fā)送JCheckBoxcheckbox;//悄悄話JComboBoxactionlist;//表情選擇JButtonclientMessageButton;//發(fā)送消息JTextFieldshowStatus;//顯示用戶連接狀態(tài)Socketsocket;ObjectOutputStreamoutput;//網(wǎng)絡(luò)套接字輸出流ObjectInputStreaminput;//網(wǎng)絡(luò)套接字輸入流ClientReceiverecvThread;//建立菜單欄JMenuBarjMenuBar=newJMenuBar();//建立菜單組45JMenuoperateMenu=newJMenu("操作(O)");//建立菜單項(xiàng)JMenuItemloginItem=newJMenuItem("用戶登錄(I)");JMenuItemlogoffItem=newJMenuItem("用戶注銷(L)");JMenuItemexitItem=newJMenuItem("退出(X)");JMenuconMenu=newJMenu("設(shè)置(C)");JMenuItemuserItem=newJMenuItem("用戶設(shè)置(U)");JMenuItemconnectItem=newJMenuItem("連接設(shè)置(C)");JMenuhelpMenu=newJMenu("幫助(H)");JMenuItemhelpItem=newJMenuItem("幫助(H)");//建立工具欄JToolBartoolBar=newJToolBar();//建立工具欄中的按鈕組件JButtonloginButton;//用戶登錄JButtonlogoffButton;//用戶注銷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);//設(shè)置運(yùn)行時窗口的位置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)題//程序圖標(biāo)//icon=getImage("icon.gif");//this.setIconImage(icon);//設(shè)置程序圖標(biāo)show();//為操作菜單欄設(shè)置熱鍵'V'operateMenu.setMnemonic('O');//為用戶登錄設(shè)置快捷鍵為ctrl+iloginItem.setMnemonic('I');loginItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I,InputEvent.CTRL_MASK));//為用戶注銷快捷鍵為ctrl+llogoffItem.setMnemonic('L');logoffItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L,InputEvent.CTRL_MASK));//為退出快捷鍵為ctrl+xexitItem.setMnemonic('X');exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));//為設(shè)置菜單欄設(shè)置熱鍵'C'conMenu.setMnemonic('C');//為用戶設(shè)置設(shè)置快捷鍵為ctrl+uuserItem.setMnemonic('U');userItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U,InputEvent.CTRL_MASK));//為連接設(shè)置設(shè)置快捷鍵為ctrl+cconnectItem.setMnemonic('C');connectItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));//為幫助菜單欄設(shè)置熱鍵'H'helpMenu.setMnemonic('H');//為幫助設(shè)置快捷鍵為ctrl+phelpItem.setMnemonic('H');helpItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,InputEvent.CTRL_MASK));}}2.2.2客戶端接收模塊ClientReceive.java:該類是實(shí)現(xiàn)效勞器端與客戶端消息收發(fā)的類。核心代碼如下。publicclassClientReceiveextendsThread{privateJComboBoxcombobox;privateJTextAreatextarea;Socketsocket;ObjectOutputStreamoutput;ObjectInputStreaminput;JTextFieldshowStatus;publicClientReceive(Socketsocket,ObjectOutputStreamoutput,ObjectInputStreaminput,JComboBoxcombobox,JTextAreatextarea,JTextFieldshowStatus){this.socket=socket;this.output=output;this.input=input;thisbobox=combobox;this.textarea=textarea;this.showStatus=showStatus;}publicvoidrun(){while(!socket.isClosed()){try{Stringtype=(String)input.readObject();if(type.equalsIgnoreCase("系統(tǒng)信息")){Stringsysmsg=(String)input.readObject();textarea.append("系統(tǒng)信息:"+sysmsg);}elseif(type.equalsIgnoreCase("效勞關(guān)閉")){output.close();input.close();socket.close();textarea.append("效勞器已關(guān)閉!\n");break;}elseif(type.equalsIgnoreCase("聊天信息")){Stringmessage=(String)input.readObject();textarea.append(message);}elseif(type.equalsIgnoreCase("用戶列表")){Stringuserlist=(String)input.readObject();Stringusernames[]=userlist.split("\n");combobox.removeAllItems();inti=0;combobox.addItem("所有人");while(i<usernames.length){combobox.addItem(usernames[i]);i++;}combobox.setSelectedIndex(0);showStatus.setText("在線用戶"+usernames.length+"人");}}catch(Exceptione){System.out.println(e);}}}}2.2.3生成連接信息模塊ConnectConf.java:該類繼承自JDialog,是用戶對所要連接的效勞器IP及偵聽端口進(jìn)行修改配置的類,核心代碼如下。publicConnectConf(JFrameframe,Stringip,intport){super(frame,true);this.userInputIp=ip;this.userInputPort=port;try{jbInit();}catch(Exceptione){e.printStackTrace();}//設(shè)置運(yùn)行位置,使對話框居中DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();this.setLocation((int)(screenSize.width-400)/2+50,(int)(screenSize.height-600)/2+150);this.setResizable(false);}2.2.4生成用戶模塊UserConf.java:該類繼承自JDialog,是用戶對連接到效勞器所顯示的用戶名進(jìn)行修改配置的類。2.2.5幫助模塊Help.java:客戶端程序的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論