java課程設(shè)計(jì)網(wǎng)絡(luò)即時(shí)通信系統(tǒng)_第1頁(yè)
java課程設(shè)計(jì)網(wǎng)絡(luò)即時(shí)通信系統(tǒng)_第2頁(yè)
java課程設(shè)計(jì)網(wǎng)絡(luò)即時(shí)通信系統(tǒng)_第3頁(yè)
java課程設(shè)計(jì)網(wǎng)絡(luò)即時(shí)通信系統(tǒng)_第4頁(yè)
java課程設(shè)計(jì)網(wǎng)絡(luò)即時(shí)通信系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

網(wǎng)絡(luò)即時(shí)通信系統(tǒng)課程設(shè)計(jì)的目的聊天工具的應(yīng)用十分廣泛,只要記住對(duì)方的號(hào)碼,無論在哪里,都可以通過聊天工具隨時(shí)交流。本課程設(shè)計(jì)開發(fā)的網(wǎng)絡(luò)聊天工具可作為公司、企業(yè)內(nèi)部交流的工具使用,既充分利用了網(wǎng)絡(luò)資源,又保證內(nèi)部信息的安全。本聊天工具由服務(wù)器端程序和客戶端程序兩部分組成,整體采用java平臺(tái)開發(fā),并使用SQLServer2000管理數(shù)據(jù)庫(kù)數(shù)據(jù)。通過實(shí)際操作,使所學(xué)的java知識(shí)得到運(yùn)用,鍛煉實(shí)踐能力,開發(fā)一個(gè)完整的系統(tǒng),從軟件工程的角度進(jìn)行科學(xué)而嚴(yán)謹(jǐn)?shù)年U述。設(shè)計(jì)方案論證2?1系統(tǒng)總體設(shè)計(jì)本聊天工具采用客戶機(jī)/服務(wù)器(C/S)的模式來設(shè)計(jì),是一個(gè)3層的C/S結(jié)構(gòu):數(shù)據(jù)庫(kù)服務(wù)器——應(yīng)用程序服務(wù)器端——應(yīng)用程序客戶端,其分層結(jié)構(gòu)如圖1所示,系統(tǒng)采用C/S結(jié)構(gòu)可以將任務(wù)合理分配到客戶機(jī)端和服務(wù)器端,從而降低了系統(tǒng)的通信開銷。后臺(tái)數(shù)據(jù)庫(kù)—^SQLServer2OO0—JDBC-ODBCUDP UDP UDP圖1 3層C/S結(jié)構(gòu)示意圖2.1.1功能模塊分析

