版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
JAVA語言課程設計報告題目:Java聊天室設計者:郭旭專業(yè)班級:學號:指導教師:2010年12月30日1.系統(tǒng)需求分析1.1系統(tǒng)名稱:Java聊天室1.2系統(tǒng)介紹 該系統(tǒng)采用了線程及socket通信技術,使用了Java的圖像化界面工具swing,在eclipse開發(fā)工具中進行開發(fā)。該系統(tǒng)的開發(fā)時給予C/S的架構,由客戶端與服務器端進行通信,并且在服務器端進行邏輯判斷和處理。該系統(tǒng)主要包括登錄、注冊、添加和刪除好友、聊天、查找好友、文件傳輸?shù)裙δ苣K。 主要用到的技術:Java的圖像化開發(fā)Swing,Socket進程通信,Java線程技術,Java的輸入輸出流IO等。開發(fā)使用的工具:Eclipse中安裝swing插件,數(shù)據(jù)庫使用了MySql,并且使用了Navicat實現(xiàn)數(shù)據(jù)庫的可視化操作。運行環(huán)境:該系統(tǒng)以jdk1.6.0_10版本JDK為Java運行環(huán)境。1.3開發(fā)背景在即時聊天工具的出現(xiàn)之前,e-mail一直做為傳統(tǒng)的信息交流工具,也是因為e-mail發(fā)送和接受消息時間相對滯后的緣故,不能滿足人們迅速獲取信息的要求。即時通訊工具的產(chǎn)生,為大眾提供了一種嶄新的綜合的信息交流平臺。即時通訊不同于傳統(tǒng)的通訊工具e-mail,在于它的交流是實時的,使得人們交流更加便捷和快速,滿足了人們迅速獲取信息的需求,所以深受大眾的喜愛,有著很好的發(fā)展前景。其中聊天軟件就是即時通訊的具體實現(xiàn)。本系統(tǒng)是一款普通的網(wǎng)絡聊天工具,該軟件主要有一對一聊天,一對多聊天,文件的傳輸,信息的保存等功能。系統(tǒng)是基于TCP/IP的網(wǎng)絡協(xié)議,使用JavaSocket進行通信,用現(xiàn)在最流行的網(wǎng)絡開發(fā)語言Java進行編寫實現(xiàn)。2.系統(tǒng)總體設計總體結構:使用了典型的C/S架構,如下所示:服務端服務端客戶端客戶端3.系統(tǒng)詳細設計3.1數(shù)據(jù)庫設計:用戶表User:列明類型長度是否為主鍵描述Usernamevarchar32是用戶名Nicknamevarchar32昵稱Passwordvarchar32密碼Genderchar1性別:缺省0男Ageint4年齡Cityvarchar32城市Onlinechar1是否在線:缺省0離線好友表Friend:列明類型長度是否為主鍵描述Idint8是標識idusernamevarchar32外鍵用戶名Friendnamevarchar32外鍵用戶名(好友)3.2頁面設計3.2.1:登錄頁面:用戶在登錄頁面,可以輸入用戶名和密碼進入系統(tǒng),當然,若用戶輸入的用戶名和密碼不正確,系統(tǒng)會給出提示,新用戶也可以通過該頁面鏈接到注冊頁面進行注冊,然后回到該頁面進行登錄3.2.2:注冊頁面:用戶在登錄頁面可以直接登錄系統(tǒng),若是新用戶沒有登錄信息,則會被引導到該頁面進行注冊,注冊新用戶時,需要安裝一定的規(guī)則輸入用戶信息,有必填項,以及相應的驗證。3.2.3,登錄成功后的用戶主頁面:用戶登錄成功之后,在用戶的主界面會顯示出用戶的好友列表等信息,同時也會顯示出該用戶的好友是否在線等信息。右鍵單擊用戶:搜索用戶,并可以通過該頁面添加好友,頁面如下:查看資料:點擊聊天室,可以實現(xiàn)群聊:3.2.4、服務器端代碼:Server.javapackagemainserver;importjava.io.IOException;import.ServerSocket;import.Socket;importjava.util.HashMap;importjava.util.Map;/***服務器主線程,負責接收客戶端連接,并開啟相應線程響應**服務器的事務:0,主線程,負責接收客戶端連接,并開啟相應線程響應登陸用戶請求**1,定時檢測連接狀態(tài),并修改相應的用戶狀態(tài),如果連接關閉(非正常關閉,例如網(wǎng)絡故障導致;而登陸用戶正常退出由子線程負責處理狀態(tài)的修改。),則*將相應用戶的狀態(tài)設為未登陸,以保證同一時刻一個用戶只能登陸一次。PS:由于主線程無法很好的監(jiān)控各套接字的狀態(tài),因此1該為在子線程中處理**@authorAdministrator**/publicclassServer{ /** *服務器狀態(tài):true:開啟false:關閉 */ privatebooleanrunning; privatestaticfinalintSERVER_PORT=9999; publicstaticMap<String,ServiceHandler>connections=newHashMap<String,ServiceHandler>(); ServerSocketserverSocket; /** *服務器參數(shù)初始化 */ privatevoidinit(){ } publicServer(){ } /** *服務器開啟 */ 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;/***處理單個客戶端請求的線程如果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){ //設定為上線 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("失去一個連接。"); 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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 常用不銹鋼買賣協(xié)議
- 石子采買合同樣本
- 精準把握項目咨詢服務合同
- 二手房屋買賣合同條款
- 建筑業(yè)采購合同印花稅的風險防范
- 月嫂合同書格式模板
- 互聯(lián)網(wǎng)公司采購合同范本
- 經(jīng)典耗材采購合同范文
- 標準柴油購銷合同范本
- 保密合同協(xié)議的解除條件
- 預付式消費監(jiān)管服務平臺建設方案
- 2024年應急管理部宣傳教育中心招考聘用筆試歷年難、易錯考點試題后附答案帶解析
- 《瘋狂動物城》全本臺詞中英文對照
- 第三小學花樣跳繩校本教材(一至六年級通用)
- 手持電動工具操作規(guī)程
- 《美容皮膚學》考試復習題庫(含答案)
- 七年級數(shù)學德育滲透工作總結
- 崗位調動確認書
- 學習活動二運用有效的推理形式(導學案)高二語文(選擇性必修上冊)
- 設計重點難點分析、應對措施
- C#筆試題及答案
評論
0/150
提交評論