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

下載本文檔

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

文檔簡介

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

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

3、關閉Socket??蛻舳瞬恍枰付ù蜷_的端口,通常臨時的、動態(tài)的分配一個1024以上的端口。(具體詳細的過程步驟及代碼見卜面)計劃在兩個月內(nèi)完成任務,首先在前半個月內(nèi)(11月4日-11月19日),構思通過網(wǎng)上(圖書館)的知識與課本上的相關內(nèi)容的了解與認識,確認好選擇的課題與怎樣設計,基本的思路想好。十五計劃與進度天(11月19日-12月5日)內(nèi)參考資料爭取完成服務端的程序,在12月5日-12月20日完成客戶端的程序設計,在12月20日一12月30日內(nèi)完成實現(xiàn)報告的填寫工作。在12月31日全面完成整個課題,并上交給老師。任課教師意見備注課程設計報告課程:Java語言程序設計學號:09838024

4、09838027姓名:宣紅東宛立生班級:一班教師:江L慶如芻時間2010/11/42010/12/31計算機科學與技術設計名稱:聊天小程序日期:2010年11月4日設計內(nèi)容:設計一個在圖形界面下,實現(xiàn)一個聊天室中多人聊天,也可以私聊的聊天小程序設計目的與要求:目的是為了更好的掌握java這門課程的內(nèi)容,問時更好的理解與掌握socket編程,對所有面向?qū)ο蟮木幊趟枷胍约熬幊谭椒ǖ囊粋€總結、回顧和實踐,掌握Java語言編程技巧。要求使用圖形用戶界面。能實現(xiàn)一個聊天室中多人聊天??梢詢扇怂搅?。(提示:使用socket通信)程序描述清晰準確,思路清晰,程序能夠?qū)崿F(xiàn)相應的功能。設計環(huán)境或器材、原理與說明

5、、主要完成的功能、設計思路和框圖:設計環(huán)境或者器材:jdk或者jc編輯器,筆記本電腦兩臺,網(wǎng)線三條,小型交換機一個。原理與說明:建立服務端與客戶端的一個或者多個連接,其中服務器,使用ServerSocket監(jiān)聽指正的端口,端口可以隨意指7E(由于1024以下的端口通甬屬于保留端口,在一些操作系統(tǒng)中E以隨意使用,所以建議使用大于1024的端口),等待客戶連接請求,客戶連接后,會話產(chǎn)生;在完成會話后,關閉連接。客戶端,使用Socket對網(wǎng)絡上某一個服務器的某一個端口發(fā)出連接請求,一旦連接成功,打開會話;會話完成后,關閉Socket。客戶端不需要指定打開的端口,通常臨時的、動態(tài)的分配一個1024以上

6、的端口。主要功能:1、實現(xiàn)服務端與客戶端的連接,實現(xiàn)兩者之間的信息交換。2、實現(xiàn)了一個服務器可以與多個客戶端實現(xiàn)連接,即實現(xiàn)了一個聊天室里面可以多人聊天。3、亦可以實現(xiàn)私聊的功能。設計思路與框圖:服務器端接受客戶端的連接請求,同時啟動一個線程處理這個連接,線程不停的讀取客戶端輸入,然后把輸入加入隊列中,等候處理。在線程啟動的同時將線程加入隊列中,以便在需要的時候定位和取出。大概的框圖:chatServer端chatclient端I創(chuàng)建ServerSocket對象在某端口提供監(jiān)聽服務等待來自chartclient的服務請求接受chartclient端的請求用建立連接創(chuàng)建Socket對象向serv

7、er的監(jiān)聽端一返回的Socket建立連接口請求.通過向Socket中讀寫數(shù)據(jù)來數(shù)據(jù)通信-通過向新的Socket中讀寫數(shù)據(jù)來與chartclient端通信與server端通信關閉Socket結束與當前的拆除連接一-關閉Socket結束與server的通client的通信等待其他的請求關閉ServerSocket對象結束監(jiān)聽服務/線程類,用于和存放/存放每個線程/存放每個線程/用于判斷是否構造函數(shù)/通告所有線程/關閉socket/通告所有線程/從斷開連接!");/通告所有線程/本線程請求其設計過程(步驟)或程序代碼(可以加頁):主要代碼:服務端ChatServerclassSocketT

