java課程設計報告-聊天小程序_第1頁
java課程設計報告-聊天小程序_第2頁
java課程設計報告-聊天小程序_第3頁
java課程設計報告-聊天小程序_第4頁
java課程設計報告-聊天小程序_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

課程設計說明書課程名稱: Java程序設計專 業(yè): 班級:設計人:2015年1月14 日課程設計任務書一、課程設計題目:聊天小程序二、設計原始資料:1、雍俊海,《Java程序設計教程》,清華大學出版社,2007;2、耿祥義,張躍平,《Java2實用教程》,清華大學出版社;3、張躍平,耿祥義,《Java2實驗指導》,清華大學出版社;三、設計應解決下列各主要問題:1 、用圖形用戶界面;(使用 socket 通信)、能實現(xiàn)一個聊天室中的多人聊天;3、可以實現(xiàn)兩個私聊;四、設計說明書應附有下列圖紙: 運行結果截圖五、小組分工說明:六、命題發(fā)出日期: 2014.12.29 設計完成日期: 2015.1.14指導教師評語成績:指導教師(簽章):年 月 日山東科技大學學生課程設計目錄1需求分析說明,,,,,,,,,,,,,,,,,,,,,,11.1背景,,,,,,,,,,,,,,,,,,,,,,11.2功能要求,,,,,,,,,,,,,,,,,,,,,,,11.3運行環(huán)境,,,,,,,,,,,,,,,,,,,,,,,11.4功能實現(xiàn),,,,,,,,,,,,,,,,,,,,,,12概要設計說明,,,,,,,,,,,,,,,,,,,,,,22.1模塊調用圖,,,,,,,,,,,,,,,,,,,,,,,22.2套接字連接示意圖,,,,,,,,,,,,,,,,,,,,22.3主要函數(shù)聲明,,,,,,,,,,,,,,,,,,,,,,23詳細設計說明,,,,,,,,,,,,,,,,,,,,,,43.1功能描述,,,,,,,,,,,,,,,,,,,,,43.2主要功能詳述,,,,,,,,,,,,,,,,,,,,,43.3主要代碼分析,,,,,,,,,,,,,,,,,,,,,,54調試分析,,,,,,,,,,,,,,,,,,,,,,94.1遇到的問題,,,,,,,,,,,,,,,,,,,,94.2測試結果分析,,,,,,,,,,,,,,,,,,,,,,105用戶使用說明,,,,,,,,,,,,,,,,,,,,,106課程設計總結,,,,,,,,,,,,,,,,,,,,,127附錄,,,,,,,,,,,,,,,,,,,,,,13山東科技大學學生課程設計需求分析說明1.1 背景在當今的信息時代,越來越多的聊天工具被應用, Java語言是當今流行的網(wǎng)絡編程語言,它具有面向對象、與平臺無關、安全、多線程等特點。此課程設計的題目是聊天小程序,鞏固所學的Java語言基本知識,增進Java語言編輯基本功,拓寬常用類庫的應用。使我們把所學課程及相關知識加以融會貫通, 全面掌握Java語言的編程思想及面向對象程序設計的方法。1.2 功能要求1、使用圖形用戶界面。2、能實現(xiàn)一個聊天室中多人聊天。3、可以兩人私聊。1.3 運行環(huán)境本程序基于Java和Eclipse 開發(fā)環(huán)境,可以在一般的裝有 Windows系統(tǒng)的主機上運行。1.4 功能實現(xiàn)程序實現(xiàn)了聊天室的基本功能,其中有:1、啟動服務器。2、進入客戶端界面。3、登錄聊天室。4、發(fā)送信息。5、關閉服務器。6、輸入昵稱。7、發(fā)送消息并收到其他客戶的消息。1山東科技大學學生課程設計概要設計說明2.1 模塊調用圖2.2 套接字連接示意圖2.3 主要函數(shù)聲明1、Socket的構造方法如下:Socket(Stringhost,intport)參數(shù)host是服務器的IP地址,port是一個端口號。2、ServerSocket的構造方法如下:ServerSocket(intport)2山東科技大學學生課程設計port 是一個端口號。port必須和客戶呼叫的端口號相同3、當建立時可能發(fā)生 IOException 異常,因此應像下面那樣建立到服務器的套接字連接:Try{Socketmyscoket=newSocket( “8 ”,1880);}Catch(IOExceptione){}4、當建立服務器時可能發(fā)生 IOException 異常,因此,應像下面那樣建立接收客戶的服務器套接字:Try{ServerSocketserver_scoket=newServerSocket(1880);}Catch(IOExceptione){}比如1880端口已被占用時,就會發(fā)生 IOException異常。5、當服務器的ServerScoket對象server_socket 建立后,就可以使用accept()方法接收客戶的套接字連接呼叫,代碼如下:Server_socket.accept();6、客戶使用Socket類不帶參數(shù)的構造方法 Socket()創(chuàng)建一個套接字對象,該對象需調用Publicvoidconnect(SocketAddressendpoint)throwsIOException請求和參數(shù)SocketAddress指定地址的套接字建立連接,為了使用connect方法,可以使用SocketAddress的子類InetSocketAddress建立一個對象,InetSocketAddress的構造方法如下:PublicInetSocketAddress(InetAddressaddr,intport)3山東科技大學學生課程設計詳細設計說明3.1 功能描述聊天程序分為服務器端和客戶端兩部分, 服務端程序主要負責偵聽客戶端發(fā)來的消息,客戶端需要登陸到服務器端才可以實現(xiàn)正常的聊天功能。服務器:1、在特定端口上進行偵聽,等待客戶端連接。2、向已經(jīng)連接到服務器端的 用戶發(fā)送系統(tǒng)消息。3、當停止服務時,斷開所有的用戶連接。4、系統(tǒng)運行穩(wěn)定、安全可靠??蛻舳耍?、連接到已經(jīng)開啟聊天服務的服務器端。2、當服務器端開啟后,用戶可以發(fā)表聊天信息。3、用戶可以向所有人發(fā)送消息。4、系統(tǒng)運行穩(wěn)定、安全可靠。3.2 主要功能詳述3.2.1 客戶建立連接到服務器的套接字對象1、當套接字連接mysocket建立后,可以想象一條通信“線路”已經(jīng)建立起來。mysocket可以使用getInputStream() 方法獲得一個輸入流,然后用這個輸入流讀取服務器放入“線路”的信息。mysocket還可以使用getOutputStream() 方法獲得一個輸出流,然后用這個輸出流將信息寫入“線路”。2、在實際編寫程序時,把 mysocket使用getInputStream() 方法獲得的輸入流接到另一個數(shù)據(jù)流上,然后就可以從這個數(shù)據(jù)流讀取服務器來的信息, 之所以這樣是因為后面DataInputStream 流有更好的從流中讀取信息的方法。3、同樣把 mysocket使用 getOutputStream() 方法得到的輸出流接到另一個DataOutputStream 數(shù)據(jù)流上,然后向這個數(shù)據(jù)流寫入信息,發(fā)送給服務器端,之所以這樣做也是因為后面的 DataOutputStream流有更好的向流中寫入信息的方法。4山東科技大學學生課程設計3.2.2ServerSocket 類1、客戶負責建立客戶到服務器的套接字連接,即客戶負責呼叫。因此服務器必須建立一個等待接收客戶的套接字的 ServerSocket對象。ServerSocket的構造方法如下:ServerSocket(intport)port 是一個端口號。port必須和客戶呼叫的端口號相同2、所謂接收客戶的套接字連接就是 accept() 方法會返回一個和客戶端 Socket對象相連接的Socket對象,服務器端的這個Socket對象sc使用getOutputStream()方法獲得的輸出流將指向客戶端Socket對象myscoket使用getInputStream()方法獲得的那個輸入流;同樣,服務器端的這個Socket對象sc使用使用的getInputStream()方法獲得的輸入流將指向客戶端Socket對象myscoket使用getOutputStream()方法獲得的那個輸出流。3、連接建立以后,服務器端的套接字對象調用getInetAddress()方法可以獲取一個InetAddress對象,該對象含有客戶端的IP地址和域名。同樣,客戶端的套接字對象調用getInetAddress()方法可以獲取一個InetAddress對象,該對象含有服務器端的IP地址和域名。雙方通信完畢后,應使用 close() 方法關閉套接字連接。3.2.3 把套接字連接放在一個線程里需要注意的是,從套接字連接中讀取數(shù)據(jù)與從文件中讀取數(shù)據(jù)有很大的不同。盡管兩者都是輸入流,但從文件中讀取數(shù)據(jù)時,所有的數(shù)據(jù)都已經(jīng)在文件上了,而使用套接字連接時,可能在另一端數(shù)據(jù)發(fā)送出來之前, 就已經(jīng)開始試著讀取了,這時,就會堵塞本線程,直到該讀取方法成功讀取信息,本線程才繼續(xù)執(zhí)行后續(xù)的操作。因此,服務器端收到一個客戶的套接字后, 就應該啟動專門為該客戶服務的線程。3.3 主要代碼分析3.3.1 使用套接字實現(xiàn)的主要方法服務器為每個客戶啟動一個線程,在該線程中通過套接字和客戶交流信息。5山東科技大學學生課程設計當向服務器發(fā)送一條聊天信息時,服務器要讓所有的這些線程中的輸出流寫入信息,這樣所有的客戶的套接字的輸入流就讀取到了這一條信息。如果想把信息送給特定的用戶,服務器就讓特定的線程中的輸出流寫入信息,那么只有特定的客戶的套接字的輸入流可以讀取到這條信息。3.3.2 客戶端public voidactionPerformed(ActionEvente){ if(e.getSource()== connection )//連接服務器{try{ if(socket.isConnected()){}else{InetAddressaddress=InetAddress. getByName("" );//傳遞域名InetSocketAddresssocketAddress= newInetSocketAddress(address,666);socket.connect(socketAddress);in=newDataInputStream( socket.getInputStream());out= newDataOutputStream( socket.getOutputStream());name=inputName.getText();out.writeUTF( "姓名:"+name);send.setEnabled( true);if(!( thread .isAlive()))thread=newThread( this );thread.start(); //啟動線程,新建狀態(tài)到就緒隊列排隊}}catch (IOExceptionee){}6山東科技大學學生課程設計}if(e.getSource()== send)//發(fā)送內容{Strings= inputContent .getText();if(s!=null ){ try { out.writeUTF( "聊天內容:"+name+":" +s);}catch(IOExceptione1){}}}}public voidrun() //線程對象調度之后所執(zhí)行的操作{Strings= null ;while(true){ try{s= in.readUTF(); //讀取服務器發(fā)來的消息,堵塞狀態(tài)chatResult .append( "\n" +s);}catch(IOExceptione){ chatResult.setText("與服務器已斷開");try{socket.close();}catch(Exceptionexp){}break;}}}}3.3.3 服務器端public class ChatServer{ public static voidmain(Stringargs[])7山東科技大學學生課程設計{ServerSocketserver= null ;//等待接收客戶的套接字的ServerSocket 對象Socketyou= null;HashtablepeopleList;peopleList= newHashtable();while(true){ try {server= newServerSocket(666); //端口號}catch(IOExceptione1){System. out.println( "正在監(jiān)聽");}try {you=server.accept(); //接收客戶的套接字連接呼叫InetAddressaddress=you.getInetAddress();System. out.println( "客戶的IP:" +address);}catch (IOExceptione){}if(you!=null ){Server_threadpeopleThread= newServer_thread(you,peopleList);peopleThread.start(); //客戶線程}else { continue ;}}}}class Server_thread extends Thread//服務線程{String name=null ;Socket socket=null;8山東科技大學學生課程設計File file =null ;DataOutputStream out=null ;DataInputStream in=null ;Hashtable peopleList =null ;Server_thread(Sockett,Hashtablelist) //構造{peopleList=list;socket=t;try { in=newDataInputStream( socket.getInputStream());out=newDataOutputStream( socket.getOutputStream());}catch (IOExceptione){}}調試分析4.1 遇到的問題1、圖形用戶界面設計按鈕和文本框設計中的按鈕上的事件處理問題。解決:通過java程序設計教程中的事件和事件處理知道了具體事件的處理是使用事件對應的監(jiān)聽者接口中所提供的抽象方法, 這些方法需要重新定義,例如本程序中的public voidactionPerformed(ActionEvente) ,該方法用來對發(fā)生在按鈕上事件的處理。2、輸入流和輸出流的問題。解決:InputStreamReader 緩沖處理流通信雙方需要建立 Socket連接,本程序中Socket包含兩個流一個輸出流向外發(fā)送數(shù)據(jù),一個輸入流接收數(shù)據(jù)。3、監(jiān)聽端口的問題。解決:通過Socket應用方面的知識知道了監(jiān)聽端口是引用 Socket構造方法,指定了服務器程序中其監(jiān)聽的端口,還需拋出異常。9山東科技大學學生課程設計4.2 測試結果分析本次設計在調試過程中出現(xiàn)了許多問題,其中,最為嚴重的錯誤就是在最初的程序中,并沒有將異常處理加入到程序中去,所以在程序運行時出現(xiàn)了許多錯誤,后來經(jīng)過同學的幫助和查閱資料,我將異常處理加入到了代碼中,也就沒有大的問題。異常處理對程序是很重要的,加入異常處理有益于我們找到自己的錯誤,同時異常處理也能夠將語句使用程序處理錯誤的能力,有效的提高了我們完成程序的效率。用戶使用說明1、首先運行服務器端,正在監(jiān)聽。2、運行客戶端,輸入昵稱,并連接服務器,并發(fā)送消息。10山東科技大學學生課程設計3、運行多個客戶端,實現(xiàn)群聊。11山東科技大學學生課程設計12山東科技大學學生課程設計課程設計總結這次課程設計經(jīng)過不懈的努力, 從對整個實現(xiàn)的功能的設計, 編寫代碼,還有調試分析與完善設計,經(jīng)過了很長一段時間才實現(xiàn)了程序基本滿足聊天的需要。通過這次課程設計,增強了動手能力和解決實際問題的能力,再次之前,對Java編程技術和網(wǎng)絡 Socket編程知識都只是略知皮毛,缺乏深入的認識,對其工作方式和原理缺乏透徹的認識。在這段期間里,我認真學習了 Java語言的開發(fā)、Applet小程序的實現(xiàn)、異常處理,對編程思想有了進一步的體會,程序雖然完成,但是還存在許多缺點,比如沒有列出上線客戶、界面雖然簡潔但是不太美觀,由于時間和掌握的知識的問題只實現(xiàn)了群聊,對私聊的功能沒有實現(xiàn),這個部分在今后我會繼續(xù)完善, 希望自己在不斷學習和實踐中收獲到更多。附錄//ChatServer.javaimportjava.io.*;import.*;importjava.util.*;publicclassChatServer{publicstaticvoidmain(Stringargs[]){ServerSocketserver=null;Socketyou=null;HashtablepeopleList;peopleList=newHashtable();while(true){try { server=newServerSocket(666);}catch(IOExceptione1){System.out.println("正在監(jiān)聽");}13山東科技大學學生課程設計try { you=server.accept();InetAddressaddress=you.getInetAddress();System.out.println("客戶的IP:"+address);}catch(IOExceptione){}if(you!=null){Server_threadpeopleThread=newServer_thread(you,peopleList);peopleThread.start();}else{ continue;}}}}classServer_threadextendsThread{Stringname=null;Socketsocket=null;Filefile=null;DataOutputStreamout=null;DataInputStreamin=null;HashtablepeopleList=null;Server_thread(Sockett,Hashtablelist){peopleList=list;socket=t;try{in=newDataInputStream(socket.getInputStream());out=newDataOutputStream(socket.getOutputStream());}catch(IOExceptione){}}14山東科技大學學生課程設計publicvoidrun(){while(true){Strings=null;try{s=in.readUTF();//in讀取客戶放進“線路”里的信息,堵塞狀態(tài)if(s.startsWith("姓名:")){name=s;booleanboo=peopleList.containsKey(name);if(boo==false){peopleList.put(name,this);}else{out.writeUTF("請換昵稱:");socket.close();break;}}elseif(s.startsWith("聊天內容")){Stringmessage=s.substring(s.indexOf(":")+1);EnumerationchatPersonList=peopleList.elements();while(chatPersonList.hasMoreElements()){((Server_thread)chatPersonList.nextElement()).out.writeUTF("聊天內容:"+message);}}}catch(IOExceptionee){EnumerationchatPersonList=peopleList.elements();while(chatPersonList.hasMoreElements())15山東科技大學學生課程設計{try{Server_threadth=(Server_thread)chatPersonList.nextElement();if(th!=this&&th.isAlive()){th.out.writeUTF("客戶離線:"+name);}}catch(IOExceptioneee){}}peopleList.remove(name);try{socket.close();}catch(IOExceptioneee){}System.out.println(name+"客戶離開了");break;}}}}//Client.javaimport.*;importjava.io.*;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassClient{publicstaticvoidmain(Stringargs[]){newChatClient();}16山東科技大學學生課程設計}classChatClientextendsFrameimplementsRunnable,ActionListener{Buttonconnection,send;TextFieldinputName,inputContent;TextAreachatResult;Socketsocket=null;DataInputStreamin=null;DataOutputStreamout=null;Threadthread;Stringname="";publicChatClient(){socket=newSocket();Boxbox1=Box.createHorizontalBox();connection=newButton("ConnectToServer");send=newButton("Send");send.setEnabled(false);inputName=newTextField(6);inputContent=newTextField(22);chatResult=newTextArea();box1.add(newLabel("InputNickname"));box1.add(inputName);box1.add(connection);Boxbox2=Box.createHorizontalBox();box2.add(newLabel("Edit"));box2.add(inputContent);box2.add(send);connection.addActionListener(this);send.addActionListener(this);thread=newThread(this);add(box1,BorderLayout.NORTH);17山東科技大學學生課程設計add(box2,BorderLayout.SOUTH);add(chatResult,BorderLayout.CENTER);setBounds(10,30,400,280);setVisible(true);validate();addWindowListener(newWindowAdapter(){ publicvoidwindowClosing(WindowEvente){System.exit(0);}});}publicvoidactionPerformed(ActionEvente){if(e.getSource()==connection){try{if(socket.isConnected()){}else{InetAddressaddress=InetAddress.getByName("");InetSocketAddresssocketAddress=newInetSocketAddress(address,666);socket.connect(socketAddress);in=newDataInputStream(socket.getInputStream());out=newDataOutputStream(socket.getOutputStream());name=inputName.getText();out.writeUTF("姓名:"+name);send.setEnabled(true);if(!(thread.isAlive()))thread=newThread(this);thread.start();}18山東科技大學學生課程設計}catch(IOExceptionee){}}if(e.getSource()==send){Strings=inputContent.getText();if(s!=null){try{out.writeUTF("聊天內容:"+name+":"+s);}catch(IOExceptione1){}}}}publicvoidrun(){Strings=null;while(true){try{s=in.readUTF();chatResult.append("\n"+s);}catch(IOExceptione){chatResult.setText("與服務器已斷開");try{socket.close();}catch(Exceptionexp){}break;}}}}基于C8051F單片機直流電動機反饋控制系統(tǒng)的設計與研究基于單片機的嵌入式Web服務器的研究MOTOROLA單片機MC68HC(8)05PV8/A內嵌EEPROM的工藝和制程方法及對良率的影響研究基于模糊控制的電阻釬焊單片機溫度控制系統(tǒng)的研制基于MCS-51系列單片機的通用控制模塊的研究基于單片機實現(xiàn)的供暖系統(tǒng)最佳啟停自校正(STR)調節(jié)器19山東科技大學學生課程設計單片機控制的二級倒立擺系統(tǒng)的研究基于增強型51系列單片機的TCP/IP協(xié)議棧的實現(xiàn)基于單片機的蓄電池自動監(jiān)測系統(tǒng)基于32位嵌入式單片機系統(tǒng)的圖像采集與處理技術的研究基于單片機的作物營養(yǎng)診斷專家系統(tǒng)的研究基于單片機的交流伺服電機運動控制系統(tǒng)研究與開發(fā)基于單片機的泵管內壁硬度測試儀的研制基于單片機的自動找平控制系統(tǒng)研究基于C8051F040單片機的嵌入式系統(tǒng)開發(fā)基于單片機的液壓動力系統(tǒng)狀態(tài)監(jiān)測儀開發(fā)模糊Smith智能控制方法的研究及其單片機實現(xiàn)一種基于單片機的軸快流CO〈,2〉激光器的手持控制面板的研制基于雙單片機沖床數(shù)控系統(tǒng)的研究基于CYGNAL單片機的在線間歇式濁度儀的研制基于單片機的噴油泵試驗臺控制器的研制基于單片機的軟起動器的研究和設計基于單片機控制的高速快走絲電火花線切割機床短循環(huán)走絲方式研究基于單片機的機電產(chǎn)品控制系統(tǒng)開發(fā)基于PIC單片機的智能手機充電器基于單片機的實時內核設計及其應用研究基于單片機的遠程抄表系統(tǒng)的設計與研究基于單片機的煙氣二氧化硫濃度檢測儀的研制基于微型光譜儀的單片機系統(tǒng)單片機系統(tǒng)軟件構件開發(fā)的技術研究基于單片機的液體點滴速度自動檢測儀的研制基于單片機系統(tǒng)的多功能溫度測量儀的研制基于PIC單片機的電能采集終端的設計和應用基于單片機的光纖光柵解調儀的研制氣壓式線性摩擦焊機單片機控制系統(tǒng)的研制基于單片機的數(shù)字磁通門傳感器基于單片機的旋轉變壓器-數(shù)字轉換器的研究基于單片機的光纖Bragg光柵解調系統(tǒng)的研究單片機控制的便攜式多功能乳腺治療儀的研制基于C8051F020單片機的多生理信號檢測儀基于單片機的電機運動控制系統(tǒng)設計Pico專用單片機核的可測性設計研究基于MCS-51單片機的熱量計基于雙單片機的智能遙測微型氣象站MCS-51單片機構建機器人的實踐研究基于單片機的輪軌力檢測基于單片機的GPS定位儀的研究與實現(xiàn)基于單片機的電液伺服控制系統(tǒng)用于單片機系統(tǒng)的MMC卡文件系統(tǒng)研制基于單片機的時控和計數(shù)系統(tǒng)性能優(yōu)化的研究基于單片機和CPLD的粗光柵位移測量系統(tǒng)研究單片機控制的后備式方波UPS提升高職學生單片機應用能力的探究基于單片機控制的自動低頻減載裝置研究基于單片機控制的水下焊接電源的研究基于單片機的多通道數(shù)據(jù)采集系統(tǒng)基于uPSD3234單片機的氚表面污染測量儀的研制基于單片機的紅外測油儀的研究96系列單片機仿真器研究與設計基于單片機的單晶金剛石刀具刃磨設備的數(shù)控改造基于單片機的溫度智能控制系統(tǒng)的設計與實現(xiàn)基于MSP430單片機的電梯門機控制器的研制基于單片機的氣體測漏儀的研究基于三菱M16C/6N系列單片機的CAN/USB協(xié)議轉換器基于單片機和DSP的變壓器油色譜在線監(jiān)測技術研究基于單片機的膛壁溫度報警系統(tǒng)設計基于AVR單片機的低壓無功補償控制器的設計基于單片機船

溫馨提示

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

最新文檔

評論

0/150

提交評論