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

下載本文檔

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

文檔簡介

1、.課程設(shè)計(jì)指導(dǎo)書姓 名 學(xué) 號(hào) 班 級(jí)一班課程名稱Java課程設(shè)計(jì)課程性質(zhì)設(shè)計(jì)時(shí)間 2010年 11月4日 2010年12月31日設(shè)計(jì)名稱聊天小程序設(shè)計(jì)目的本次課程設(shè)計(jì)是對(duì)前面學(xué)過的面向?qū)ο蟮木幊趟枷胍约熬幊谭椒ǖ囊粋€(gè)總結(jié)、回顧和實(shí)踐。開始設(shè)計(jì)前學(xué)生一定要先回顧以前所學(xué)的內(nèi)容,明確本次設(shè)計(jì)所要用到的技術(shù)點(diǎn)并到網(wǎng)上搜索以及查閱相關(guān)的書籍來搜集資料。通過編寫一個(gè)基于JAVA的應(yīng)用系統(tǒng)綜合實(shí)例,來掌握J(rèn)ava語言編程技巧。設(shè)計(jì)要求1、使用圖形用戶界面。2、能實(shí)現(xiàn)一個(gè)聊天室中多人聊天。3、可以兩人私聊。設(shè)計(jì)思路與設(shè)計(jì)過程思路與原理:服務(wù)器端接受客戶端的連接請(qǐng)求,同時(shí)啟動(dòng)一個(gè)線程處理這個(gè)連接,線程不停的

2、讀取客戶端輸入,然后把輸入加入隊(duì)列中,等候處理。在線程啟動(dòng)的同時(shí)將線程加入隊(duì)列中,以便在需要的時(shí)候定位和取出。過程:首先設(shè)計(jì)ChatServer服務(wù)端與ChatClinet客戶端 1、 服務(wù)器(ChatServer),使用ServerSocket監(jiān)聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請(qǐng)求,客戶連接后,會(huì)話產(chǎn)生;在完成會(huì)話后,關(guān)閉連接。2、 客戶端(ChatClinet),使用Socket對(duì)網(wǎng)絡(luò)上某一個(gè)服務(wù)器的 某一個(gè)端口發(fā)出連接請(qǐng)求,一旦連接成功,打開會(huì)話;會(huì)話完成后,關(guān)閉Sock

3、et??蛻舳瞬恍枰付ù蜷_的端口,通常臨時(shí)的、動(dòng)態(tài)的分配一個(gè)1024以上的端口。(具體詳細(xì)的過程步驟及代碼見下面) 計(jì)劃與進(jìn)度計(jì)劃在兩個(gè)月內(nèi)完成任務(wù),首先在前半個(gè)月內(nèi)(11月4日-11月19日),構(gòu)思通過網(wǎng)上(圖書館)的知識(shí)與課本上的相關(guān)內(nèi)容的了解與認(rèn)識(shí),確認(rèn)好選擇的課題與怎樣設(shè)計(jì),基本的思路想好。十五天(11月19日-12月5日)內(nèi)參考資料爭取完成服務(wù)端的程序,在12月5日-12月20日完成客戶端的程序設(shè)計(jì),在12月20日12月30日內(nèi)完成實(shí)現(xiàn)報(bào)告的填寫工作。在12月31日全面完成整個(gè)課題,并上交給老師。任課教師意 見備 注課程設(shè)計(jì)報(bào)告課程:學(xué)號(hào):姓名:班級(jí)教師:時(shí)間計(jì)算機(jī)科學(xué)與技術(shù)設(shè)計(jì)名稱

4、:聊天小程序日期: 2010年 11月 4 日 設(shè)計(jì)內(nèi)容:設(shè)計(jì)一個(gè)在圖形界面下,實(shí)現(xiàn)一個(gè)聊天室中多人聊天,也可以私聊的聊天小程序設(shè)計(jì)目的與要求:目的是為了更好的掌握java這門課程的內(nèi)容,同時(shí)更好的理解與掌握socket編程,對(duì)所有面向?qū)ο蟮木幊趟枷胍约熬幊谭椒ǖ囊粋€(gè)總結(jié)、回顧和實(shí)踐,掌握J(rèn)ava語言編程技巧。要求使用圖形用戶界面。能實(shí)現(xiàn)一個(gè)聊天室中多人聊天??梢詢扇怂搅?。(提示:使用socket通信)程序描述清晰準(zhǔn)確,思路清晰,程序能夠?qū)崿F(xiàn)相應(yīng)的功能。設(shè)計(jì)環(huán)境或器材、原理與說明、主要完成的功能、設(shè)計(jì)思路和框圖:設(shè)計(jì)環(huán)境或者器材:j d k或者j c編輯器,筆記本電腦兩臺(tái),網(wǎng)線三條,小型交換機(jī)

