版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
JAVA語言課程設(shè)計(jì)報(bào)告題目:Java聊天室設(shè)計(jì)者:郭旭專業(yè)班級:學(xué)號:指導(dǎo)教師:2010年12月30日1.系統(tǒng)需求分析1.1系統(tǒng)名稱:Java聊天室1.2系統(tǒng)介紹 該系統(tǒng)采用了線程及socket通信技術(shù),使用了Java的圖像化界面工具swing,在eclipse開發(fā)工具中進(jìn)行開發(fā)。該系統(tǒng)的開發(fā)時(shí)給予C/S的架構(gòu),由客戶端與服務(wù)器端進(jìn)行通信,并且在服務(wù)器端進(jìn)行邏輯判斷和處理。該系統(tǒng)主要包括登錄、注冊、添加和刪除好友、聊天、查找好友、文件傳輸?shù)裙δ苣K。 主要用到的技術(shù):Java的圖像化開發(fā)Swing,Socket進(jìn)程通信,Java線程技術(shù),Java的輸入輸出流IO等。開發(fā)使用的工具:Eclipse中安裝swing插件,數(shù)據(jù)庫使用了MySql,并且使用了Navicat實(shí)現(xiàn)數(shù)據(jù)庫的可視化操作。運(yùn)行環(huán)境:該系統(tǒng)以jdk1.6.0_10版本JDK為Java運(yùn)行環(huán)境。1.3開發(fā)背景在即時(shí)聊天工具的出現(xiàn)之前,e-mail一直做為傳統(tǒng)的信息交流工具,也是因?yàn)閑-mail發(fā)送和接受消息時(shí)間相對滯后的緣故,不能滿足人們迅速獲取信息的要求。即時(shí)通訊工具的產(chǎn)生,為大眾提供了一種嶄新的綜合的信息交流平臺。即時(shí)通訊不同于傳統(tǒng)的通訊工具e-mail,在于它的交流是實(shí)時(shí)的,使得人們交流更加便捷和快速,滿足了人們迅速獲取信息的需求,所以深受大眾的喜愛,有著很好的發(fā)展前景。其中聊天軟件就是即時(shí)通訊的具體實(shí)現(xiàn)。本系統(tǒng)是一款普通的網(wǎng)絡(luò)聊天工具,該軟件主要有一對一聊天,一對多聊天,文件的傳輸,信息的保存等功能。系統(tǒng)是基于TCP/IP的網(wǎng)絡(luò)協(xié)議,使用JavaSocket進(jìn)行通信,用現(xiàn)在最流行的網(wǎng)絡(luò)開發(fā)語言Java進(jìn)行編寫實(shí)現(xiàn)。2.系統(tǒng)總體設(shè)計(jì)總體結(jié)構(gòu):使用了典型的C/S架構(gòu),如下所示:服務(wù)端服務(wù)端客戶端客戶端3.系統(tǒng)詳細(xì)設(shè)計(jì)3.1數(shù)據(jù)庫設(shè)計(jì):用戶表User:列明類型長度是否為主鍵描述Usernamevarchar32是用戶名Nicknamevarchar32昵稱Passwordvarchar32密碼Genderchar1性別:缺省0男Ageint4年齡Cityvarchar32城市Onlinechar1是否在線:缺省0離線好友表Friend:列明類型長度是否為主鍵描述Idint8是標(biāo)識idusernamevarchar32外鍵用戶名Friendnamevarchar32外鍵用戶名(好友)3.2頁面設(shè)計(jì)3.2.1:登錄頁面:用戶在登錄頁面,可以輸入用戶名和密碼進(jìn)入系統(tǒng),當(dāng)然,若用戶輸入的用戶名和密碼不正確,系統(tǒng)會給出提示,新用戶也可以通過該頁面鏈接到注冊頁面進(jìn)行注冊,然后回到該頁面進(jìn)行登錄3.2.2:注冊頁面:用戶在登錄頁面可以直接登錄系統(tǒng),若是新用戶沒有登錄信息,則會被引導(dǎo)到該頁面進(jìn)行注冊,注冊新用戶時(shí),需要安裝一定的規(guī)則輸入用戶信息,有必填項(xiàng),以及相應(yīng)的驗(yàn)證。3.2.3,登錄成功后的用戶主頁面:用戶登錄成功之后,在用戶的主界面會顯示出用戶的好友列表等信息,同時(shí)也會顯示出該用戶的好友是否在線等信息。右鍵單擊用戶:搜索用戶,并可以通過該頁面添加好友,頁面如下:查看資料:點(diǎn)擊聊天室,可以實(shí)現(xiàn)群聊:3.2.4、服務(wù)器端代碼:Server.javapackagemainserver;importjava.io.IOException;import.ServerSocket;import.Socket;importjava.util.HashMap;importjava.util.Map;/***服務(wù)器主線程,負(fù)責(zé)接收客戶端連接,并開啟相應(yīng)線程響應(yīng)**服務(wù)器的事務(wù):0,主線程,負(fù)責(zé)接收客戶端連接,并開啟相應(yīng)線程響應(yīng)登陸用戶請求**1,定時(shí)檢測連接狀態(tài),并修改相應(yīng)的用戶狀態(tài),如果連接關(guān)閉(非正常關(guān)閉,例如網(wǎng)絡(luò)故障導(dǎo)致;而登陸用戶正常退出由子線程負(fù)責(zé)處理狀態(tài)的修改。),則*將相應(yīng)用戶的狀態(tài)設(shè)為未登陸,以保證同一時(shí)刻一個(gè)用戶只能登陸一次。PS:由于主線程無法很好的監(jiān)控各套接字的狀態(tài),因此1該為在子線程中處理**@authorAdministrator**/publicclassServer{ /** *服務(wù)器狀態(tài):true:開啟false:關(guān)閉 */ privatebooleanrunning; privatestaticfinalintSERVER_PORT=9999; publicstaticMap<String,ServiceHandler>connections=newHashMap<String,ServiceHandler>(); ServerSocketserverSocket; /** *服務(wù)器參數(shù)初始化 */ privatevoidinit(){ } publicServer(){ } /** *服務(wù)器開啟 */ publicvoidstart(){ init(); try{ serverSocket=newServerSocket(SERVER_PORT); }catch(IOExceptione){ System.out.println("ServerSocket建立失敗"); e.printStackTrace(); return; } startServer(); while(running){ Socketsocket=null; try{ System.out.println("Listenning......"); socket=serverSocket.accept(); System.out.println(socket.getRemoteSocketAddress()); newServiceHandler(socket).start(); }catch(IOExceptione){ e.printStackTrace(); } } } publicvoidcloseServer(){ running=false; System.exit(0); } privatevoidstartServer(){ running=true; } publicbooleanisRunning(){ returnrunning; }}ServiceHandler.javapackagemainserver;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStream;import.Socket;importjava.util.Arrays;importjava.util.Iterator;importjava.util.List;importmessages.AddFriend;importmessages.DelFriend;importmessages.Friends;importmessages.Info;importmessages.Login;importmessages.MessageEnd;importmessages.Regist;importmessages.SearchFriend;importmessages.Send;importmessages.Update;importdao.Friend;importdao.FriendDAO;importdao.User;importdao.UserDAO;/***處理單個(gè)客戶端請求的線程如果socket讀取或發(fā)送數(shù)據(jù)失敗,按用戶退出登陸處理**@authorAdministrator**/publicclassServiceHandlerextendsThread{ privateSocketsocket; privateBufferedReaderin; privateOutputStreamout; privatebooleanisOK; privateStringcurrentUser; publicServiceHandler(Socketsocket){ this.socket=socket; isOK=true; try{ out=socket.getOutputStream(); }catch(IOExceptione){ e.printStackTrace(); isOK=false; return; } try{ in=newBufferedReader(newInputStreamReader(socket .getInputStream())); }catch(IOExceptione){ e.printStackTrace(); isOK=false; } } /** *向客戶端發(fā)送數(shù)據(jù)如果發(fā)送失敗,修改用戶狀態(tài)為未登錄 * *@parammsg */ publicsynchronizedvoidsend(Stringmsg){ if(!isOK){ return; } try{ System.out.println("send:"+msg); //ShowErrorMsg.display(msg); out.write(msg.getBytes()); out.flush(); }catch(IOExceptione){ userQuit(); } } privatesynchronizedStringread(){ Stringtmp=null; try{ tmp=in.readLine(); }catch(IOExceptione){ e.printStackTrace(); userQuit(); } if(tmp!=null){ returntmp; } returnnull; } /** *發(fā)送或接收數(shù)據(jù)失敗,修改用戶狀態(tài) * *@paramb */ privatevoidchangeUserState(booleanb){ //設(shè)定為上線 if(b){ synchronized(Server.connections){ Server.connections.put(this.currentUser,this); } }else{ synchronized(Server.connections){ Server.connections.remove(this.currentUser); } } newUserDAO().setOnline(this.currentUser,b); } /** *如果讀取失敗,修改用戶狀態(tài)為未登錄從客戶端讀取數(shù)據(jù) * *@paramsocket */ privateStringreceiveTitle(){ StringBufferbuffer=newStringBuffer(); if(!isOK){ returnbuffer.toString(); } Stringtmp=null; try{ if((tmp=in.readLine())!=null){ buffer.append(tmp); } }catch(IOExceptione){ userQuit(); returnbuffer.toString(); } returnbuffer.toString(); } privatevoiduserQuit(){ System.out.println("失去一個(gè)連接。"); isOK=false; changeUserState(false); } publicvoidrun(){ while(isOK){ Stringtitle=this.receiveTitle(); if(title!=null&&title.length()!=0){ if(title.equals(Login.title)){ System.out.println("get:"+Login.title); System.out.println(this.read()); loginHandle(); }elseif(title.equals(AddFriend.title)){ this.read(); addFriendHandler(); }elseif(title.equals(Friends.title)){ this.read(); friendsHandler(); }elseif(title.equals(Regist.title)){ this.read(); registHandler(); }elseif(title.equals(SearchFriend.title)){ this.read(); searchFriendHandler(); }elseif(title.equals(Send.title)){ intid=Integer.parseInt(this.read()); sendHandler(id); }elseif(title.equals(Update.title)){ this.read(); updateHandler(); }elseif(title.equals(Info.title)){ this.read(); infoHandler(); }elseif(title.equals(DelFriend.title)){ this.read(); delFriendHandler(); }else{ System.out.println("nothingcatched"); } } } try{ socket.close(); }catch(IOExceptione){ e.printStackTrace(); } } privatevoiddelFriendHandler(){ Stringuser=this.read(); this.read(); newFriendDAO().delete(user,this.currentUser); this.send("success"+MessageEnd.end+DelFriend.title+MessageEnd.end +MessageEnd.end); } privatevoidinfoHandler(){ Stringusername=this.read(); this.read(); Userresult=newUserDAO().getUserInfo(username); StringBufferreply=newStringBuffer(); reply.append("success"+MessageEnd.end+Info.title+MessageEnd.end); reply.append(result.getAge()+MessageEnd.end+result.getCity() +MessageEnd.end); reply.append(result.getGender()+MessageEnd.end+result.getNickName() +MessageEnd.end); reply.append(result.getPassWord()+MessageEnd.end +result.getUserName()+MessageEnd.end); reply.append(MessageEnd.end); this.send(reply.toString()); } privatevoidupdateHandler(){ Useruser=newUser(); user.setUserName(this.currentUser); user.setNickName(this.read()); user.setPassWord(this.read()); user.setCity(this.read()); user.setAge(Integer.parseInt(this.read())); user.setGender(this.read().charAt(0)); newUserDAO().update(user); this.send("success"+MessageEnd.end+Update.title+MessageEnd.end +MessageEnd.end); } privatevoidsendHandler(intid){ Stringtarget=this.read(); Stringcontent=this.read(); this.read(); if(Server.connections.containsKey(target)){ ServiceHandlerhand=Server.connections.get(target); System.out.println("connection:"+target+"got"); if(hand!=null){ System.out.println("connection:"+target+"gotinside"); hand.send("success"+MessageEnd.end+"send"+MessageEnd.end +(id)+MessageEnd.end+this.currentUser +MessageEnd.end+content.replace('\n','#') +MessageEnd.end+MessageEnd.end); } } } privatevoidsearchFriendHandler(){ Stringname=this.read(); Stringvalue=this.read(); this.read(); StringBufferbuffer=newStringBuffer(); buffer.append("success"+MessageEnd.end); buffer.append(SearchFriend.title+MessageEnd.end); List<String>result=newUserDAO().getUserFullName(value); for(intindex=0;index<result.size();index++){ buffer.append(result.get(index)+MessageEnd.end); } buffer.append(MessageEnd.end); this.send(buffer.toString()); } privatevoidregistHandler(){ Useruser=newUser(); user.setUserName(this.read()); System.out.println(user.getUserName()+"read"); user.setPassWord(this.read()); System.out.println(user.getPassWord()+"read"); user.setNickName(this.read()); System.out.println(user.getNickName()+"read"); user.setCity(this.read()); System.out.println(user.getCity()+"read"); user.setGender(this.read().charAt(0)); user.setAge(Integer.parseInt(this.read())); this.read(); user.setOnline(false); if(newUserDAO().insertUser(user)){ this.send("success"+MessageEnd.end+Regist.title +MessageEnd.end+MessageEnd.end); }else{ this.send("fail"+MessageEnd.end+Regist.title+MessageEnd.end +MessageEnd.end); } } privatevoidfriendsHandler(){ Stringrequest=this.read(); this.read(); List<User>result=newUserDAO().getFriends(this.currentUser); System.out.println("liststarttosend"); StringBuffersendData=newStringBuffer(); sendData.append("success"+MessageEnd.end); sendData.append(Friends.title+MessageEnd.end); //this.send("success"+MessageEnd.end+Friends.title+MessageEnd.end); Iterator<User>iterator=result.iterator(); System.out.println("send:"+Arrays.toString(result.toArray())); while(iterator.hasNext()){ Useruser=iterator.next(); sendData.append(user.getUserName()+"" +(user.isOnline()?"在線":"離線")+MessageEnd.end); //this.send(user.getUserName()+"" //+(user.isOnline()?"在線":"離線")+MessageEnd.end); } if(result.size()==0){ sendData.append("NoFriend"+MessageEnd.end); } sendData.append(MessageEnd.end); this.send(sendData.toString()); //this.send(MessageEnd.end); System.out.println("listsendover"); } privatevoidaddFriendHandler(){ Stringf=this.read(); this.read(); Friendfriend=newFriend(); friend.setFriendName(f); friend.setUserName(this.currentUser); newFriendDAO().inser(friend.getFriendName(),friend.getUserName()); this.send("success"+MessageEnd.end+AddFriend.title+MessageEnd.end +MessageEnd.end); //this.send(AddFriend.title+MessageEnd.end+MessageE
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度消防設(shè)備檢測與認(rèn)證合同范本
- 游戲開發(fā)及發(fā)行合作合同
- 2025版預(yù)制構(gòu)件與鋼筋材料集成交易合同示范2篇
- 東電氣網(wǎng)絡(luò)浪涌保護(hù)器安全操作規(guī)程
- 2025年度模具租賃及生產(chǎn)管理服務(wù)合同范本3篇
- 金鑰匙學(xué)習(xí)方法專題講座策劃方案范文
- 二零二五年度IT基礎(chǔ)設(shè)施運(yùn)維技術(shù)支持合同2篇
- 2024年版汽車租賃協(xié)議樣式版B版
- 大帶攪拌絞肉機(jī)安全操作規(guī)程
- 2024石粉購銷合同范本
- 工程力學(xué)智慧樹知到期末考試答案2024年
- 七年級生物試卷分析3篇
- 會計(jì)師事務(wù)所業(yè)務(wù)培訓(xùn)制度
- CMM2-18錨桿機(jī)(新)說明書
- 12噸汽車起重機(jī)基本技術(shù)規(guī)格資料
- WEB開發(fā)基礎(chǔ)-2021秋本-計(jì)算機(jī)科學(xué)與技術(shù)本復(fù)習(xí)資料-國家開放大學(xué)2022年1月期末考試復(fù)習(xí)資料
- 安徽省政協(xié)機(jī)關(guān)文件材料歸檔范圍
- 本質(zhì)安全理論綜述研究
- 代建項(xiàng)目管理工作大綱
- QGDW 11860-2018 抽水蓄能電站項(xiàng)目后評價(jià)技術(shù)標(biāo)準(zhǔn)
- 《小兒推拿》PPT課件(完整版)
評論
0/150
提交評論