JAVA課程設計實驗報告 “聊天室”報告.doc_第1頁
JAVA課程設計實驗報告 “聊天室”報告.doc_第2頁
JAVA課程設計實驗報告 “聊天室”報告.doc_第3頁
JAVA課程設計實驗報告 “聊天室”報告.doc_第4頁
JAVA課程設計實驗報告 “聊天室”報告.doc_第5頁
已閱讀5頁,還剩24頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、中南大學面向對象課程設計題 目 “聊天室”課程設計(java語言) 學生姓名 學生學號 專業班級 指導教師 完成時間 目 錄第一章聊天室的描述-3.聊天室的設計要求-3.聊天室的基本功能-3.設計所用參考資料-6第二章聊天室的設計-6.聊天室的粗略設計分析-6.聊天室的具體設計分析-7第三章聊天室的實現-10.聊天室所使用的類及功能的實現-10第四章 聊天室的運行-30第五章 課程設計總結-3151開發中所遇到的問題-3152問題分析與解決方法-3253經驗與教訓-32第一章 聊天室的描述1 .聊天室的設要求當今社會,網絡技術越來越發展,可以說,二十一世紀就是網絡的世紀。網絡迅猛發展,勢不可擋

2、。為了實現資源共享,各式各樣的網站發展迅速,各種各樣的聊天工具不斷更新。某公司希望通過一個聊天工具加強員工和客戶之間的溝通和交流。所以制作一個聊天室勢在必行。為了實現一個更好的網絡交互平臺,各用戶之間能夠實時方便的傳遞信息,按照用戶對系統的要求不同,可以在聊天室里實現公共聊天,也可以邀幾個私交好友私聊,同時提供了兩個用戶之間能夠傳送文件。本系統是基于方便用戶聊天,傳遞信息,共享資源,所以系統的功能主要是從以上幾個模塊著手。本項目主要是利用java語言制作一個聊天室,采用的是客戶/服務器。 二層的c/s結構是指以單一的服務器和局域網為核心,能通過客戶端與用戶進行直接對話。主要有二大功能:一是它用

3、于檢查用戶從鍵盤等輸入的數據,顯示應用輸出的數據。為使用戶能直觀地進行操作,一般要使用圖形用戶接口(gui),操作簡單、易學易用。在變更用戶接口時,只需改寫顯示控制和數據檢查程序,而不影響其他。檢查的內容也只限于數據的形式和值的范圍,不包括有關業務本身的處理邏輯。典型的c/s結構有以下特點:1、服務器負責數據管理及程序處理。2、客戶機負責界面描述和界面顯示。3、客戶機向服務器提出處理要求。4、服務器響應將處理結果返回客戶機。5、使網絡數據流量最少。. 聊天室的基本功能1. 用戶注冊 2. 用戶登錄3. 在線用戶列表4. 用戶公聊5. 用戶私聊6. 好友信息維護7. 私聊信息的維護8. 登錄日志

4、的維護9. 用戶注銷擴展功能(如果完整實現一個擴展功能,適當加分):1 可以切換不同的界面風格2 用戶可以更改個人資料,尋找密碼3 表情聊天4 文件傳遞5 公聊信息的維護n 用戶注冊第一次用戶需要提供個人注冊信息,注冊的用戶名不能重復,密碼長度不能少于6位,個人信息必須提供完整,并且存儲在數據庫中。n 用戶登錄用戶輸入用戶名和密碼,提交給將服務器端的確認,根據從服務器中傳過來的確認信息,判斷用戶登錄的情況。并且把此次登錄的時間及登錄的ip記錄在服務器。如果用戶名和密碼正確的話,則登錄聊天室主界面;如果已經在線,則輸出已經在線;否則輸出用戶名和密碼錯誤,需要重新登錄或者注冊。n 在線用戶列表用戶

