Java項目開發(fā)-Chat即時聊天系統(tǒng)_第1頁
Java項目開發(fā)-Chat即時聊天系統(tǒng)_第2頁
Java項目開發(fā)-Chat即時聊天系統(tǒng)_第3頁
Java項目開發(fā)-Chat即時聊天系統(tǒng)_第4頁
Java項目開發(fā)-Chat即時聊天系統(tǒng)_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

PAGEPAGE4開放實驗報告學(xué)院:計算機電子信息工程學(xué)院專業(yè):計算機科學(xué)與技術(shù)班級:11級計算機科學(xué)與技術(shù)本科一班學(xué)號201101010023姓名:邵帥一、開放實驗項目Java項目開發(fā)—Chat即時聊天系統(tǒng)二、開放實驗時間2012.11.07—2012.11.28三、開放實驗地點專業(yè)微機室二(B-4009)四、開放實驗?zāi)康木C合利用JDK、Eclipse開發(fā)環(huán)境,實現(xiàn)中小型項目的設(shè)計。本系統(tǒng)采用C/S架構(gòu),基于TCP協(xié)議實現(xiàn)數(shù)據(jù)在服務(wù)器和客戶端之間進行傳輸,實現(xiàn)聊天信息的存儲。通過“Chat即時聊天系統(tǒng)”的設(shè)計過程,深刻了解掌握面向?qū)ο蟪绦蛟O(shè)計語言Java的核心概念和特性;了解編程技術(shù)知識,學(xué)會處理異常狀況,深入了解Java數(shù)據(jù)庫功能,熟練掌握圖形界面的操作技術(shù),掌握Java應(yīng)用軟件的開發(fā)環(huán)境和開發(fā)過程;靈活選擇程序設(shè)計思想,在編寫過程中進一步體會Java與其它編程語言的不同之處,分析出Java的優(yōu)點和先進之處。同時,使學(xué)生能夠深入的了解軟件項目開發(fā)的流程和步驟,掌握每一部分的設(shè)計和實現(xiàn)方法,以及充分利用現(xiàn)有的軟件工程設(shè)計工具來完成項目的設(shè)計。五、開放實驗內(nèi)容1.概要設(shè)計采用Socket類建立套接字實現(xiàn)客戶端與服務(wù)端的通訊。總體數(shù)據(jù)流圖服務(wù)端客戶端 發(fā)送請求服務(wù)端客戶端返回回應(yīng)發(fā)出連接信號客戶端數(shù)據(jù)流圖發(fā)出連接信號客戶端發(fā)送消息接收并顯示消息客戶端發(fā)送消息接收并顯示消息服務(wù)端數(shù)據(jù)流圖接受并顯示消息接受并顯示消息服務(wù)端發(fā)送消息服務(wù)端發(fā)送消息2.設(shè)計原理(1).利用多線程實現(xiàn)多客戶機制。服務(wù)器總是在指定的端口上監(jiān)聽是否有客戶請求,一旦監(jiān)聽到客戶請求,服務(wù)器就會啟動一個專門的服務(wù)線程來響應(yīng)該客戶的請求,而服務(wù)器本身在啟動完線程之后馬上又進入監(jiān)聽狀態(tài),等待下一個客戶的到來。(2).服務(wù)器在接受客戶方的請求后,立即高度一個線程以處理服務(wù)器與客戶方之間的交互,主程序則返回繼續(xù)監(jiān)聽端口,等待下一個客戶的連接請求。前一個線程在完成相應(yīng)的交互過程后自動退出,連接也將自動關(guān)閉。(3).在服務(wù)器的程序中首先創(chuàng)建單個ServerSocket,并調(diào)用accept()來等候一個新連接,一旦accept()返回,就取得獲得結(jié)果的Socket,并用它新建一個線程,令其只為那個特定的客戶提供服務(wù)。然后再調(diào)用accept(),等候下一個新的連接請求。3.客戶端設(shè)計(1)、數(shù)據(jù)流圖創(chuàng)建客戶端Socket創(chuàng)建客戶端Socket.向服務(wù)器發(fā)送請求,調(diào)用connect()向服務(wù)器發(fā)送請求,調(diào)用connect()發(fā)送請求數(shù)據(jù),調(diào)用write()接收響應(yīng)數(shù)據(jù)發(fā)送請求數(shù)據(jù),調(diào)用write()接收響應(yīng)數(shù)據(jù)定義Client類控制客戶端,用于實現(xiàn)客戶端的接收信息與發(fā)送信息等操作(2)、客戶端代碼import.*;importjava.io.*;publicclassClientextendsThread{Socketskt;//用于客戶端的連接InetAddresshost;//主機地址intport;//端口號BufferedReadertheInputStream;PrintStreamtheOutputStream;Stringreadin;Facechat;publicClient(Stringip,intp,Facechat){try{host=InetAddress.getByName(ip);//獲取IP地址port=p;//獲取端口號this.chat=chat;}catch(IOExceptione){chat.ta.append(e.toString());}}publicvoidrun(){try{chat.ta.append("準備連線,稍后!");skt=newSocket(host,port);//新建Socket對象chat.ta.append("成功\n");//緩沖區(qū)末尾添加字符串theInputStream=newBufferedReader(newInputStreamReader(skt.getInputStream()));theOutputStream=newPrintStream(skt.getOutputStream());while(true){readin=theInputStream.readLine();chat.ta.append(readin+"\n");}}catch(SocketExceptione){chat.ta.append("未連上!\n");chat.clientBtn.setEnabled(true);chat.serverBtn.setEnabled(true);chat.tfaddress.setEnabled(true);chat.tfport.setEnabled(true);發(fā)出連接信號發(fā)出連接信號try{skt.close();}catch(IOExceptionerr){chat.ta.append(err.toString());}}catch(IOExceptione){chat.ta.append(e.toString());}}publicvoiddataout(Stringdata){theOutputStream.println(data);}}4、服務(wù)端的設(shè)計(1)、數(shù)據(jù)流圖監(jiān)聽來自客戶端的請求,調(diào)用listen()組塞,等待客戶端請求,accpt()聯(lián)編到某一個端口,調(diào)用bin()創(chuàng)建服務(wù)端Socket發(fā)出連接信號發(fā)出連接信號發(fā)出連接信號發(fā)出連接信號發(fā)出連接信號發(fā)出連接信號監(jiān)聽來自客戶端的請求,調(diào)用listen()組塞,等待客戶端請求,accpt()聯(lián)編到某一個端口,調(diào)用bin()創(chuàng)建服務(wù)端Socket發(fā)出連接信號發(fā)出連接信號發(fā)出連接信號發(fā)出連接信號發(fā)出連接信號發(fā)出連接信號處理請求數(shù)據(jù)接收來自客戶端的數(shù)據(jù),read()返回相應(yīng)的數(shù)據(jù),調(diào)用write()處理請求數(shù)據(jù)接收來自客戶端的數(shù)據(jù),read()返回相應(yīng)的數(shù)據(jù),調(diào)用write()定義Server類控制服務(wù)端,用于實現(xiàn)服務(wù)端的接收信息和發(fā)送信息等操作(2)、服務(wù)端代碼importjava.awt.*;import.*;importjava.io.*;publicclassServerextendsThread{ServerSocketskt;//ServerSocket類監(jiān)聽進入的連接,為每個新的連接產(chǎn)生一個Socket對象SocketClient[]=newSocket[10];SocketClient1=null;inti=0;TextAreain;intport,k=0,l=0;PrintStreamtheOutputStream;Facechat;publicServer(intport,Facechat){try{this.port=port;skt=newServerSocket(port);this.chat=chat;}catch(IOExceptione){chat.ta.append(e.toString());}}publicvoidrun(){chat.ta.append("等待連線");while(true){try{Client[k]=skt.accept();//當(dāng)有客戶端連接時就新建一個子線程if(i<2){ServerThreadserver[]=newServerThread[10];server[k]=newServerThread(Client[k],this.chat,i);l=server.length;server[k].start();chat.ta.append("客戶端"+Client[k].getInetAddress()+"已連線\n");//for(intj=0;j<server.length;j++)theOutputStream=newPrintStream(server[k].getClient().getOutputStream());i=server[k].getI();k++;}else{//theOutputStream=newPrintStream(null);}}catch(SocketExceptione){}catch(IOExceptione){chat.ta.append(e.toString());}}}publicvoiddataout(Stringdata){//for(intj=0;j<l;j++)theOutputStream.println(data);}}classServerThreadextendsThread{ServerSocketskt;SocketClient;TextAreain;intport,i;BufferedReadertheInputStream;PrintStreamtheOutputStream;Stringreadin;Facechat;publicServerThread(Sockets,Facechat,inti){this.i=++i;Client=s;this.chat=chat;}publicintgetI(){returnthis.i;}publicSocketgetClient(){returnthis.Client;}publicvoidrun(){try{theInputStream=newBufferedReader(newInputStreamReader(Client.getInputStream()));theOutputStream=newPrintStream(Client.getOutputStream());while(true){readin=theInputStream.readLine();chat.ta.append(readin+"\n");}}catch(SocketExceptione){chat.ta.append("連線中斷!\n");//設(shè)置組件可用性chat.clientBtn.setEnabled(true);chat.serverBtn.setEnabled(true);chat.tfaddress.setEnabled(true);chat.tfport.setEnabled(true);try{i--;skt.close();Client.close();}catch(IOExceptionerr){chat.ta.append(err.toString());}}catch(IOExceptione){chat.ta.append(e.toString());}}publicvoiddataout(Stringdata){theOutputStream.println(data);}}5、聊天界面的設(shè)計(1)、通過調(diào)用Face類對界面進行管理設(shè)計,運用Button、TextArea、Label等組件,然后通過actionPerformed觸發(fā)事件來完成操作。(2)、界面代碼importjava.awt.*;importjava.awt.event.*;publicclassFaceextendsFrame{privatestaticfinallongserialVersionUID=1L;ButtonclientBtn,serverBtn;TextAreata;TextFieldtfaddress,tfport,tftype,tfname;Labellbl1,lbl2,lbl3,lbl4;intport;Clientclient;Serverserver;booleaniamserver;staticFacefrm;publicFace(){//實例化組件clientBtn=newButton("客戶端");serverBtn=newButton("服務(wù)器");ta=newTextArea("",10,50,TextArea.SCROLLBARS_BOTH);lbl1=newLabel("IP地址:");tfaddress=newTextField("",10);lbl2=newLabel("端口:");tfport=newTextField("8888");lbl3=newLabel("發(fā)送內(nèi)容:");tftype=newTextField(25);lbl4=newLabel("昵稱:");tfname=newTextField(30);tftype.addKeyListener(newTFListener());ta.setEditable(false);//向容器中加入以上組件setLayout(newFlowLayout());add(lbl1);add(tfaddress);add(lbl2);add(tfport);add(serverBtn);add(clientBtn);add(lbl4);add(tfname);add(ta);add(lbl3);add(tftype);//設(shè)置格式setLocation(350,250);//窗口顯示在屏幕的位置坐標(biāo)setSize(400,320);//設(shè)置窗體大小setTitle("圖形界面的聊天程序");this.setVisible(true);//設(shè)置窗體可見clientBtn.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){port=Integer.parseInt(tfport.getText());client=newClient(tfaddress.getText(),port,frm);client.start();tfaddress.setEnabled(false);tfport.setEnabled(false);serverBtn.setEnabled(false);clientBtn.setEnabled(false);tfname.setText("客戶端");}});//客戶端事件響應(yīng)serverBtn.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){port=Integer.parseInt(tfport.getText());server=newServer(port,frm);server.start();iamserver=true;tfaddress.setText("成為服務(wù)器");tfaddress.setEnabled(false);tfport.setEnabled(false);serverBtn.setEnabled(false);clientBtn.setEnabled(false);tfname.setText("服務(wù)器");}});//服務(wù)器端事件響應(yīng)addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});//窗口事件響應(yīng)}publicstaticvoid

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論