-~本聊天工具按如下過程完成通信:客戶向服務(wù)器注冊(cè),告知服務(wù)器它在監(jiān)聽某主題;客戶注冊(cè)之后,向服務(wù)器發(fā)送信息;服務(wù)器再把消息發(fā)送給所有監(jiān)聽次主題的客戶。根據(jù)聊天的通信步驟,系統(tǒng)的功能模塊如圖2:圖2功能模塊圖2.2數(shù)據(jù)庫(kù)設(shè)計(jì)數(shù)據(jù)庫(kù)表主要用來存放用戶的注冊(cè)信息和用戶的好友資料,可利用兩張數(shù)據(jù)庫(kù)表用來存放用戶信息和用戶好友資料。在SQLServer2000上新建名為javaicp的數(shù)據(jù)庫(kù)表:用戶的基本信息數(shù)據(jù)庫(kù)表(表名icq)和用戶好友數(shù)據(jù)庫(kù)表(表名friend).表1 用戶的基本信息表(表名icp)序號(hào)字段名含義數(shù)據(jù)類型NULL1Icqno用戶的號(hào)碼IntNo2Nickname用戶的昵稱CharNo3Password用戶的密碼CharNo4Status用戶在線否BitNo5Ip用戶的IP地址CharYes6Info用戶的資料VarcharYes7Pic用戶的頭像號(hào)IntYes8Sex用戶性別CharYes9Email用戶的E-mailCharYes10place用戶的籍貫CharYes表2用戶的好友表(表名friend)序號(hào)字段名含義數(shù)據(jù)類型NULL1Icqno用戶的號(hào)碼IntNo2Friend好友的號(hào)碼IntNo2.3服務(wù)器的設(shè)計(jì)2?3?1主服務(wù)器的設(shè)計(jì)主服務(wù)器類實(shí)現(xiàn)了服務(wù)器端的多線程,即使用ServerSockets=newServerSocket(8080)語句在8080端口創(chuàng)建套接口;使用newServerThread(socket)語句創(chuàng)建新的線程。主服務(wù)器類調(diào)用ServerThread類,而每個(gè)ServerThread實(shí)體就是一個(gè)單獨(dú)的線程,即對(duì)應(yīng)于客戶端連接請(qǐng)求響應(yīng)的線程。服務(wù)器有一個(gè)進(jìn)程(或多個(gè)線程)在指定的端口等待客戶的連接信息,一旦連接成功,就可以按設(shè)計(jì)的數(shù)據(jù)交換方法和格式進(jìn)行數(shù)據(jù)傳輸??蛻舳酥辉谛枰臅r(shí)候向服務(wù)器端發(fā)出連接請(qǐng)求。實(shí)現(xiàn)代碼如下:PublicclassServer{Publicstaticvoidmain(Stringargs[])throwsIOException{ServerSockets=newServerSocket(8080);System.out.println(“Serverstart.."+s);try{while(true){Socketsocket=s.accept();System.out.println(“Connectinoaccept:"+socket);try{newServerThread(socket);}catch(IOExceptione){Socket.close();}}}finally{s.close();}}}2.3.2ServerThread類的設(shè)計(jì)實(shí)現(xiàn)代碼如下:importjava.io.*;import.*;importjava.sql.*;importjava.util.Vector;classServerThreadextendsThread{privateSocketsocket;privateBufferedReaderin;privatePrintWriterout;intno;publicServerThread(Sockets)throwsIOException{socket=s;in=newBufferedReader(newInputStreamReader(socket.getInputStream()));out=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);start();}}2.3.3登錄驗(yàn)證如果客戶端輸入的字符串表示需要登錄,那么服務(wù)器在接受到該信息后連接數(shù)據(jù)庫(kù),準(zhǔn)備從數(shù)據(jù)庫(kù)選擇昵稱和密碼。服務(wù)器接收到客戶端發(fā)送過來的號(hào)碼和密碼信息后,設(shè)定數(shù)據(jù)庫(kù)查詢條件,并執(zhí)行數(shù)據(jù)庫(kù)查詢,通過比較輸入的用戶名和密碼和數(shù)據(jù)庫(kù)信息來確定用戶的登錄是否成功。通知好友也是在run函數(shù)中實(shí)現(xiàn)的服務(wù)器功能。服務(wù)器首先連接數(shù)據(jù)庫(kù),再根據(jù)“我的號(hào)碼”從好友表中得到我的好友列表,然后利用廣播通知他們我已經(jīng)上線了。實(shí)現(xiàn)代碼:略。2?3?4新建用戶新建用戶是網(wǎng)絡(luò)聊天工具的一個(gè)基本功能。用戶新建過程也在線程監(jiān)聽函數(shù)run()中。新建用戶的過程是這樣的:首先要使用Class.forName方法加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)類,該類的描述是sun.jdbc.odbc()dbcDriver;然后使用DriverManager.getConnection方法連接數(shù)據(jù),數(shù)據(jù)庫(kù)名為jdbc:odbc:javaicq;最后服務(wù)器接收客戶端用戶發(fā)送的昵稱、密碼、用戶E-mail、個(gè)人資料、籍貫和頭像等信息,執(zhí)行數(shù)據(jù)庫(kù)添加操作完成用戶的創(chuàng)建。服務(wù)器為新建的用戶制定唯一的注冊(cè)號(hào)碼,并將號(hào)碼以即時(shí)消息的方法發(fā)送給用戶。實(shí)現(xiàn)代碼:略。2?3?5好友處理查找好友:當(dāng)客戶端向服務(wù)器端發(fā)送查找好友的請(qǐng)求后,服務(wù)器立即響應(yīng)并調(diào)用Class.forName方法加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)類sun.jdbc.odbc.JdbcOdbcDriver,然后調(diào)用方法DriverManager.getConnection完成數(shù)據(jù)庫(kù)的連接,得到用戶好友查詢的結(jié)果。查詢結(jié)果包括:好友的昵稱、性別、籍貫、個(gè)人資料等信息。服務(wù)器對(duì)數(shù)據(jù)庫(kù)的查詢結(jié)果進(jìn)行篩選,只向客戶端的用戶返回好友的注冊(cè)號(hào)碼、頭像信息及是否在線信息??蛻舳私邮盏讲樵兘Y(jié)果后,利用效能感應(yīng)的函數(shù)將其顯示出來。讀取資料:讀取資料功能是在查找好友功能基礎(chǔ)上建立的,用戶得到好友列表后,可根據(jù)需要讀取好友的詳細(xì)資料,也可以讀取用戶自己的詳細(xì)資料。服務(wù)器使用Vector矢量保存客戶端用戶的好友號(hào)碼,并返回好友的昵稱、號(hào)碼、IP地址、狀態(tài)、頭像和個(gè)人資料等信息。添加好友:服務(wù)器響應(yīng)客戶端用戶的請(qǐng)求后,首先連接數(shù)據(jù)庫(kù),并根據(jù)接收的用戶號(hào)碼及好友號(hào)碼向好友表添加記錄。服務(wù)器使用哪個(gè)r6保存查詢結(jié)果。若r6為1,則表明添加好友成功,服務(wù)器將給客戶端發(fā)出“okaddfriend”的消息;否則添加好友失敗,服務(wù)器將給客戶端發(fā)出“falseaddfriend”的消息。刪除好友:當(dāng)服務(wù)器接受到客戶端的刪除好友請(qǐng)求后,它連接數(shù)據(jù)庫(kù),并根據(jù)接收的用戶號(hào)碼及好友號(hào)碼將好友表記錄刪除。服務(wù)器利用r7保存刪除結(jié)果,若r7為1,則刪除好友成功,服務(wù)器給客戶端發(fā)出“okdelfriend”的消息;否則刪除好友失敗,服務(wù)器給客戶端發(fā)出“falsedelfriend”的消息。好友處理實(shí)現(xiàn)代碼:略。2.3.6退出下線用戶在線時(shí),數(shù)據(jù)庫(kù)表的IP地址字段為此時(shí)用戶計(jì)算機(jī)的真實(shí)IP地址,狀態(tài)字段為1?若用戶退出下線,服務(wù)器只需是完成修改IP字段和狀態(tài)字段即可。服務(wù)器首先利用Class.forName方法加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)類sun.jdbc.odbc.JdbcOdbcDriver;然后通過方法DriverManager.getConnection連接數(shù)據(jù)庫(kù),最后根據(jù)用戶號(hào)碼,將其狀態(tài)字段設(shè)為0,IP地址字段為空。實(shí)現(xiàn)代碼:略。2.4客戶端的設(shè)計(jì)客戶通過Socket與服務(wù)器建立連接,服務(wù)器與客戶都通過構(gòu)造BufferedReade、PrintWriter來建立輸入/輸出流來相互傳遞信息。一旦收到客戶方的連接請(qǐng)求,服務(wù)器利用accept()函數(shù)返回一個(gè)新建的Socket對(duì)象,隨后客戶端向服務(wù)器發(fā)送消息,諸如注冊(cè)、登錄和查找好友等請(qǐng)求,服務(wù)器收到請(qǐng)求后,針對(duì)不同的消息處理請(qǐng)求。在這一過程中,服務(wù)器端與客戶端采用UDP協(xié)議通信。雖然UDP協(xié)議不可靠,但是對(duì)于聊天工具而言,可靠性并不太重要。