5、登錄之后,需要知道系統中,有哪些用戶在線,這樣可以方便用戶選擇與個別用戶私聊和傳送文件,也可以進行公聊。n 用戶公聊用戶輸入的用戶名和密碼都正確后,則進入聊天室。聊天主界面主要由四大版塊組成:公聊的聊天信息、在線用戶列表、好友列表,系統消息和聊天的一些操作。聊天信息版塊設計思想:一種就是將客戶的聊天信息寫入數據庫,一種是將其寫入向量中。在本次項目中,要求學員把客戶的聊天信息寫入數據庫中。n 用戶私聊如果兩個人聊的話題比較隱秘,不想被其他人看到,就要使用私聊。在這里,如果說話對象是所有人的話,不能選擇私聊;從當前好友列表中選擇了一個用戶之后,則私聊對話框應該彈出來。n 文件傳遞兩個用戶在聊天過程

6、中,可能需要相互間傳送文件。象用戶聊天信息和在線用戶這樣一些信息都是保存在服務器端,然后每個客戶讀取服務器端向量中的內容,此時服務器與客戶端的聯系是一對多的,而傳送文件是一對一的。所以直接傳送,不需要經過服務器端保存。n 好友信息維護在聊天過程中,用戶可以選擇聊天室的用戶加為自己的好友。對于加為好友的用戶,可以選擇與其進行私聊。私聊的信息用文件保存在客戶端。該模塊應該包括: 添加好友 刪除好友n 私聊信息的維護如果兩個人聊的話題比較隱秘,不想被其他人看到,就要使用私聊。而且只有好友之間才能進行私聊。要與某用戶進行私聊,必須把對方加為好友。與好友之間的聊天信息,應該以文件的方式存儲在客戶端,不顯

7、示在公聊的版面上。n 登錄日志的維護用戶每次登錄之后,都記錄下用戶的登錄信息,如登錄的時間日期,登陸的ip等。方便用戶發現是否號碼被盜用。n 用戶注銷用戶可以注銷其身份,對于注銷后的用戶必須在數據庫中刪除其相應的信息。1.3設計所用參考資料java編程思想(第四版)(機械工業出版社)java程序設計與問題解決(人民郵電出版社)java語言最新使用案例教程(清華大學出版社)java2應用開發指南(第二版)(電子工業出版社)jdkapi1.5中文版網上查閱資料第二章 聊天室的設計2 . 1聊天室的粗略設計分析聊天系統平臺應有兩個部分組成:服務端和客戶端。服務端主要完成用戶信息的存儲、客戶端命令的接

8、受與響應以及發送系統消息、信息轉發、踢人等服務端應有的功能。客戶端主要完成聊天信息的發送與接受、登錄、注銷等功能。此c/s系統使用的是tcp/ip協議,應用了如下通訊模式:2 .聊天室的具體設計分析根據課程設計的要求及項目的需求分析,聊天程序應實現以下幾項功能:登錄、注冊、公聊、私聊、系統消息、踢人、文件傳送、注銷等。當客戶程序需要與服務器程序通訊的時候,客戶程序在客戶機創建一個socket對象。創建了一個socket對象后,那么它可以通過調用socket的getinputstream()方法從服務程序獲得輸入流讀傳送來的信息,也可以通過調用socket的getoutputstream()方法

9、獲得輸出流來發送消息。由于client使用了流套接字,所以服務程序也要使用流套接字。這就要創建一個serversocket對象,接下來服務程序進入無限循環之中,無限循環從調用serversocket的accept()方法開始,在調用開始后accept()方法將導致調用線程阻塞直到連接建立。在建立連接后accept()返回一個最近創建的socket對象,該socket對象綁定了客戶程序的ip地址或端口號。由于存在單個服務程序與多個客戶程序通訊的可能,服務程序循環檢測是否有客戶連接到服務器上,如果有,則創建一個線程來服務這個客戶,以此完成對客戶端的監聽。具體流程如下圖所示: 未注冊用戶:開始結束讀