8、hreadextendsThread(每個客戶端連接staticVector<SocketThread>clientVector=newVector<SocketThread>();/每個線程信息privateSocketsocket;的Socket對象Stringnick;的昵稱privatebooleanfirstRead;為第一次接收數(shù)據(jù)SocketThread(Sockets)(socket=s;nick=null;firstRead=true;privatevoidnoticeDelUser()的客戶端,本用戶退出Stringmsg="#"

9、+this.nick;for(inti=0;i<clientVector.size();i+)if(clientVector.get(i).nick.equals(this.nick)=false)sendMsg(i,msg);privatevoiddelSocket()noticeDelUser();的客戶端,本用戶退出clientVector.remove(this);clientVector中移除本線程trysocket.close();System.out.println(socket.getInetAddress()+"catch(IOExceptioncloseEr

10、ror)privatevoidnoticeAddUser()的客戶端,本用戶進入Stringmsg="#"+this.nick;for(inti=0;i<clientVector.size();i+)sendMsg(i,msg);privatevoidrequestAllUser()他有用戶信息intindex=0;inti=0;for(i=0;i<clientVector.size();i+)if(clientVector.get(i).nick.equals(this.nick)break;index=i;for(i=0;i<clientVector.

11、size();i+)if(index!=i)Stringmsg="#"+clientVector.get(i).nick;sendMsg(index,msg);privateStringmsgForward(Stringmsg)息轉發(fā)Stringname;昵稱StringtempMsg;發(fā)數(shù)據(jù)if(firstRead=true)到數(shù)據(jù)inti;for(i=0;i<clientVector.size();i+)存在if(clientVector.get(i).nick.equals(msg)=true)break;if(i>=clientVector.size()

12、nick=msg;clientVector中添加本線程信息msg="#您使用的昵稱:"+msg;有線程的客戶端,本用戶進入noticeAddUser();有用戶信息clientVector.add(this);requestAllUser();firstRead=false;elsemsg="#您輸入的昵稱已經(jīng)存在,請重新輸入:存在,發(fā)送系統(tǒng)提示returnmsg;if(msg.startsWith("!")=true)/對接收到的信/存放目的用戶/存放生成的轉/若為第一次收/檢查昵稱是否/昵稱不存在則:/在/并通告所/以及請求其他/昵稱/若客

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

14、10665c2a05631a7bc460993bae36ee6")=false)/若為密語inti=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);線程并轉發(fā)else體轉發(fā)inti=0;for(;i<clientVector.siz

15、e();i+)sendMsg(i,tempMsg);returnmsg;privatevoidsendMsg(intindex,Stringmsg)發(fā),msg為轉發(fā)信息SockettempSocket=clientVector.get(index).socket;/查找目的客戶/若找不到目的/找到目的客戶/為全體聊天,全/向特定客戶轉/index為客戶在clientVector中位置tryPrintWriterpw=newPrintWriter(tempSocket.getOutputStream(),true);pw.println(msg);catch(IOExceptionprintEr

16、ror)publicvoidrun()/建立讀寫流Stringmsg=null;InputStreamReaderisr=null;BufferedReaderbr=null;try(isr=newInputStreamReader(socket.getInputStream();br=newBufferedReader(isr);catch(IOExceptioninOutError)System.out.println("無法與客戶建立流!”);delSocket();return;dotrymsg=br.readLine();catch(IOExceptionreadError

17、)System.out.println("讀取流數(shù)據(jù)錯誤!”);delSocket();return;System.out.println(msg);msg=msgForward(msg);據(jù)if(msg.startsWith("#")=true)返回,則返回系統(tǒng)提示tryPrintWriterPrintWriter(socket.getOutputStream(),true);pw.println(msg);catch(IOExceptionprintError)while(true);publicclassChatServerpublicstaticvoidm

18、ain(Stringargs)ServerSocketserverSocket=null;Socketsocket=null;SocketThreadst;try/處理讀取的數(shù)/若有系統(tǒng)提示pw=new/監(jiān)聽端口8324serverSocket=newServerSocket(8324);System.out.println("服務器啟動成功,正在監(jiān)聽8324端口!”);catch(IOExceptione)System.out.println("不能使用端口8324,無法啟動服務器!”);return;while(true)trysocket=serverSocket.a

19、ccept();立Socketcatch(IOExceptione)System.out.println("不能建"+socket.getInetAddress().toString()+"/"+socket.getPort();st=newSocketThread(socket);System.out.println("建立"+socket.getInetAddress().toString()+"/"+socket.getPort();st.start();客戶端ChartClient主要代碼:packagec

20、h02;privatevoidinitSocket()trytransferSocket=newSocket("localhost”,8324);連接/獲得連接,并建立連接:/創(chuàng)建新線程連接:/開始新線程/對socket的初始化/與服務器建立ReceiveThreadrt=newReceiveThread(transferSocket,this);rt.start();/開啟新線程用于讀取數(shù)據(jù)流catch(IOExceptioncreateError)/出現(xiàn)錯誤則退出程序welcomeInfo.setText("無法連接服務器!”);trytransferSocket.cl

21、ose();welcomeInfo.setText("與服務器連接已經(jīng)斷開!”);System.exit(0);catch(IOExceptioncloseError)System.exit(0);始化try(socketWriter=newPrintWriter(transferSocket.getOutputStream(),true);catch(IOExceptionstreamError)(welcomeInfo.setText("流建立錯誤!”);try(transferSocket.close();welcomeInfo.setText("與服務器連

22、接已經(jīng)斷開!System.exit(0);catch(IOExceptioncloseError)System.exit(0);publicvoidaddNewMsg(Stringmsg)中追加數(shù)據(jù)chatRecord.append(msg+"rn");publicvoidsetWelcome(Stringmsg)welcomeInfo值welcomeInfo.setText(msg);publicvoidwindowIconified(WindowEvente)publicvoidwindowClosed(WindowEvente)publicvoidwindowDeac

23、tivated(WindowEvente)publicvoidwindowActivated(WindowEvente)publicvoidwindowClosing(WindowEvente)System.exit(0);publicvoidwindowDeiconified(WindowEvente)publicvoidwindowOpened(WindowEvente)publicvoidkeyPressed(KeyEvente)監(jiān)視switch(e.getKeyCode()caseKeyEvent.VK_ENTER:信息sendMsg();信息break;caseKeyEvent.VK

24、_CANCEL:/對輸出流的初!");/向chatRecord/改變/窗體關閉事件/對鍵盤事件的/回車鍵,就發(fā)送/向服務器發(fā)送/esc鍵則,friendList選中第0項friendList.select(0);transName.setText("發(fā)"+friendList.getSelectedItem().toString();break;default:publicvoidkeyTyped(KeyEvente)publicvoidkeyReleased(KeyEvente)publicvoiditemStateChanged(ItemEvente)frie

25、ndList選中項變化if(e.getSource().equals(friendList)transName值transName.setText("發(fā)"+friendList.getSelectedItem().toString();publicvoidtextValueChanged(TextEvente)字符多余100000if(chatRecord.getText().length()>100000)/監(jiān)視/改變送給:/若chatRecod/則清除部分歷chatRecord.setText(chatRecord.getText().substring(chat

26、Record.getText().indexOf("rn")+2);publicvoidactionPerformed(ActionEvente)sendButton則發(fā)送信息if(e.getSource()=sendButton)sendMsg();publicvoidsendMsg()/向服務器發(fā)送信息if(msgEditor!=null)if(friendList.getSelectedIndex()=0)/發(fā)送全體聊天信息socketWriter.println(msgEditor.getText();else/發(fā)送密語,并回socketWriter.println

27、("!”+friendList.getSelectedItem().toString()+"+msgEditor.getText();史記錄,防止占用過大內(nèi)存chatRecord.append(this.nick+""+friendList.getSelectedItem().toString()+"rnt"+msgEditor.getText()+"rn");else空,則系統(tǒng)提示chatRecord.append("!不能發(fā)送空消息rn");msgEditor.setText("&

28、quot;);置空classReceiveThreadextendsThread(類Socketsocket;socketClientwindowsclientwindow;ReceiveThread(Sockets,ClientWindowscw)(socket=s;clientWindow=cw;publicvoidrun()(Stringmsg=null;BufferedReaderbr=null;try(br=newInputStreamReader(socket.getInputStream();悄悄說/若發(fā)送信息為/將發(fā)送信息欄/監(jiān)視輸入流的/連接服務器的/主窗口/初始化/建立輸入

29、流BufferedReader(newcatch(IOExceptionReadError)(clientWindow.setWelcome("讀入流建立錯誤,程序關閉!”);try(socket.close();clientWindow.setWelcome("與服務器連接已經(jīng)斷開!”);System.exit(O);catch(IOExceptioncloseError)System.exit(O);while(true)/讀取數(shù)據(jù)流的信息try/獲得信息msg=br.readLine();catch(IOExceptione)(trysocket.close();cl

30、ientWindow.setWelcome("與服務器連接已經(jīng)斷開!System.exit(0);catch(IOExceptioncloseError)System.exit(0);msg=msgChange(msg);/信息if(msg!=null)clientWindow.addNewMsg(msg);/天新聊天內(nèi)容privateStringmsgChange(Stringmsg)if(msg.startsWith("#”)/戶的信息for(inti=1;i<clientWindow.friendList.getItemCount();i+)!");轉

31、變讀取到的向聊天窗口添刪除摸一個用if(clientWindow.friendList.getItem(i).toString().equals(msg.substring(3)clientWindow.friendList.remove(i);clientWindow.friendList.select(0);returnnull;elseif(msg.startsWith("#")/增加某一個用戶信息clientWindow.friendList.add(msg.substring(2);clientWindow.friendList.select(0);returnn

32、ull;elseif(msg.startsWith("#")/系統(tǒng)提示msg="!”+msg.substring(1);if(msg.startsWith("!您使用的昵稱:")clientWindow.nick=msg.substring(8);returnmsg;設計結果與分析(可以加頁):運行ChatServer服務端e:PRO<5RAlJCREATlGE200L«(e服務器啟動成功.正在監(jiān)聽昭宣端口!,運行ChatClient端的界面如下圖:當打開兩個或者多個客戶端時:實現(xiàn)多人會話或者一對一的會話,界面如下圖全沁日凝矢d

33、程序富慕添赫云噓他人獴想篷用的昵稱并發(fā)送!您使用的昵稱Ms如1wls002:fflsOOOSOOwlsOQSi122313wls002;/123143可族唳小程序好友列表:所有人wls002wls003!請植入您想猿用的昵稱并麥!您使用的昵禰:MM03wls002:wLsOCwlsOOSs1223110000好友;wIsOiwlsOi!諺值人霞想便用的昵稱并發(fā)送K!您使用的昵秘成網(wǎng)2wls002iwlsOOOOOOwls003:122313wls002;123143EePILOGRA*lJC-ltEAT-lGE200Lexe應務器啟動成功,正在監(jiān)聽的勇端口建接!/127.».0.1/53578ulstiHl建立注接;/127-0.0,1X53574uls602建立蓮接:Z127-B-0-1/5357Suls0312H313123143私聊即點擊想要私聊的用戶名即可;冬心職天小程序院壅入笈想便用的昵稱并發(fā)送:!您使用的昵felsOOlvlsOOS:tjlsOOO

溫馨提示

  • 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

提交評論