2.4.1用戶注冊(cè)當(dāng)服務(wù)器收到用戶的注冊(cè)請(qǐng)求后,開始接收客戶傳遞的信息,諸如客戶的昵稱、性別、籍貫、頭像和個(gè)人資料等信息。接收完畢后,服務(wù)器便通過JdbcOdbc與后臺(tái)數(shù)據(jù)庫(kù)連接,向數(shù)據(jù)庫(kù)添加記錄,其流程如圖3所示。若新用戶注冊(cè),則向客戶返回號(hào)碼,并在數(shù)據(jù)庫(kù)中注冊(cè)用戶的IP地址,設(shè)定Status值告知用戶在線(Status設(shè)為1)??蛻羰盏椒?wù)器返回的信息后,打開主程序窗口,同時(shí)創(chuàng)建UDP以便在用戶之間建立聯(lián)系。注冊(cè)事件處理,這是處理客戶端的主要部分。Java事件包括鍵盤事件、鼠標(biāo)事件和按鈕等事件。而所使用到的是鼠標(biāo)事件實(shí)際就是點(diǎn)鼠標(biāo)按鈕時(shí),系統(tǒng)會(huì)調(diào)用監(jiān)聽器,包括mousePressed,mouseReleased,mouseClicked。監(jiān)聽及處理流程如圖4所示。服務(wù)器圖3新用戶注冊(cè)過程