5、一個(gè)。原理與說明: 建立服務(wù)端與客戶端的一個(gè)或者多個(gè)連接,其中服務(wù)器,使用Server Socket監(jiān)聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請(qǐng)求,客戶連接后,會(huì)話產(chǎn)生;在完成會(huì)話后,關(guān)閉連接。 客戶端,使用Socket對(duì)網(wǎng)絡(luò)上某一個(gè)服務(wù)器的某一個(gè)端口發(fā)出連接請(qǐng)求,一旦連接成功,打開會(huì)話;會(huì)話完成后,關(guān)閉Socket??蛻舳瞬恍枰付ù蜷_的端口,通常臨時(shí)的、動(dòng)態(tài)的分配一個(gè)1024以上的端口。主要功能:1、實(shí)現(xiàn)服務(wù)端與客戶端的連接,實(shí)現(xiàn)兩者之間的信息交換。 2、實(shí)現(xiàn)了一個(gè)服務(wù)器可以與多個(gè)

6、客戶端實(shí)現(xiàn)連接,即實(shí)現(xiàn)了一個(gè)聊天室里面可以多人聊天。 3、亦可以實(shí)現(xiàn)私聊的功能。設(shè)計(jì)思路與框圖:服務(wù)器端接受客戶端的連接請(qǐng)求,同時(shí)啟動(dòng)一個(gè)線程處理這個(gè)連接,線程不停的讀取客戶端輸入,然后把輸入加入隊(duì)列中,等候處理。在線程啟動(dòng)的同時(shí)將線程加入隊(duì)列中,以便在需要的時(shí)候定位和取出。大概的框圖: chatServer端 chatclient端 創(chuàng)建ServerSocket對(duì)象在某 端口提供監(jiān)聽服務(wù) 等待來自chartclient的服務(wù)請(qǐng)求接受chartclient端的請(qǐng)求用 建立連接 創(chuàng)建Socket對(duì)象向server的監(jiān)聽端返回的Socket建立連接 口請(qǐng)求 通過向Socket中讀寫數(shù)據(jù)來 數(shù)據(jù)通信

7、 通過向新的Socket中讀寫數(shù)據(jù)來與chartclient端通信 與server端通信 關(guān)閉Socket結(jié)束與當(dāng)前的 拆除連接 關(guān)閉Socket結(jié)束與server的通信client的通信等待其他的請(qǐng)求關(guān)閉ServerSocket對(duì)象結(jié)束監(jiān)聽服務(wù)設(shè)計(jì)過程(步驟)或程序代碼(可以加頁):主要代碼:服務(wù)端ChatServerclass SocketThread extends Thread/線程類,用于和每個(gè)客戶端連接static Vector<SocketThread> clientVector=new Vector<SocketThread>();/存放每個(gè)線程信息pr

8、ivate Socket socket;/存放每個(gè)線程的Socket對(duì)象String nick;/存放每個(gè)線程的昵稱private boolean firstRead;/用于判斷是否為第一次接收數(shù)據(jù)SocketThread(Socket s)/構(gòu)造函數(shù)socket=s;nick=null;firstRead=true;private void noticeDelUser()/通告所有線程的客戶端,本用戶退出String msg="#"+this.nick;for(int i=0;i<clientVector.size();i+)if(clientVector.get(

9、i).nick.equals(this.nick)=false)sendMsg(i,msg);private void delSocket()/關(guān)閉socketnoticeDelUser();/通告所有線程的客戶端,本用戶退出clientVector.remove(this);/從clientVector中移除本線程trysocket.close();System.out.println(socket.getInetAddress()+"斷開連接!");catch(IOException closeError)private void noticeAddUser()/通告所