10、取服務器ip接收用戶信息判斷信息顯示注冊界面顯示主界面noyes寫入服務器數據庫 主界面:公聊私聊注銷文件傳輸用戶列表主界面 已注冊用戶:讀取服務器ip接收用戶名及密碼判斷密碼顯示登錄界面顯示主界面noyes開始結束第三章聊天室的實現.聊天室所使用的類及功能的實現客戶端:序列化后用來傳遞用戶信息的類:class user implements serializablestring name;/用戶名string password;/密碼string email;/e-mailstring age;/年齡string sex;/性別string message;/要傳遞的信息 string co

11、mmand;/命令標識vector vectoruserlist;/在線用戶列表這個經過序列化后可以用objectoutputstream和objectinputstream流來傳遞信息,而不用一行一行的讀取信息。登錄界面類:public class login extends jframe implements actionlistener./界面組件及其他變量聲明public login() ./界面組件初始化try fileinputstream fsread=new fileinputstream(c:serveripaddress.txt); inputstreamreader in

12、putread=new inputstreamreader(fsread); bufferedreader bfread=new bufferedreader(inputread); serveripaddress=bfread.readline(); fsread.close(); toserver=new socket(serveripaddress,1207); catch(ioexception e) /服務器ip地址讀取及連接的建立public void actionperformed(actionevent e) if(e.getsource()=button1) dispose(

13、); new checkin(toserver); if(e.getactioncommand().equals(登陸) if(textfield1.gettext().equals() joptionpane.showmessagedialog(null,用戶名不能為空!); else try user user=new user(); user userlogin=new user(); user.name=textfield1.gettext(); user.password=textfield2.gettext(); user.command=enter; streamtoserver

14、=new objectoutputstream(toserver.getoutputstream(); streamfromserver=new objectinputstream(toserver.getinputstream(); streamtoserver.writeobject(user)user); streamtoserver.flush(); userlogin=(user)streamfromserver.readobject(); if(userlogin.command.equals(enter) new mainframe(toserver,user.name); di

15、spose(); else joptionpane.showmessagedialog(null,用戶名或密碼錯誤!); textfield1.settext(); textfield2.settext(); catch(exception ee)joptionpane.showmessagedialog(null,連接錯誤!); try streamtoserver.close(); streamfromserver.close(); catch(exception ee) /按鈕動作及對服務器命令的響應 public static void main(string args) jframe

16、.setdefaultlookandfeeldecorated(true); font font =new font(jframe,font.plain,14); enumeration keys=uimanager.getlookandfeeldefaults().keys(); while(keys.hasmoreelements() object key=keys.nextelement(); if(uimanager.get(key) instanceof font )uimanager.put(key,font); new login(); /main方法注冊界面類:public c

17、lass checkin extends jframe implements actionlistener. /界面組件及其他變量聲明public checkin(socket toserver) . /界面組件初始化try toserver=toserver; streamtoserver = new objectoutputstream(toserver.getoutputstream(); streamfromserver=new objectinputstream(toserver.getinputstream();catch(exception e) this.setdefaultc

18、loseoperation(jframe.dispose_on_close); /將login中建立的socket做參數傳遞給checkinpublic void actionperformed(actionevent e) if(e.getactioncommand().equals(注冊) for(int t=0;t=0;) if(textfield1.gettext().equals() joptionpane.showmessagedialog(null,用戶名不能為空!); t=1; else if(textfield3.gettext().equals(textfield2.get

19、text()=false) joptionpane.showmessagedialog(null,密碼不一致!); t=1; else user user=new user(); user.name=textfield1.gettext(); user.password=textfield2.gettext(); user.age=textfield4.gettext(); user.email=textfield5.gettext(); user.sex=(string)checkboxgroup1.getselectedcheckbox().getlabel(); user.command

20、=login; try streamtoserver.writeobject(user)user); fromservermessage=(user)streamfromserver.readobject(); catch(exception ee)joptionpane.showmessagedialog(null,數據發送錯誤!); if(fromservermessage.command.equals(login) dispose(); new mainframe(toserver,user.name); if(fromservermessage.command.equals(repea

21、t) joptionpane.showmessagedialog(null,用戶名已存在!); t=1; if(e.getactioncommand().equals(取消) dispose(); new login(); /按鈕動作的添加及對服務器的信息傳/遞和響應主界面類:public class mainframe extends jframe implements actionlistener,runnable . /界面組件及其他變量聲明public mainframe(socket toserver,string name) mainframe1(toserver,name); /

22、構造函數,其中toserver、name為參數 public void mainframe1(socket toserver,string name) . try toserver=toserver; streamtoserver = new objectoutputstream(toserver.getoutputstream(); streamfromserver = new objectinputstream(toserver.getinputstream(); fromservermessage=(user)streamfromserver.readobject(); streamto

23、server.flush(); vectoruserlist1=(vector)fromservermessage.vectoruserlist; vectoruserlist.setlistdata(vectoruserlist1); catch(exception ee)joptionpane.showmessagedialog(null,3); thread thread = new thread(this); thread.start(); /建立連接并啟動監聽線程public void run() try for(int t=1;) user commandfromserver=(u

24、ser)streamfromserver.readobject(); string command=commandfromserver.command; if(command.equals(publicchat) textarea2.append(commandfromserver.name+對大家說:+commandfromserver.message); if(command.equals(privatechat) textarea2.append(commandfromserver.name+對你說:+commandfromserver.message); if(command.equa

25、ls(add)|command.equals(lessen) textarea2.append(commandfromserver.name+對大家說:大家好!我來了); vectoruserlist.setlistdata(vectoruserlist1); if(command.equals(kick) lessen(); if(command.equals(systemmessage) textarea2.append(系統消息:+commandfromserver.message); joptionpane.showmessagedialog(null,用戶名不能為空!);t=0; c

26、ontinue; catch(exception e) /監聽線程對服務器信息的處理及響應 public void actionperformed(actionevent e) if(e.getactioncommand().equals(公聊) sendpublicmessage(); if(e.getsource()=button2) sendpravitemessage(); if(e.getactioncommand().equals(注銷) lessen(); dispose(); try streamtoserver.close(); streamfromserver.close(

27、); toserver.close(); catch(exception ee) new login(); /對按鈕動作的處理及響應 public void sendpublicmessage() /發送公聊信息 public void sendpravitemessage() /發送私聊信息 public void lessen() /注銷事件服務端:服務端序列化信息類:class user implements serializablestring name;/用戶名string password;/密碼string email;/e-mailstring age;/年齡string se

28、x;/性別string message;/要傳遞的信息 string command;/命令標識vector vectoruserlist;/在線用戶列表服務器界面類:public class server extends jframe . . /組件及變量的定義public server() initcomponents(); /構造方法,初始化組件private void initcomponents() /組件初始化 try /建立inetaddress對象 inetaddress intel=inetaddress.getlocalhost(); string serip=intel.

29、gethostaddress(); jlabel3.settext(服務器:+serip); catch(unknownhostexception e2) system.out.println(發生錯誤!); jpanel1.add(jlabel3); jlabel5.settext( 0個客戶); jpanel1.add(jlabel5); jlist1.setmodel(new abstractlistmodel() string strings = ; public int getsize() return strings.length; public object getelement

30、at(int i) return stringsi; ); jlist1.setfont(new font(dialog,font.bold | font.italic, 16); jlist1.setselectionmode(listselectionmodel.single_selection); jlist1.addmouselistener(new mouseadapter() public void mousepressed(mouseevent evt) if (evt.getclickcount()=1) blacklist=(string)jlist1.getselected

31、value(); ); jscrollpane1.setviewportview(jlist1); jpanel1.add(jscrollpane1); jpanel1.add(jlabel1); getcontentpane().add(jpanel1); commandmenu.settext(選項); msgmenuitem.settext(系統消息); msgmenuitem.setborder(null); msgmenuitem.addactionlistener(new actionlistener() public void actionperformed(actioneven

32、t evt) msgmenuitemactionperformed(evt); ); commandmenu.add(msgmenuitem); kickmenuitem.settext(踢人); kickmenuitem.setborder(null); kickmenuitem.addactionlistener(new actionlistener() public void actionperformed(actionevent evt) kickmenuitemactionperformed(evt); ); commandmenu.add(kickmenuitem); menuba

33、r.add(commandmenu); setjmenubar(menubar); startserver(); pack();private void msgmenuitemactionperformed(actionevent evt) /系統消息事件try user tousermessage=new user(); string mesage=joptionpane.showinputdialog(null,請輸入內容:,系統消息,joptionpane.information_message); tousermessage.message=系統消息:+mesage+n; touser

34、message.command=systemmessage; for(int i=0;iserver.vectoruserlist.size();i+) objectoutputstream streamtouser=(objectoutputstream)server.vectorstreamtouser.elementat(i);joptionpane.showmessagedialog(null,用戶名不能為空!4); streamtouser.writeobject(user)tousermessage);joptionpane.showmessagedialog(null,用戶名不能

35、為空!5); streamtouser.flush(); catch(ioexception e) private void kickmenuitemactionperformed(actionevent evt) /踢人事件object obj=evt.getsource(); try if(obj=kickmenuitem) blacklist=joptionpane.showinputdialog(null,請輸入用戶名:,系統消息,joptionpane.information_message); user tousermessage=new user(); for(int i=0;i

36、server.vectoruserlist.size();i+) if(blacklist.equals(server.vectoruserlist.elementat(i) tousermessage.command=kick; tousermessage.message=系統消息:對不起!你已被踢出!n; else joptionpane.showinputdialog(null,無此用戶!); objectoutputstream streamtouser=(objectoutputstream)server.vectorstreamtouser.elementat(i);joption

37、pane.showmessagedialog(null,用戶名不能為空!1); streamtouser.writeobject(user)tousermessage);joptionpane.showmessagedialog(null,用戶名不能為空!2); streamtouser.flush();joptionpane.showmessagedialog(null,用戶名不能為空!3); server.vectorstreamtouser.removeelementat(server.vectoruserlist.indexof(blacklist); server.vectoruse

38、rlist.removeelement(blacklist); jlabel5.settext(共有:+server.vectoruserlist.size()+個客戶在線); blacklist=; catch(ioexception e)private void stopserver() /關閉服務器的服務string message=服務器即將關閉!;try user tousermessage=new user(); tousermessage.command=systemmessage; tousermessage.message=message; for(int i=0;iserv

39、er.vectoruserlist.size();i+) objectoutputstream streamtouser=(objectoutputstream)server.vectorstreamtouser.elementat(i); streamtouser.writeobject(user)tousermessage); streamtouser.flush(); catch(ioexception e) try thread.sleep(5000); catch(interruptedexception e)system.exit(0);private void startserv

40、er() new appserver(); private void exitform(windowevent evt) stopserver(); system.exit(0);public static void main(string args) new server().show(); class appserver extends thread /啟動服務器服務,用于監聽客/戶端的連接及命令public appserver()try serversocket = new serversocket(1207); inetaddress intel=inetaddress.getloca

41、lhost(); string serip=intel.gethostaddress(); system.out.println(服務器:+serip); catch(ioexception e)system.out.println(could not start server+.+e);system.out.println(服務端已啟動.);this.start();public void run()trywhile(true)socket usersocket = serversocket.accept();connection con = new connection(usersocke

42、t);catch(ioexception e)system.out.println(not listener+.+e); 建立連接類:class connection extends thread user fromusermessage=new user(); user tousermessage=new user(); socket netuser; objectinputstream streamfromuser; objectoutputstream streamtouser; boolean existname,existpassword; string onlinenumber=immovability;public connection(socket usersocket) /建立連接net

溫馨提示

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

評論

0/150

提交評論