JAVA聊天工具設計報告_第1頁
JAVA聊天工具設計報告_第2頁
JAVA聊天工具設計報告_第3頁
JAVA聊天工具設計報告_第4頁
JAVA聊天工具設計報告_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

嘉興學院Java綜合實訓報告PAGEPAGE23目錄TOC\o"1-3"\p""\h\z\u1. 需求分析………………………12. 概要設計……………………….22.1功能圖…………………..……..23. 詳細設計………………………23.1 類關系圖………………………23.2 類設計圖………………………33.2.1、類client…………………33.2.2、類RTFSend…………………43.2.3、類RTFReceive……………43.2.4、類Server…………………53.2.5、類YeeKuMap………………53.2.6、類ServerThread…………63.2.8、類ClinetThread…………64. 主要程序實現(xiàn)………………….75. 測試與結果………………….165.1功能模塊界面.……………….166. 心得體會…………………….22參考文獻…………..23聊天小程序需求分析聊天工具大多數(shù)由客戶端程序和服務器程序外加服務器端,本程序采用客服機/服務器架構模式。通過Java提供的Socket類來連接客戶機和服務器并使客戶機與服務器之間相互通信。由于聊天是多點對多點的而Java提供的多線程功能,用多線程可完成多點對多點的聊天。主要有兩個應用程序,分別為服務器程序和客戶端程序。服務器應用程序主要用于消息轉發(fā),以及向所有用戶發(fā)送系統(tǒng)消息等;客戶端應用程序主要用于客戶聊天記錄的顯示和信息輸入。采用Client/Server(C/S)體系結構,即客戶機/服務器體系結構。聊天服務器專門用于監(jiān)控用戶狀態(tài)和轉發(fā)消息,客戶端負責接收消息的用戶序列和消息文本發(fā)送到服務器。該聊天系統(tǒng)實現(xiàn)私聊,群聊,用戶登陸,退出聊天系統(tǒng)等功能。本系統(tǒng)的主要功能有以下幾個部分組成:服務器端模塊:系統(tǒng)信息的輸入:可以輸入任何信息;功能:將系統(tǒng)信息廣播至各個客戶端;踢除用戶:服務器可以選擇性刪除在線的用戶;客戶端模塊:登陸服務器列出當前在線用戶信息;私聊和多人聊天的選擇;發(fā)言:對輸入的數(shù)據(jù)進行發(fā)送;離開狀態(tài);概要設計2.1功能圖圖1.程序功能圖詳細設計類關系圖圖2:類關系圖類設計圖3.2.1、類client模塊名稱Client功能描述啟動客戶端系統(tǒng)接口與屬性SERNER:intJfcPeoplrlistPskeyIn:stringFrame():voiduserName:stringFunction:啟動客戶端InPut:無OutPut:無Return:空publicClient()windowClosing(WindowEvente)mouseClicked(MouseEvente)InPut:OutPut:Return:voidcloseSocket()Function:退出時,關閉Socket3.2.2、類RTFSend模塊名稱RTFSend功能描述信息發(fā)送接口與屬性BinBoutSocketSocketRun():void3.2.3、類RTFReceive模塊名稱RTFReceive功能描述信息接收接口與屬性voidrun()Function:運行多線程InPut:無OutPut:無Return:空3.2.4、類Server模塊名稱server功能描述啟動服務器端接口與屬性voidmain(Stringargs[])Function:啟動服務器端InPut:無OutPut:無Return:空server()Function:InPut:無OutPut:無Return:空voidcloseSocket()Function:設置關閉socketInPut:無OutPut:無Return:空voidgonggao(inta,Strings)Function:InPut:無OutPut:無Return:空Stringchakan(Stringname)Return:name/nullvoiddel(Stringtmp)Return:空3.2.5、類YeeKuMap模塊名稱YeeKuMap功能描述按鈕事件的處理接口與屬性Put():voidgetkeyByVALLEactionPerformed(ActionEvente)Function:InPut:OutPut:Return:3.2.6、類ServerThread模塊名稱ServerThread功能描述負責所有客戶的接待接口與屬性BrPSSSvoidrun()Function:運行該線程InPut:無OutPut:無Return:空3.2.7、類ClinetThread模塊名稱ClinetThread功能描述處理每一個連接上的客戶接口與屬性ClinetThread(Socketsc)BrgetRESTmeg()viodInPut:無OutPut:無Return:空StringgetLogName()InPut:無OutPut:無Return:空voidrun()Function:運行該線程InPut:無OutPut:無Return:空主要程序實現(xiàn)客戶端:importjava.io.*;.*;importjava.awt.*;importjava.awt.List;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.*;importjava.util.*;publicclassClientextendsJFrameimplementsActionListener{ privatestaticfinalintSERVER_PORT=30000; privateSocketsocket; privatePrintStreamps; privateBufferedReaderbrServer; privateJFileChooserjfc; privateStringkeyIn; publicstaticDefaultListModellistModel=newDefaultListModel();//ListModel對象 privatestaticJListpeopleList;Buttonbutton1=newButton("發(fā)送"); staticButtonbutton2=newButton("私聊"); staticButtonbutton3=newButton("發(fā)送文件"); staticJCheckBoxjcb=newJCheckBox("私聊"); StringuserName=null; //JButtonsendflie=null; staticTextAreatxtA1=newTextArea(); //staticListlist1=null; staticTextAreatxtA2=newTextArea(); //JTextAreatxtA2=null; publicvoidFrame(){ JFrameframe=newJFrame("客戶端:聊天窗口"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Containerpane=frame.getContentPane(); pane.setLayout(null); frame.setLocation(320,240); frame.setSize(500,500); frame.setVisible(true); //TextAreatxtA1=newTextArea(); Client.txtA1.setBounds(10,10,370,300); //TextAreaClient.txtA2=newTextArea(); Client.txtA2.setBounds(10,340,370,80); /*Listlist2=newList(); list2.setBounds(400,10,90,300);*/ peopleList=newJList(listModel); peopleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//設置單選 JScrollPaneListScrollPane=newJScrollPane(peopleList); Client.peopleList.setBounds(400,10,90,300); //Listlist3=newList(); //list3.setBounds(400,340,90,120); //Buttonbutton3=newButton("發(fā)送文件"); button3.setBounds(405,350,50,20); button3.addActionListener(this); //Buttonbutton1=newButton("發(fā)送"); jcb.setBounds(160,430,80,40); // button1.setBounds(240,440,30,20); button1.addActionListener(this); //Buttonbutton2=newButton("私聊"); button2.setBounds(300,440,30,20); button2.addActionListener(this); pane.add(txtA1); pane.add(txtA2); pane.add(peopleList); //pane.add(list1); //pane.add(list2); //pane.add(list3); pane.add(jcb); pane.add(button1); pane.add(button2); pane.add(button3); } /*publicstaticvoidmain(String[]args){ Frameframe1=newFrame();// //Frameframe2=newFrame(); frame1.gost();*/ /*setVisible(true); setBounds(400,100,600,500); Containercon=getContentPane(); con.setVisible(true); con.setLayout(newFlowLayout()); txtA1=newJTextArea(15,45); listModel=newDefaultListModel(); peopleList=newJList(listModel); peopleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//設置單選 JScrollPaneListScrollPane=newJScrollPane(peopleList); txtA2=newJTextArea(5,45); yesBt=newJButton("確定發(fā)送"); yesBt.addActionListener(this); cancelBt=newJButton("發(fā)送文件"); cancelBt.addActionListener(this); //fr.add(btnSend); //fr.setSize(200,200); //fr.setVisible(true); //為發(fā)送按鈕注冊事件 cancelBt.addActionListener(this); add(newJLabel("客戶端:")); con.add(newJLabel("聊天內(nèi)容:")); con.add(txtA1); add(ListScrollPane,BorderLayout.EAST); con.add(txtA2); con.add(cancelBt); con.add(yesBt); //this.addWindowListener(this); validate(); con.validate(); //server=SocketSever();*/ publicvoidinit(Clientclient){ try { //初始化代表鍵盤的輸入流 //keyIn=this.txtA2.getText(); //keyIn=newBufferedReader(newInputStreamReader(System.in)); //連接到服務器 socket=newSocket("",SERVER_PORT); //獲取該Socket對應的輸入流和輸出流 ps=newPrintStream(socket.getOutputStream()); brServer=newBufferedReader(newInputStreamReader(socket.getInputStream())); Stringtip=""; //采用循環(huán)不斷地彈出對話框要求輸入用戶名 while(true){ client.userName=JOptionPane.showInputDialog(tip+"輸入用戶名"); //將用戶輸入的用戶名的前后增加協(xié)議字符串后發(fā)送 ps.println(YeekuProtocol.USER_ROUND+userName+YeekuProtocol.USER_ROUND); //讀取服務器的響應 Stringresult=brServer.readLine(); //如果用戶重復,開始下次循環(huán) /*if(result.equals(userName)){ Client.listModel.addElement(userName); }*/ if(result.equals(YeekuProtocol.NAME_REP)){ tip="用戶名重復!請重新"; continue; } //如果服務器返回登錄成功,結束循環(huán) if(result.equals(YeekuProtocol.LOGIN_SUCCESS)){ client.Frame(); //Client.listModel.addElement(userName); break; } } } //捕捉到異常,關閉網(wǎng)絡資源,并退出該程序 catch(UnknownHostExceptionex){ System.out.println("找不到遠程服務器,請確定服務器已經(jīng)啟動!"); closeRs(); System.exit(1); }catch(IOExceptionex){ System.out.println("網(wǎng)絡異常!請重新登錄!"); closeRs(); System.exit(1); } //以該Socket對應的輸入流啟動ClientThread線程 newClientThread(brServer).start(); } //定義一個讀取鍵盤輸出,并向網(wǎng)絡發(fā)送的方法 /*privatevoidreadAndSend(StringkeyIn){ //try{ //不斷讀取鍵盤輸入 Stringline=null; while((line=keyIn)!=null) { //如果發(fā)送的信息中有冒號,且以//開頭,則認為想發(fā)送私聊信息 if(line.indexOf(":")>0&&line.startsWith("http://")){ line=line.substring(2); ps.println(YeekuProtocol.PRIVATE_ROUND+ line.split(":")[0]+ YeekuProtocol.SPLIT_SIGN+ line.split(":")[1]+ YeekuProtocol.PRIVATE_ROUND); }elseif(line.equals("byebye")){ System.out.println("aaaaaaaaaaaaabbbbbbbbbbbbbbbb"+ps); Stringkey=(String)Server.clients.getKeyByValue(ps); System.out.println("aaaaaaaaaaaaa"+key); ps.println(YeekuProtocol.LOGIN_OUT+key+YeekuProtocol.LOGIN_OUT); }else{ ps.println(YeekuProtocol.MSG_ROUND+line+YeekuProtocol.MSG_ROUND); } } //} //捕捉到異常,關閉網(wǎng)絡資源,并退出該程序 //catch(IOExceptionex){ System.out.println("網(wǎng)絡通信異常!請重新登錄!"); closeRs(); System.exit(1); } //}*/ @Override publicvoidactionPerformed(ActionEvente){ //TODOAuto-generatedmethodstub if(e.getSource()==button1){ Stringline=Client.txtA2.getText(); while(line!=null) { //Stringusername=null; Stringname=null; //如果發(fā)送的信息中有冒號,且以//開頭,則認為想發(fā)送私聊信息 if(jcb.isSelected()&&Client.peopleList.getSelectedValue()!=null){ name=(String)Client.peopleList.getSelectedValue(); //line=line.substring(2); //Stringsiliao=YeekuProtocol.PRIVATE_ROUND+ //userName+YeekuProtocol.SPLIT_SIGN+name+ //YeekuProtocol.SPLIT_SIGN+ //line+YeekuProtocol.PRIVATE_ROUND; //System.out.println(siliao+"這是客戶端發(fā)送的"); //ps.println(siliao); Client.txtA2.setText(null); /*if(line.indexOf(":")>0&&line.startsWith("http://")){ line=line.substring(2); ps.println(YeekuProtocol.PRIVATE_ROUND+ line.split(":")[0]+ YeekuProtocol.SPLIT_SIGN+ line.split(":")[1]+ YeekuProtocol.PRIVATE_ROUND);*/ }elseif(line.equals("byebye")){ System.out.println("aaaaaaaaaaaaabbbbbbbbbbbbbbbb"+ps); Stringkey=(String)Server.clients.getKeyByValue(ps); System.out.println("aaaaaaaaaaaaa"+key); ps.println(YeekuProtocol.LOGIN_OUT+key+YeekuProtocol.LOGIN_OUT); }else{ ps.println(YeekuProtocol.MSG_ROUND+line+YeekuProtocol.MSG_ROUND); //((TextComponent)Client.txtA2).setText(""); Client.txtA2.setText(null); break; } } } if(e.getSource()==Client.button3){ jfc.showOpenDialog(newFrame()); //啟動新的線程傳遞文件 RTFSendsend=newRTFSend(jfc.getSelectedFile()); send.start(); } } //關閉Socket、輸入流、輸出流的方法 privatevoidcloseRs(){ //try{ if(keyIn!=null) { ps.close(); } if(brServer!=null) { ps.close(); } if(ps!=null) { ps.close(); } /*if(socket!=null) { //keyIn.close(); } }catch(IOExceptionex) { ex.printStackTrace(); }*/ } /*publicvoidactionPerformed1(ActionEvente){ //彈出文件選擇對話框 if(e.getSource()==Client.button3){ jfc.showOpenDialog(newFrame()); //啟動新的線程傳遞文件 RTFSendsend=newRTFSend(jfc.getSelectedFile()); send.start(); }}*/ publicstaticvoidmain(String[]args){ Clientclient=newClient(); //client.Frame(); client.init(client); }}服務器端:.*;importjava.io.*;importjava.awt.*;importjavax.swing.*;importjava.awt.event.*;publicclassServerextendsJFrame{ privatestaticfinalintSERVER_PORT=30000; publicstaticDefaultListModellistModel;//ListModel對象 privateJListpeopleList; privateJButtonkick; privateServerSocketss; //使用MyMap對象來保存每個客戶名字和對應輸出流之間的對應關系。 publicstaticYeekuMap<String,PrintStream>clients=newYeekuMap<String,PrintStream>(); publicServer(){ super("服務器"); setLayout(newBorderLayout()); listModel=newDefaultListModel(); peopleList=newJList(listModel); peopleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//設置單選 JScrollPaneListScrollPane=newJScrollPane(peopleList); add(ListScrollPane,BorderLayout.CENTER); kick=newJButton("踢人"); kick.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ //TODOAuto-generatedmethodstub if(e.getSource()==kick){ StringuserName=(String)peopleList.getSelectedValue();//從列表里得到用戶選擇的項 PrintStreamps=Server.clients.get(userName); ps.println(Server.clients.getKeyByValue(ps)+"您已經(jīng)被迫下線,請重新登錄");//1.告知本人被迫下線 ps.flush(); ps.close();//2.關閉流 Server.clients.removeByValue(ps); for(PrintStreamclientPs:Server.clients.valueSet()){ clientPs.println("用戶"+userName+"已經(jīng)下線。"); }//3.通知其他人這個用戶已經(jīng)下線 listModel.removeElement(userName);//4.從列表中移除 for(PrintStreamclientPs:Server.clients.valueSet()){ clientPs.println(YeekuProtocol.USER_REMOVE+userName+YeekuProtocol.USER_REMOVE); } } } }); //dataList.getSelectedValue(); add(kick,BorderLayout.SOUTH); setLocation(300,100); setSize(150,450); setResizable(false);//設置不能最大化 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true);//設置可不可見} publicvoidinit(){ try{ //建立監(jiān)聽的ServerSocket ss=newServerSocket(SERVER_PORT); //采用死循環(huán)來不斷接受來自客戶端的請求 while(true){ Socketsocket=ss.accept(); newServerThread(socket).start(); } } //如果拋出異常 catch(IOExceptionex){ System.out.println("服務器啟動失敗,是否端口"+SERVER_PORT+"已被占用?"); } //使用finally塊來關閉資源 finally{ try{ if(ss!=null){ ss.close(); } }catch(IOExceptionex){ ex.printStackTrace(); } System.exit(1); } } publicstaticvoidmain(String[]args){ Serverserver=newServer(); server.init(); }}測試與結果5.1功能模塊界面服務器端界面:圖3.服務器端界面登陸界面:圖4.登陸界面客戶端界面:圖5.輸入用戶名圖6.登陸客戶端登陸后的服務器:圖7.用戶登陸后的服務器第2個客戶端登陸:圖8.第2個用戶登陸圖9.可在客戶端顯示在線用戶踢除用戶:圖10.服務器端點擊踢人圖11.客戶端顯示被迫下線發(fā)送聊天:圖12.在客戶端輸入字符點擊發(fā)送圖13.在接收用戶客戶端顯示出發(fā)送的字符圖14.在發(fā)送用戶客戶端顯示發(fā)送的字符心得體會經(jīng)過一個學期的JAVA課程學習了解了JAVA的基礎理論知識,通過這次程序設計,進一步鞏固、加深了我們所學專業(yè)課程的基本理論知識,理論聯(lián)系實際,進一步培養(yǎng)了綜合分析問題,解決問題的能力,進一步加強了JAVA的實際應用能力。通過本次Java語言課程設計,我對面向對象的程序設計有了更深程度的掌握,它將重點放在對象與對象的接口上。在通過對題目進行需求分析,考慮一些編程中可能遇到的問題。其次開始界面設計、類的設計、類功能的連接等等實現(xiàn)。在遇到問題解決問題的過程中不斷完善功能。這次Java課程設計不僅考查了對Java語言基本理論知識的學習程度還考核了我們綜合運用以及學習新知識的能力。在以后的學習道路上必須多加強自己的實際業(yè)務能力,才能適應社會對應用型人才實際工作能力的需求。參考文獻 [1]夏寬理.Java語言程序設計1.機械工業(yè)出版社,2021年4月.[2]丁寶康.數(shù)據(jù)庫系統(tǒng)原理.經(jīng)濟科學出版社,2021年.[3]王建華,董志敏譯,JAVA核心技術卷2:高級特性,北京:機械工業(yè)出版社,2021[4]李建峰譯,java2圖形設計卷二:swing.北京:機械工業(yè)出版社,2021[5]姬猛洛,李軍譯,即時消息傳遞系統(tǒng)編程源代碼解析.北京:電子工業(yè)出版社,2021

論大學生寫作能力寫作能力是對自己所積累的信息進行選擇、提取、加工、改造并將之形成為書面文字的能力。積累是寫作的基礎,積累越厚實,寫作就越有基礎,文章就能根深葉茂開奇葩。沒有積累,胸無點墨,怎么也不會寫出作文來的。寫作能力是每個大學生必須具備的能力。從目前高校整體情況上看,大學生的寫作能力較為欠缺。一、大學生應用文寫作能力的定義那么,大學生的寫作能力究竟是指什么呢?葉圣陶先生曾經(jīng)說過,“大學畢業(yè)生不一定能寫小說詩歌,但是一定要寫工作和生活中實用的文章,而且非寫得既通順又扎實不可?!睂τ诖髮W生的寫作能力應包含什么,可能有多種理解,但從葉圣陶先生的談話中,我認為:大學生寫作能力應包括應用寫作能力和文學寫作能力,而前者是必須的,后者是“不一定”要具備,能具備則更好。眾所周知,對于大學生來說,是要寫畢業(yè)論文的,我認為寫作論文的能力可以包含在應用寫作能力之中。大學生寫作能力的體現(xiàn),也往往是在撰寫畢業(yè)論文中集中體現(xiàn)出來的。本科畢業(yè)論文無論是對于學生個人還是對于院系和學校來說,都是十分重要的。如何提高本科畢業(yè)論文的質(zhì)量和水平,就成為教育行政部門和高校都很重視的一個重要課題。如何提高大學生的寫作能力的問題必須得到社會的廣泛關注,并且提出對策去實施解決。二、造成大學生應用文寫作困境的原因:(一)大學寫作課開設結構不合理。就目前中國多數(shù)高校的學科設置來看,除了中文專業(yè)會系統(tǒng)開設寫作的系列課程外,其他專業(yè)的學生都只開設了普及性的《大學語文》課。學生寫作能力的提高是一項艱巨復雜的任務,而我們的課程設置僅把這一任務交給了大學語文教師,可大學語文教師既要在有限課時時間內(nèi)普及相關經(jīng)典名著知識,又要適度提高學生的鑒賞能力,且要教會學生寫作規(guī)

溫馨提示

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

評論

0/150

提交評論