10、有線程的客戶端,本用戶進(jìn)入String msg="#"+this.nick;for(int i=0;i<clientVector.size();i+)sendMsg(i,msg);private void requestAllUser()/本線程請(qǐng)求其他有用戶信息int index=0;int i=0;for(i=0;i<clientVector.size();i+)if(clientVector.get(i).nick.equals(this.nick)break;index=i;for(i=0;i<clientVector.size();i+)if(i

11、ndex!=i)String msg="#"+clientVector.get(i).nick;sendMsg(index,msg);private String msgForward(String msg)/對(duì)接收到的信息轉(zhuǎn)發(fā)String name;/存放目的用戶昵稱String tempMsg;/存放生成的轉(zhuǎn)發(fā)數(shù)據(jù)if(firstRead=true)/若為第一次收到數(shù)據(jù)int i;for(i=0;i<clientVector.size();i+)/檢查昵稱是否存在if(clientVector.get(i).nick.equals(msg)=true)break;

12、if(i>=clientVector.size()/昵稱不存在則:nick=msg;/在clientVector中添加本線程信息msg="#您使用的昵稱:"+msg;/并通告所有線程的客戶端,本用戶進(jìn)入noticeAddUser();/以及請(qǐng)求其他有用戶信息clientVector.add(this);requestAllUser();firstRead=false;elsemsg="#您輸入的昵稱已經(jīng)存在,請(qǐng)重新輸入:"/昵稱存在,發(fā)送系統(tǒng)提示return msg;if(msg.startsWith("!")=true)/若客

13、戶端發(fā)送密語name=msg.substring(1, msg.indexOf(' ');/獲得目的用戶昵稱,生成發(fā)送信息tempMsg=this.nick+"悄悄對(duì)"+name+"說:rnt"+msg.substring(msg.indexOf(' ');elsetempMsg=this.nick+":rnt"+msg;/若為全體聊天name="610665c2a05631a7bc460993bae36ee6"/此name為特殊值,專指全體聊天if(name.equals(&quo

14、t;610665c2a05631a7bc460993bae36ee6")=false)/若為密語int i=0;for(;i<clientVector.size();i+)/查找目的客戶線程在clientVector中的位置if(clientVector.get(i).nick.equals(name)=true)break;if(i>=clientVector.size()/若找不到目的客戶線程,則返回系統(tǒng)提示msg="#您所發(fā)送的用戶名昵稱不存在!"elsesendMsg(i,tempMsg);/找到目的客戶線程并轉(zhuǎn)發(fā)else/為全體聊天,全體轉(zhuǎn)發(fā)

15、int i=0;for(;i<clientVector.size();i+)sendMsg(i,tempMsg);return msg;private void sendMsg(int index,String msg)/向特定客戶轉(zhuǎn)發(fā),msg為轉(zhuǎn)發(fā)信息Socket tempSocket=clientVector.get(index).socket;/index為客戶在clientVector中位置tryPrintWriter pw=new PrintWriter(tempSocket.getOutputStream(),true);pw.println(msg);catch(IOExc

16、eption printError)public void run()/建立讀寫流String msg=null;InputStreamReader isr=null;BufferedReader br=null;tryisr=new InputStreamReader(socket.getInputStream();br=new BufferedReader(isr);catch(IOException inOutError)System.out.println("無法與客戶建立流!");delSocket();return;dotrymsg=br.readLine();

17、catch(IOException readError)System.out.println("讀取流數(shù)據(jù)錯(cuò)誤!");delSocket();return;System.out.println(msg);msg=msgForward(msg);/處理讀取的數(shù)據(jù)if(msg.startsWith("#")=true)/若有系統(tǒng)提示返回,則返回系統(tǒng)提示tryPrintWriter pw=new PrintWriter(socket.getOutputStream(),true);pw.println(msg);catch(IOException printE

18、rror)while(true);public class ChatServer public static void main(String args)ServerSocket serverSocket=null;Socket socket=null;SocketThread st;tryserverSocket=new ServerSocket(8324);/監(jiān)聽端口8324System.out.println("服務(wù)器啟動(dòng)成功,正在監(jiān)聽8324端口!");catch(IOException e)System.out.println("不能使用端口8324,無

19、法啟動(dòng)服務(wù)器!");return;while(true)trysocket=serverSocket.accept();/獲得連接,并建立Socketcatch(IOException e)System.out.println("不能建立連接:"+socket.getInetAddress().toString()+"/"+socket.getPort();st=new SocketThread(socket);/創(chuàng)建新線程System.out.println("建立連接:"+socket.getInetAddress().

20、toString()+"/"+socket.getPort();st.start();/開始新線程客戶端ChartClient主要代碼:package ch02;private void initSocket()/對(duì)socket的初始化trytransferSocket=new Socket("localhost",8324);/與服務(wù)器建立連接ReceiveThread rt=new ReceiveThread(transferSocket,this);rt.start();/開啟新線程用于讀取數(shù)據(jù)流catch(IOException createEr

21、ror)/出現(xiàn)錯(cuò)誤則退出程序welcomeInfo.setText("無法連接服務(wù)器!");trytransferSocket.close();welcomeInfo.setText("與服務(wù)器連接已經(jīng)斷開!");System.exit(0);catch(IOException closeError)System.exit(0);/對(duì)輸出流的初始化trysocketWriter=new PrintWriter(transferSocket.getOutputStream(),true);catch(IOException streamError)welc

22、omeInfo.setText("流建立錯(cuò)誤!");trytransferSocket.close();welcomeInfo.setText("與服務(wù)器連接已經(jīng)斷開!");System.exit(0);catch(IOException closeError)System.exit(0);public void addNewMsg(String msg)/向chatRecord中追加數(shù)據(jù)chatRecord.append(msg+"rn");public void setWelcome(String msg)/改變welcomeIn

23、fo值welcomeInfo.setText(msg);public void windowIconified(WindowEvent e)public void windowClosed(WindowEvent e)public void windowDeactivated(WindowEvent e)public void windowActivated(WindowEvent e)public void windowClosing(WindowEvent e)/窗體關(guān)閉事件System.exit(0);public void windowDeiconified(WindowEvent e

24、)public void windowOpened(WindowEvent e)public void keyPressed(KeyEvent e)/對(duì)鍵盤事件的監(jiān)視switch(e.getKeyCode()case KeyEvent.VK_ENTER :/回車鍵,就發(fā)送信息sendMsg();/向服務(wù)器發(fā)送信息break;case KeyEvent.VK_CANCEL:/esc鍵則,friendList選中第0項(xiàng)friendList.select(0);transName.setText("發(fā)送給:"+friendList.getSelectedItem().toStri

25、ng();break;default :public void keyTyped(KeyEvent e)public void keyReleased(KeyEvent e)public void itemStateChanged(ItemEvent e)/監(jiān)視friendList選中項(xiàng)變化if(e.getSource().equals(friendList)/改變transName值transName.setText("發(fā)送給:"+friendList.getSelectedItem().toString();public void textValueChanged(Te

26、xtEvent e)/若chatRecod字符多余100000if(chatRecord.getText().length()>100000)/則清除部分歷史記錄,防止占用過大內(nèi)存chatRecord.setText(chatRecord.getText().substring(chatRecord.getText().indexOf("rn")+2);public void actionPerformed(ActionEvent e)/點(diǎn)擊sendButton則發(fā)送信息if(e.getSource()=sendButton)sendMsg();public void

27、 sendMsg()/向服務(wù)器發(fā)送信息if(msgEditor!=null)if(friendList.getSelectedIndex()=0)/發(fā)送全體聊天信息socketWriter.println(msgEditor.getText();else/發(fā)送密語,并回顯socketWriter.println("!"+friendList.getSelectedItem().toString()+" "+msgEditor.getText();chatRecord.append(this.nick+"對(duì)"+friendList.ge

28、tSelectedItem().toString()+"悄悄說:rnt"+msgEditor.getText()+"rn");else/若發(fā)送信息為空,則系統(tǒng)提示chatRecord.append("!不能發(fā)送空消息rn");msgEditor.setText("");/將發(fā)送信息欄置空class ReceiveThread extends Thread/監(jiān)視輸入流的類Socket socket;/連接服務(wù)器的socketClientWindows clientWindow;/主窗口ReceiveThread(So

29、cket s,ClientWindows cw)/初始化socket=s;clientWindow=cw;public void run()String msg=null;BufferedReader br=null;try/建立輸入流br=new BufferedReader(new InputStreamReader(socket.getInputStream();catch(IOException ReadError)clientWindow.setWelcome("讀入流建立錯(cuò)誤,程序關(guān)閉!");trysocket.close();clientWindow.setW

30、elcome("與服務(wù)器連接已經(jīng)斷開!");System.exit(0);catch(IOException closeError)System.exit(0);while(true)/讀取數(shù)據(jù)流的信息trymsg=br.readLine();/獲得信息catch(IOException e)trysocket.close();clientWindow.setWelcome("與服務(wù)器連接已經(jīng)斷開!");System.exit(0);catch(IOException closeError)System.exit(0);msg=msgChange(msg

31、);/轉(zhuǎn)變讀取到的信息if(msg!=null)clientWindow.addNewMsg(msg);/向聊天窗口添加新聊天內(nèi)容private String msgChange(String msg)if(msg.startsWith("#")/刪除摸一個(gè)用戶的信息for(int i=1;i<clientWindow.friendList.getItemCount();i+)if(clientWindow.friendList.getItem(i).toString().equals(msg.substring(3)clientWindow.friendList.remove(i);clientWindow.friendList.select(0);return null;elseif(msg.startsWith("#")/增加某一個(gè)用戶信息clientWindow.friendList.add(msg.substring(2);clientWindow.friendList.select(0);return null;elseif(msg.startsWith("#")/系統(tǒng)提示msg="!"+msg.substring(1);if(msg.star

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論