服務(wù)器圖3新用戶注冊(cè)過程圖4事件監(jiān)聽流程用戶注冊(cè)的界面設(shè)計(jì):用戶注冊(cè)界面使用了JDialog類。在JavaSwing編程中,程序員還可以通過集成JDialog類來自定義對(duì)話框。用戶注冊(cè)界面如圖5所示,用戶在線注冊(cè)界面上填寫自己的注冊(cè)資料,其中必須填寫的內(nèi)容是用戶昵稱和密碼:可選的內(nèi)容包括電子郵件、頭像、性別、籍貫和留言等。填寫完注冊(cè)信息后,單擊【確定】按鈕建立一個(gè)新用戶。若單擊【取消】按鈕,則放棄注冊(cè)。

2?4?2用戶登錄監(jiān)聽登錄事件:用戶在客戶端程序中輸入用戶號(hào)碼和密碼,與服務(wù)器建立連接,向服務(wù)器發(fā)送登錄請(qǐng)求。服務(wù)器收到該請(qǐng)求后,通過JdbcOdbc讀取數(shù)據(jù)庫(kù),與用戶輸入的信息做比較:若用戶輸入的信息與數(shù)據(jù)庫(kù)信息相同,則服務(wù)器向客戶返回成功消息,將其Status字段設(shè)為1,并注冊(cè)用戶當(dāng)前所使用的IP地址;否則服務(wù)器向客戶返回失敗消息??蛻舳耸盏椒?wù)器的成功確認(rèn)后,打開聊天主窗口;否則彈出失敗信息??蛻舳说氖录?qū)動(dòng)與服務(wù)器端的時(shí)間監(jiān)聽相對(duì)應(yīng)。Java的圖形用戶界面是由事件驅(qū)動(dòng)的,并利用各種各樣的監(jiān)聽器負(fù)責(zé)捕捉這些事件,因此要為某一個(gè)組件的某種事件添加監(jiān)聽器。登錄事件處理:完成不同事件監(jiān)聽器的添加后,需根據(jù)用戶的登錄類型具體編程控制登錄事件的處理過程??蛻舳说氖录O(jiān)聽器監(jiān)聽到某個(gè)事件后,會(huì)自動(dòng)調(diào)用相關(guān)的方法。這些方法只需要重載就可以處理相應(yīng)的事件了。界面設(shè)計(jì):界面設(shè)計(jì)主要用到了Jframe類,它也是屬于Swing設(shè)計(jì)類別。所有JFrame的基類,有一個(gè)標(biāo)題為參數(shù)的構(gòu)造函數(shù),缺省關(guān)閉操作為系統(tǒng)退出,JFrame就是Windows的子類框架,是Java圖形用戶界面的基礎(chǔ),它就是我們通常所說的窗口,是Windows/XWindow應(yīng)用程序的典型特征。界面設(shè)計(jì)實(shí)現(xiàn)代碼:略。登錄界面如圖6所示。用戶向登錄界面輸入用戶號(hào)碼、密碼、服務(wù)器地址名和端口。服務(wù)器地址和端口應(yīng)該是事先知道的,如果服務(wù)器有自己的域名,也可輸入域名。正確填寫登錄信息后,單擊【登錄】按鈕,密碼驗(yàn)證正確后完成登錄過程。三nevJICQ諳輸入你的信息飾的窖碼13端口8080登錄新越退出圖6登錄界面2.4.3主程序設(shè)計(jì)用戶完成登錄后,客戶端與服務(wù)器端建立連接。連接建立成功后,客戶向服務(wù)器請(qǐng)求讀取好友名單;服務(wù)器收到該請(qǐng)求,開始讀取數(shù)據(jù)庫(kù)中的friend表并得到好友的號(hào)碼,再通過icq表讀取好友資料,向客戶端發(fā)送這些信息;客戶收到服務(wù)器信息后,在主窗口顯示好友(即好友的頭像和昵稱)??蛻舳诉€建立矢量(Vector)來存儲(chǔ)好友昵稱、jicq號(hào)碼、頭像編號(hào)和IP地址等信息。主程序利用MainWin類實(shí)現(xiàn),首先要定義成員變量,主程序構(gòu)造函數(shù)用來生成MainWin類的實(shí)例(對(duì)象)、設(shè)置大小并顯示,其實(shí)現(xiàn)代碼如下:publicclassMainWinextendsJFrameimplementsRunnable{publicMainWin(ints,Stringsername,intserport){enableEvents(AWTEvent.WINDOW_EVENT_MASK);try{myjicq=s;server=sername;serverport=serport;jbInit();ConnectServer(myjicq);CreatUDP();Findf=newFindFriend2(myjicq,server,serverport)Findf.setBounds(200,150,300,300);Thread=newThread(this);Thread.start();}Catch(Exceptione){printStackTrace();}}}主程序窗口設(shè)計(jì):主程序窗口需要添加兩個(gè)監(jiān)聽器,它們分別用來監(jiān)聽窗口關(guān)閉事件和窗口激活事件。主程序窗口類繼承了JFrame類,其可能發(fā)生的窗口事件包括:windowActivated(WindowEvente):窗口得到焦點(diǎn)時(shí)觸發(fā);windowClosed(WindowEvente):窗口關(guān)閉之后觸發(fā);windowClosing(WindowEvente):窗口關(guān)閉時(shí)觸發(fā);windowDeactivated(WindowEvente):窗口失去焦點(diǎn)時(shí)觸發(fā);windowOpened(WindowEvente):窗口打開之后觸發(fā);主程序窗口是通過在JFrame對(duì)象中添加AWT或者Swing組件而完成的。但是,JFrame不是一個(gè)容器,只是一個(gè)框架,在其對(duì)象中添加組件需要利用其他的辦法。JFrame有一個(gè)內(nèi)容面板(ContentPane),可將窗口的所有組件都添加在這個(gè)面板上,并利用JFrame提供的getContentPane和setContentPane犯法完成指定面板的設(shè)置。這樣通過面板可在JFrame對(duì)象中添加所需的組件。窗口實(shí)現(xiàn)代碼:略。服務(wù)器連接:服務(wù)器連接是在ConnectServer()函數(shù)中實(shí)現(xiàn)的。本函數(shù)用到了具有連續(xù)性、有序性特點(diǎn)的流(Stream),根據(jù)服務(wù)器的IP地址和端口來完成客戶端與服務(wù)器端的連接。IP地址是網(wǎng)絡(luò)中唯一的地址標(biāo)識(shí)。服務(wù)器連接過程分服務(wù)器端和客戶端兩個(gè)部分,執(zhí)行流程如下:服務(wù)器程序流程:?程序初始化;?填寫本機(jī)地址信息;?綁定并監(jiān)聽一個(gè)固定的端口;收到Client的連接后建立一個(gè)Socket連接;產(chǎn)生一個(gè)新的進(jìn)程與Client進(jìn)行通信和信息處理;子通信結(jié)束后中斷與Client的連接。客戶端程序流程:?程序初始化;?填寫服務(wù)器地址信息;?連接服務(wù)器;?與服務(wù)器通信和信息處理;?通信結(jié)束后斷開連接。2.4.4消息通信的設(shè)計(jì)創(chuàng)建數(shù)據(jù)報(bào):消息的收發(fā)主要是通過數(shù)據(jù)報(bào)服務(wù)實(shí)現(xiàn)的。Java實(shí)現(xiàn)數(shù)據(jù)報(bào)通信的過程除了面向連接的Socket外,還有無連接的數(shù)據(jù)包Socket。數(shù)據(jù)報(bào)是網(wǎng)絡(luò)層數(shù)據(jù)單元在介質(zhì)上傳輸信息的一種邏輯分組格式,它是一種在網(wǎng)絡(luò)中傳播的、獨(dú)立的、自身包含地址信息的消息,它能否到達(dá)目的地,到達(dá)時(shí)內(nèi)容是否會(huì)變化是不能準(zhǔn)確知道的。數(shù)據(jù)報(bào)的通信雙方不需要建立連接,對(duì)于像聊天通信這些不需要很高質(zhì)量的應(yīng)用程序來說,數(shù)據(jù)報(bào)通信是一個(gè)非常好的選擇。首先,通信雙方要建立數(shù)據(jù)包通信的Socket??梢酝ㄟ^創(chuàng)建一個(gè)DatagramSocket對(duì)象來實(shí)現(xiàn)它,其構(gòu)造方法為:PublicDatagramSocket()構(gòu)造一個(gè)數(shù)據(jù)報(bào)Socket,并使其與本地主機(jī)任何一個(gè)可用的端口連接。若打不開Socket則拋出SocketException異常。然后,處理接收緩沖區(qū)內(nèi)的數(shù)據(jù),獲取服務(wù)結(jié)果。最后,當(dāng)通信完成后,可以使用DatagramSocket對(duì)象的close()方法來關(guān)閉數(shù)據(jù)報(bào)通信Socket。當(dāng)然,Java自己會(huì)自動(dòng)關(guān)閉Socket,釋放DatagramSocket和DatagramPacket所占用的資源。發(fā)送消息:用戶通過在好友列表中好友的IP地址,利用UDP協(xié)議與其他用戶進(jìn)行信息交流。消息發(fā)送之前先創(chuàng)建一個(gè)數(shù)據(jù)報(bào)文包,用來實(shí)現(xiàn)無連接的包傳送服務(wù)。每個(gè)數(shù)據(jù)報(bào)文包是用DatagramPacket類來創(chuàng)建的,DatagramPacket對(duì)象圭寸裝了數(shù)據(jù)報(bào)包數(shù)據(jù)、包長(zhǎng)度、目標(biāo)地址和目標(biāo)端口。若客戶端要發(fā)送數(shù)據(jù)報(bào)文包,則構(gòu)造函數(shù)創(chuàng)建DatagramPacket對(duì)象,將需要發(fā)送的數(shù)據(jù)和包文目的地址信息放入對(duì)象之中。圖7發(fā)送消息流程在發(fā)送的過程中利用構(gòu)造函數(shù)DatagramPacket(bytebufferedarray[],intlength,InetAddressaddress,intport)構(gòu)造了一個(gè)包長(zhǎng)度為length的包,它是一個(gè)將數(shù)據(jù)傳送到指定主機(jī)指定端口號(hào)上的數(shù)據(jù)報(bào)文包,參數(shù) length必須小于等于bufferedarray.length。消息發(fā)送是通過調(diào)用DatagramPacket對(duì)象的send方法實(shí)現(xiàn)的,它需要以DatagramPacket對(duì)象為參數(shù),將剛才圭寸裝進(jìn)DatagramPacket對(duì)象中的數(shù)據(jù)組成數(shù)據(jù)報(bào)發(fā)出。實(shí)現(xiàn)代碼如下:Voidsend_mouseClicked(MpiseEvente){try{Strings=sendtext.getText().triim();Byte[]data=s.getBytes();System.out.println(theip);Theip.trim();If(theip.equals(“null")||theip.equals(““)||theip.equals(“O“)){JOptionPane.showMessageDialog(this“:-(對(duì)不起,不在線",”ok”,JOptionPane.INFORMATION_MESSAGE);}else{sendPacket=newDatagramPacket(data,s.length(),InetAddress.getByName(theip),send(Port);sendSocket.send(sendPacket);}}catch(IOExceptione2){Semdtext.append(sendtext.getTet());e2.printStackTrace();}Senddata.dispose();}}監(jiān)聽好友的消息:監(jiān)聽好友的消息與QQ好友上線監(jiān)聽功能非常相似。系統(tǒng)首先定義一個(gè)空數(shù)組,該數(shù)組用于接受消息中的數(shù)據(jù),然后創(chuàng)建數(shù)據(jù)報(bào),使用receiveSocket.receive(receivePacket)函數(shù)等待接收數(shù)據(jù)報(bào),取得數(shù)據(jù)報(bào)中的數(shù)據(jù)。根據(jù)取得數(shù)據(jù)的類型,監(jiān)聽器將判定好友是否上線:若有好友上線,則好友的頭像變色,若有好友下線,則好友的頭像變?yōu)榛疑=邮障ⅲ篋atagramPacket類提供了4個(gè)函數(shù)來獲取消息:Publicbyte[]getData():返回一個(gè)字節(jié)數(shù)組,包含收到或要發(fā)送的數(shù)據(jù)報(bào)中的數(shù)據(jù);PublicintgetLength():返回發(fā)送或接收到的數(shù)據(jù)的長(zhǎng)度;PublicInetAddressgetAddress():返回一個(gè)發(fā)送或接收此數(shù)據(jù)報(bào)報(bào)文的機(jī)器的IP地址;PublicintgetPort():返回發(fā)送或接收數(shù)據(jù)報(bào)的遠(yuǎn)程主機(jī)的端口號(hào)。為了接收從服務(wù)器返回的結(jié)果數(shù)據(jù)報(bào)文包,需要建立一個(gè)新的DatagramPacket對(duì)象。系統(tǒng)可調(diào)用DatagramPacket對(duì)象的receive()函數(shù)來接收數(shù)據(jù)報(bào),并將DatagramPacket對(duì)象作為該函數(shù)的參數(shù)。receive()方法會(huì)一直阻塞直至收到一個(gè)數(shù)據(jù)報(bào)文包,而該數(shù)據(jù)存放在DatagramPacket對(duì)象的緩沖區(qū)中。數(shù)據(jù)報(bào)文包還包含了發(fā)送者的IP地址和端口號(hào)等信息。2.4.5好友管理查找好友:好友查找可利用FindFriend2類來完成,F(xiàn)indFriend2類繼承自JFrame類。FindFriend2中定義的界面控件包括:好友的昵稱、性別、主旨、jicq號(hào)碼、IP地址、在線狀態(tài)、頭像、電子郵件和個(gè)人留言等信息。查找好友所需的網(wǎng)絡(luò)變量定義如下:Socketsocket:連接Socket;BuffereReaderin:讀入緩沖區(qū);PrintWriterout:輸入緩沖區(qū);Intmyid:用戶的號(hào)碼;Stringserverhost:發(fā)送端的王機(jī)地址;Intservport:服務(wù)端的王機(jī)地址;DatagramPacketsendPacket:存儲(chǔ)發(fā)送信息的發(fā)送數(shù)據(jù)報(bào);DatagramSocketsendSocket:存儲(chǔ)接收信息的接收數(shù)據(jù)報(bào);intsendPort:發(fā)送的端口號(hào)。查找好友實(shí)現(xiàn)代碼:略。添加好友:用戶添加好友是聊天工具的基本功能之一。添加好友的基本步驟如下:?用戶登錄后,向服務(wù)器發(fā)送查找請(qǐng)求,服務(wù)器響應(yīng)并讀取數(shù)據(jù)庫(kù)表icq,將結(jié)果返回給用戶;?用戶在收到查詢結(jié)果后選擇用戶B向服務(wù)器發(fā)送添加好友請(qǐng)求,服務(wù)器收到請(qǐng)求后響應(yīng),更新數(shù)據(jù)庫(kù)表friend,并從icq表中讀取好友基本信息,將信息返回給用戶A;用戶A的客戶端主窗口顯示用戶B并通過UDP通知用戶B;?用戶B收到服務(wù)器的確認(rèn)消息,可決定是否添加用戶A為好友。刪除好友:用戶可以刪除好友列表中指定的好友,客戶端確認(rèn)用戶操作后向服務(wù)器發(fā)送刪除請(qǐng)求,服務(wù)器收到該請(qǐng)求,連接數(shù)據(jù)庫(kù)表friend并刪除用戶及該好友的記錄。若刪除成功,則向客戶端返回成功消息,通知用戶。設(shè)計(jì)結(jié)果與分析3.1系統(tǒng)配置軟件環(huán)境配置:Windows2000/XP操作系統(tǒng)。其中WindowsXP系統(tǒng)不可安裝SP2;Java環(huán)境JDK1.3以上;SQLServer2000數(shù)據(jù)庫(kù)系統(tǒng)。

硬件環(huán)境配置:CPU速度在500MHz以上;內(nèi)存在64MB以上。服務(wù)器啟動(dòng):完成數(shù)據(jù)庫(kù)設(shè)計(jì)后啟動(dòng)數(shù)據(jù)庫(kù)服務(wù)器,在Windwws控制臺(tái)下執(zhí)行如下命令:JavacServer.javaJavaServer服務(wù)器啟動(dòng)后將顯示服務(wù)器地址和端口號(hào)。設(shè)定服務(wù)器地址為,端口為8080。3.2運(yùn)行客戶端:在Windows控制臺(tái)下執(zhí)行如下命令:java

溫馨提示

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