版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、河北農(nóng)業(yè)大學 本科畢業(yè)論文(設計)題 目: 基于java的網(wǎng)絡聊天室-服務器端 目錄1 緒論21.1背景及意義11.2研究現(xiàn)狀12 系統(tǒng)分析32.1 實現(xiàn)技術32.2系統(tǒng)分析63系統(tǒng)設計73.1系統(tǒng)功能結(jié)構(gòu)73.2系統(tǒng)業(yè)務流程83.3系統(tǒng)實現(xiàn)原理83.模塊化設計93. 數(shù)據(jù)庫設計93.開發(fā)環(huán)境與運行環(huán)境103.7客戶端結(jié)構(gòu)103.8服務器端結(jié)構(gòu)114 系統(tǒng)實現(xiàn)114.1新用戶注冊模塊114.2 登錄模塊134.3消息通信模塊:與顯示的在線好友間通信154.4 服務器端175總結(jié)22參考文獻23致謝231 緒論網(wǎng)絡通信在當今信息社會中起著不可或缺的作用,人們可以利用網(wǎng)絡通信技術進行即時的信息交流
2、。比如QQ聊天工具,它就是利用網(wǎng)絡通信技術開發(fā)的一款眾所周知的網(wǎng)絡聊天工具。目前,信息交流是互聯(lián)網(wǎng)提供的主要內(nèi)容,網(wǎng)絡通信系統(tǒng)有多重實現(xiàn)方式,類似ICQ屬于一種點對點的聊天系統(tǒng);還有一種是基于Socket的集中式聊天系統(tǒng),這種聊天系統(tǒng)需要登錄統(tǒng)一的聊天服務器。當今主流的聊天工具有QQ,ICQ , MSN Message 等,國內(nèi)最熱門的當屬Q(mào)Q,騰訊 QQ是由深圳市騰訊計算機系統(tǒng)公司開發(fā)的,基于Internet的即時尋呼軟件。您可以使用QQ和好友用戶進行交流、信息即時發(fā)送、即時回復、收發(fā)即時,功能全面。QQ支持顯示朋友在線信息、即時傳送信息、即時交談、即時發(fā)送文件和網(wǎng)址。 網(wǎng)絡聊天以成為上網(wǎng)族
3、的一種普遍的休閑方式,可以毫不夸張的說,全國的網(wǎng)民中沒人不知道QQ聊天軟件,所以,一款好的即時通信聊天軟件成了上網(wǎng)的必備工具之一。網(wǎng)上有很多的聊天軟件可供網(wǎng)民們選擇,各有不同的特點和長處,可滿足不同人的各種需求。局域網(wǎng)聊天工具,是在局域網(wǎng)內(nèi)部使用的,用戶之間用來交流的一個工具,一般都具有文本聊天和文件傳輸功能。局域網(wǎng)聊天軟件因其使用簡單,系統(tǒng)資源消耗少等優(yōu)點,成為各企事業(yè)單位等的局域網(wǎng)內(nèi)廣泛應用的軟件之一。目前國內(nèi)外做聊天系統(tǒng)的公司很多,產(chǎn)品也琳瑯滿目,國內(nèi)有諸如騰訊QQ、新浪UC等,國外有著名的MSN等。本人取最具代表性的QQ和MSN進行了一些研究,作為我開發(fā)聊天系統(tǒng)的準備。騰訊無疑是國內(nèi)即
4、時通訊市場的霸主,自從99年進入即時通訊領域并迅速占市場之后,其在國內(nèi)用戶數(shù)量始終高居榜首,即使近幾年面對微軟MSN的強大攻勢,騰訊QQ的時常占有率依然穩(wěn)步增長。騰訊的成功與其對QQ的不斷創(chuàng)新和完善是分不開的。參考了許多網(wǎng)絡上的資料,以及自己通過觀察騰訊QQ運行時的各種細節(jié)。可以確定騰訊QQ是以多服務器提供服務、服務器總控客戶端、客戶端之間UDP直連通信的。并且在兩個客戶端之間不能建立直連的情況下,才由服務器進行中轉(zhuǎn)通信。其模型如圖1.1:圖1.1 騰訊QQ服務器-客戶端模型與騰訊QQ不同,微軟的MSN Messenger只使用了TCP作為傳輸層通信協(xié)議,所有客戶端與服務器進行連接,然后通過與
5、服務器的TCP連接進行中轉(zhuǎn)通信。其模型如圖1.2:圖1.2 MSN服務器-客戶端模型騰訊使用的模型中,服務器主要處理客戶端各種狀態(tài)的控制,可以極大減輕服務器的處理壓力,但其內(nèi)部協(xié)議和實現(xiàn)復雜度都較高。而MSN Messenger所有數(shù)據(jù)都要經(jīng)過服務器,服務器壓力可想而知(難怪平時很少見到使用MSN進行語音視頻聊天的)。2 系統(tǒng)分析2.1 實現(xiàn)技術2.1.1 Java 語言Java,是一種可以撰寫跨平臺應用軟件的面向?qū)ο蟮某绦蛟O計語言,由Sun公司的詹姆斯·高斯林(James Gosling)等人于1990年代初開發(fā)。它最初被命名為Oak,目標設置在家用電器等小型系統(tǒng)的編程語言,來解決
6、諸如電視機、 、鬧鐘、烤面包機等家用電器的控制和通訊問題。由于這些智能化家電的市場需求沒有預期的高,Sun放棄了該項計劃。就在Oak幾近失敗之時,隨著互聯(lián)網(wǎng)的發(fā)展,Sun看到了Oak在計算機網(wǎng)絡上的廣闊應用前景,于是改造了Oak,在1995年5月以“Java”的名稱正式發(fā)布了。Java伴隨著互聯(lián)網(wǎng)的迅猛發(fā)展而發(fā)展,逐漸成為重要的網(wǎng)絡編程語言。Java編程語言的風格十分接近C+語言,Java繼承了C+ 語言面向?qū)ο蠹夹g的內(nèi)核,舍棄了C+語言中容易引起錯誤的指針(以引用取代)、運算符重載(operator overloading)、多重繼承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引
7、用的對象所占據(jù)的內(nèi)存空間。在Java SE 1.5版本中Java又引入了泛型編程(Generic Programming)、類型安全的枚舉、不定長參數(shù)和自動裝拆箱等語言特性。Java不同于一般的編譯運行計算機語言和解釋執(zhí)行計算機語言。它首先將源代碼編譯成字節(jié)碼(bytecode),然后依賴各種不同平臺上的虛擬機來解釋執(zhí)行字節(jié)碼,從而實現(xiàn)了“一次編譯、到處執(zhí)行”的跨平臺特性。不過,這同時也在一定程度上降低了Java程序的運行效率。但在J2SE1.4.2發(fā)布后,Java的運行速度有了大幅提升。與傳統(tǒng)程序不同Sun公司在推出Java之際就將其作為一種開放的技術。全球數(shù)以萬計的Java開發(fā)公司被要求所
8、設計的Java軟件必須相互兼容?!癑ava語言靠群體的力量而非公司的力量”是Sun公司的口號之一,并獲得了廣大軟件開發(fā)商的認同。這與微軟公司所倡導的注重精英和封閉式的模式完全不同。Sun公司對Java編程語言的解釋是:Java編程語言是個簡單、面向?qū)ο蟆⒎植际?、解釋性、健壯、安全與系統(tǒng)無關、可移植、高性能、多線程和動態(tài)的語言。Java語言有以下特點:簡單(Simple):指的是去除了C/C+中較少使用或可能不安全的功能,例如指標,運算子重載,多重繼承等。 物件導向的(Object-oriented):利用OOP的三種基本特性:PIE(多型,繼承,封裝),來設計出可重複使用的元件,使系統(tǒng)有彈性易
9、于維護。 網(wǎng)路的(Network-Savvy):提供容易使用的API來撰寫網(wǎng)路程式 。直譯式的(Interpreted):bytecode在JVM上執(zhí)行時,JIT負責轉(zhuǎn)換為機器碼。 穩(wěn)健的(Robust):捨棄了對記憶體的指標運作。 安全性(Secure):資源回收處理 (Garbage Collection)由JVM自行作記憶體管理,例外處理 (Exception) 可預防突發(fā)錯誤的產(chǎn)生。 結(jié)構(gòu)中立(Architecture Neutral):程式執(zhí)行在虛擬機器上。 可攜的(Portable): Write once, run anywhere指的是由JVM與不同的作業(yè)系統(tǒng)溝通。 高效率的(
10、High Performance):利用HotSpot, JIT技術改善效能。 多執(zhí)行緒的(Multithreaded):Java程序可發(fā)出多隻并行的輕量化行程。 動態(tài)的(Dynamic):Java程式執(zhí)行時動態(tài)的連結(jié)類別庫。Java語言的優(yōu)良特性使得Java應用具有無比的健壯性和可靠性,這也減少了應用系統(tǒng)的維護費用。Java對對象技術的全面支持和Java平臺內(nèi)嵌的API能縮短應用系統(tǒng)的開發(fā)時間并降低成本。Java的編譯一次,到處可運行的特性使得它能夠提供一個隨處可用的開放結(jié)構(gòu)和在多平臺之間傳遞信息的低成本方式。特別是Java企業(yè)應用編程接口(Java Enterprise APIs)為企業(yè)計
11、算及電子商務應用系統(tǒng)提供了有關技術和豐富的類庫。2.1.2 Java與Internet Java語言取得成功的領域之一就是網(wǎng)絡(其他語言)數(shù)頁代碼->(Java)一條語句。 TCP/IP(傳輸控制協(xié)議/網(wǎng)間協(xié)議)是internet的主要協(xié)議,定義了計算機和外設進行通信所使用的規(guī)則(應用層,傳輸層,網(wǎng)絡層,鏈路層)。大多數(shù)基于internet的應用程序被看作TCP/IP協(xié)議的上一層, 如 : ftp, , smtp, pop3, telnet, nntp等。 IP地址:TCP/IP網(wǎng)絡中的每臺計算機都有唯一的地址-IP地
12、址。在Java中,有一個用來存儲internet地址的類叫InterAddress。Java提供的網(wǎng)絡功能有三大類: URL,Socket,Datagram。1、URL是三大功能中最高級的一種,通過URL Java程序可以直接送出或讀入網(wǎng)絡上的數(shù)據(jù)。2、Socket是傳統(tǒng)網(wǎng)絡程序最常用的方式,可以想象為兩個不同的程序通過網(wǎng)絡的通信信道。3、Datagram是更低級的網(wǎng)絡傳輸方式,它把數(shù)據(jù)的目的紀錄在數(shù)據(jù)包中,然后直接放在網(wǎng)絡上。2.1.3 Socket編程1)TCP/IP協(xié)議TP/IP(Transmission Control Protocol/Internet Protocol)是傳輸控制協(xié)
13、議/網(wǎng)際協(xié)議的縮寫,TCP/IP是當今網(wǎng)絡互聯(lián)的核心協(xié)議。TCP/IP協(xié)議是聊天工具在建立連接下使用的協(xié)議,該協(xié)議是網(wǎng)絡中使用的通訊協(xié)議,包括傳輸控制協(xié)議和網(wǎng)際協(xié)議,TCP/IP協(xié)議是網(wǎng)絡互連的標準協(xié)議,可使不同環(huán)境下不同節(jié)點之間彼此通信,是連入互聯(lián)網(wǎng)的所有計算機在網(wǎng)絡上進行各種信息交換和傳輸所必須采用的協(xié)議。2)TCP/IP協(xié)議進行傳輸數(shù)據(jù)傳輸?shù)倪^程應用程序為了傳輸數(shù)據(jù)會調(diào)用TCP,將數(shù)據(jù)和對應的參數(shù)傳給TCP,將TCP數(shù)據(jù)包封裝在IP包內(nèi),通過網(wǎng)絡送給目的TCP。接收方TCP在接收到數(shù)據(jù)后通知上層應用程序,TCP將保證接收數(shù)據(jù)的正確性。在實現(xiàn)TCP的主機上,TCP可以被看成是一個模塊,和文
14、件系統(tǒng)區(qū)別不大,TCP 也可以調(diào)用一些操作系統(tǒng)的功能,TCP不直接和網(wǎng)絡打交道,控制網(wǎng)絡的任務由專門的設備驅(qū)動模塊完成。TCP只是調(diào)用IP接口,向TCP提供所有TCP需要的服務。3)端口號有的時候,一個ip地址不能完整的標識一臺服務器,這是應為一臺物理性的計算機同時運行著多個應用程序,這就需要我們來區(qū)別同一臺機子上的不同的服務,所以就在傳輸層和應用層上設置接口,就是端口。端口實際是一個16位長的地址,它的范圍是065535之間,其中01023是熟知端口,主要是給提供服務的應用程序使用,這些端口是所有應用進程都知道的,102465535為一般端口,也稱動態(tài)端口、連接端口,用來隨時分配要求通信的各
15、個客戶端應用程序。在數(shù)據(jù)傳輸過程中,各種服務器不斷的檢測分配給它的端口,一邊發(fā)現(xiàn)要求和它通信的客戶端。4)Socket通信機制Socket,簡稱套接字,用于實現(xiàn)網(wǎng)絡上客戶和服務器之間的連接。也就是說網(wǎng)絡上兩個或兩個以上雙工方式通信的進程之間總有一個連接,這個連接的端點稱為套接字,套接字是在比較低的層次上通信的。Socket所完成的通信時一種基于連接的通信,即在通信開始之前先由通信雙方確認身份并建立一條專用的虛擬連接通道,然后他們通過這條通道傳送數(shù)據(jù)信息進行通信,當通訊結(jié)束時再將原先所建立的連接斷開。Socket程序的工作過程:1、建立Socket連接:在通信開始之前由通信雙方確認身份,建立一條
16、專用的虛擬連接通道。2、數(shù)據(jù)通信:利用虛擬連接通道傳送數(shù)據(jù)信息。3、關閉:通信結(jié)束時,再將所建的虛擬連接斷開。三次握手:第一次握手:原主機發(fā)送一個帶有本次連接的序號的連接請求。第二次握手:目的主機收到請求后,如果同意連接,則發(fā)回一個帶有一個本次連接序號和源端機連接序列號的確認。第三此握手:源端機收到含有兩次初始序列號的應答后,再向目的主機發(fā)送一個帶有兩次連接的序列號的確認。具體過程如下:主機A 主機BACK=1,SYN=1,SEQ=aaaaaaaaaaACK=1第一次握手,主機A向主機B發(fā)送連接請求第二次握手,主機B收到主機A的請求,向主機A回發(fā)一個確認,同時向主機A發(fā)送一個連接請求第三次握手
17、,主機A收到主機B發(fā)送的數(shù)據(jù)包在向主機B發(fā)送一個確認連接SYN=1,SEQ= 圖2.1 三次握手圖經(jīng)濟可行性:開發(fā)此網(wǎng)絡通訊系統(tǒng)所需的硬件和軟件環(huán)境(Myeclipse 開發(fā)工具;數(shù)據(jù)庫SQL Server),可以從相關網(wǎng)站免費下載。操作可行性:此通信系統(tǒng)具備友好的用戶界面,使用方便,快捷,操作簡單易于維護,易于被用戶接受,用戶只需熟悉操作計算機,和對此系統(tǒng)做簡單的了解可方便使用。技術可行性::Java 技術日趨成熟,java的平臺無關性使得用java的應用程序不用修改就可在不同的軟硬件平臺上運行,它支持數(shù)據(jù)分布和操作分布著兩種分布性。Java提供了一整套網(wǎng)絡類庫,開發(fā)人員可以利用類庫進行網(wǎng)絡
18、程序設計,方便實現(xiàn)java的分布式特性。另外java還支持多線程。Java提供了一個類thread,由它負責啟動、運行、終止線程,并可檢查線程狀態(tài)。利用java的多線程編程接口,開發(fā)人員可以方便的寫出至此后多線程的應用程序,提高程序執(zhí)行效率。開發(fā)軟件環(huán)境:winxp ,Sql server,Myeclipse。2.2.2 系統(tǒng)功能需求分析根據(jù)用戶對聊天工具的要求,可分為以下幾點:(1) 操作簡單方便、界面簡潔美觀;(2) 可以在局域網(wǎng)實現(xiàn)文字和文件的傳輸;(3) 可以實現(xiàn)用戶的注冊、登錄和注銷;(4) 程序啟動之后就能看到當前哪些用戶在線,哪些可以與之進行對等通信??梢詫崿F(xiàn)局域網(wǎng)聊天;(5)
19、一旦有某個網(wǎng)內(nèi)的機器上線或下線了,要有即時通知,并能及時更新用戶界面中的用戶列表;(6) 當單擊用戶列表項的時候,直接在聊天對話框聊天,發(fā)送聊天信息;(7) 當有遠程用戶向本機發(fā)送文件的時候,彈出一個消息提示,用戶可選擇接收或者拒絕;(8) 文件傳輸過程中,應該有當前傳輸狀態(tài)提示,并作為當前網(wǎng)絡狀態(tài)的一種反饋;(9) 為用戶提供一個簡單的聊天記錄保存功能。聊天系統(tǒng)包括服務器端和客戶端。服務器端的主要任務:服務器端應當建立一個ServerSocket,并且不斷進行監(jiān)聽是否有客戶端連接或者斷開連接(包括判斷沒有響應的連接超時);服務器端應當是一個信息發(fā)送中心,所有客戶端的信息都傳到服務器端,由服務
20、器端根據(jù)要求分發(fā)信息。客戶端主要完成的工作包括:與服務器端建立通信通道,向服務器端發(fā)送信息;接收來自服務器的信息。3系統(tǒng)設計本系統(tǒng)中主要包括兩個部分:服務器端和客戶端。(1) 服務器端的功能包括:驗證登錄:檢查登陸信息是否正確,并向客戶端返回登陸信息,如信息正確,就將在線用戶發(fā)給該用戶,并將該用戶的狀態(tài)發(fā)給各在線用戶,同時在服務器端顯示出來。處理注冊信息:用戶提交注冊信息后,自動驗證是否重名,如果重名則返回提示,如果不重名則將信息加入數(shù)據(jù)庫。 處理用戶發(fā)送信息:服務器監(jiān)控聊天內(nèi)容,服務器過濾非法內(nèi)容。發(fā)布系統(tǒng)消息:將此用戶上線、下線消息發(fā)給各客戶端,并在服務器端顯示在線用戶信息。保存聊天記錄:
21、在接收到用戶保存聊天記錄申請的同時,自動保存聊天記錄為文本文件。保存服務器日志。(2) 客戶端的功能包括:用戶登錄:建立與服務器的連接并登錄,能顯示登錄錯誤信息。用戶注冊:建立與服務器連接并提交注冊信息,注冊成功后自動登錄。界面顯示:登錄成功后,自動顯示在線用戶列表。發(fā)送消息:選擇要發(fā)送對象后,可以發(fā)送文本消息或者文件。發(fā)送信息時,可以選擇私聊,即其他人看不到信息。接收消息:收到其他用戶消息后,提醒并顯示。接收文件時可以選擇接收或拒絕。聊天記錄的保存:用戶下線前自動向服務器發(fā)送申請保存聊天記錄。首先由服務器開啟服務,監(jiān)聽局域網(wǎng)中客戶端的連接請求,客戶端連接后,登錄或者處理注冊信息,并返回操作結(jié)
22、果。客戶端注冊或者登錄成功后,顯示聊天窗體,此時各客戶端將自主的監(jiān)聽局域網(wǎng)中的用戶,實時更新自己的用戶列表并顯示,各個客戶端之間的信息交流不再通過服務器轉(zhuǎn)發(fā),而是自主通信。局域網(wǎng)聊天系統(tǒng)的業(yè)務流程圖如圖所示: 客戶端聊天窗口協(xié)議發(fā)送消息 服務器聊天窗口 記錄所有注冊用戶和顯示當前在線人數(shù)發(fā)送消息發(fā)送消息 客戶端登錄窗口登錄驗證登錄注冊判斷Y聊天程序一般都是以服務器提供服務端連接響應,使用者通過客戶端程序登錄到服務器,就可以與登錄在同一服務器上的用戶交談,這是一個面向連接的通信過程。因此,程序要在TCP/IP環(huán)境下,實現(xiàn)服務器端和客戶端兩部分程序。客戶與服務器之間用TCP協(xié)議連接,客戶與客戶之間
23、通過服務器轉(zhuǎn)發(fā)消息.其中用到了Socket,它是介于應用程序與硬件之間,并可以提供標準的函數(shù)以符合不同的網(wǎng)絡硬件規(guī)格。圖3.2 系統(tǒng)實現(xiàn)原理圖 軟件模塊化設計方法是從計算機實現(xiàn)的角度出發(fā)對整個軟件進行審核和校驗,將整個系統(tǒng)劃分為不同的功能模塊,實現(xiàn)軟件的一個特定功能。各個功能模塊之間具有相對獨立性,便于整個軟件的設計、實施、維護和擴充。這種模塊化結(jié)構(gòu)設計方法,為整個軟件順利進行奠定了基礎。3. 數(shù)據(jù)庫設計系統(tǒng)需求主要體現(xiàn)在用戶的注冊、登錄、發(fā)送消息、接收消息、聊天記錄的保存等方面,而本系統(tǒng)發(fā)送消息,接收消息,聊天記錄保存均有客戶端自主完成,因此不需要體現(xiàn)在數(shù)據(jù)庫中,這樣數(shù)據(jù)庫只需存儲用戶的信息
24、即可。數(shù)據(jù)庫采用sql server,,里面建立了2個表,存儲用戶包含登錄賬號和密碼的用戶信息yonghu 表,用戶發(fā)送消息記錄的信息表log表。表3.1 用戶的基本信息表列名custnamecusPasswordagesexemailhead用戶名密碼年齡性別電子郵箱頭像vcharvcharvcharvcharvcharvcharlog表字段:登錄用戶(id),消息記錄,時間開發(fā)環(huán)境: 應用服務器數(shù)據(jù)庫服務器系統(tǒng):內(nèi)存2G,硬盤320G運行環(huán)境:本系統(tǒng)是用Myeclipse工具開發(fā)的,所以首先要安裝Myeclipse工具。這次的設計是在windows系統(tǒng)下,要先安裝java的jdk 來支持M
25、yeclipse的運行。本系統(tǒng)的安裝環(huán)境為:Windows XP+JDK1.7 +Myeclipse 8.5.客戶端用來向服務器端發(fā)起一個連接,等待服務器的允許接入確認。若服務器端同意連接請求,接收到服務器的同意連接信號后,開啟接收信息線程,并置消息發(fā)送事件為Enable,通信雙方就可以進行文本聊天了。若服務器端拒絕連接,則釋放Socket連接并關閉網(wǎng)絡流。若已建立連接,當斷開連接時,將向?qū)Ψ桨l(fā)送斷開信號,然后將釋放Socket和網(wǎng)絡流,不影響到下一次連接的發(fā)起。ChatClientLoginWindowsCloseRegisterChatRoom啟動客戶端窗體監(jiān)聽程序用戶注冊窗體用戶聊天窗體
26、用戶登錄窗體ChatClient.java 為客戶端程序啟動類,負責客戶端的啟動和退出。Login.java 為客戶端程序登錄界面,負責用戶帳號信息的驗證與反饋。Register.java 為客戶端程序注冊界面,負責用戶帳號信息的注冊驗證與反饋。ChatRoom.java 為客戶端程序聊天室主界面,負責接收、發(fā)送聊天內(nèi)容等。 Windowclose 為ChatRoom.java的內(nèi)部類,負責監(jiān)聽聊天室界面的操作,當用戶退出時返回給服務器信息。聊天內(nèi)容過濾器AppServerConnectionWordFilterServerFrame服務器監(jiān)聽控制窗體啟動服務器監(jiān)聽處理用戶請求圖3.4 服務器
27、端結(jié)構(gòu)圖ServeFrame.java 為服務器端程序界面,負責為服務器的啟動提供界面服務。AppServer.java 為服務器端啟動界面,負責監(jiān)聽服務器的狀態(tài)、在線人數(shù)、最多在線人數(shù)、服務器名稱、訪問協(xié)議、服務器IP、服務器端口以及用戶信息的管理、日志的保存。Connection.java 是連接服務器和客戶端的橋梁,主要負責將客戶端的信息傳送給服務器,并將服務器端的信息反饋給客戶端,即所謂的“三次握手”,也是Socket編程的重要部分。WordFilter.java 負責將聊天過程中不合法的文字語句等過濾掉,返回合法內(nèi)容。4 系統(tǒng)實現(xiàn)當服務器收到用戶注冊請求后,開始接收該客戶傳遞的消息,
28、如用戶的昵稱、密碼、性別、頭像、個人資料等信息。接收完畢后,服務器通過jdbc 與后臺數(shù)據(jù)庫連接,向數(shù)據(jù)庫添加記錄。注冊事件處理是客戶端注冊的主要部分。Java事件包括鍵盤事件,鼠標事件和按鈕事件,而所用到的是鼠標事件就是點擊鼠標時,系統(tǒng)會調(diào)用監(jiān)聽器。注冊流程圖:建立連接發(fā)送連接請求Socket請求連接信息發(fā)送完畢個人信息發(fā)送個人信息建立連接接收ServerSocket停止接收接收信息數(shù)據(jù)庫執(zhí)行數(shù)據(jù)庫添加本界面要填寫的項目包括:用戶名,密碼,郵件地址,需要選擇的項目包括:性別,頭像。 本界面主要負責將用戶的信息包裝成一個customer 對象。注冊按鈕一旦被點擊,就會試圖創(chuàng)建一個與服務器端的連
29、接。連接創(chuàng)建成功就會將填寫的信息發(fā)送到服務器端。圖4.2 注冊界面 public void register()Register_Customer data=new Register_Customer(); data.custName = txtUserName.getText();data.custPassword = pwdUserPassword.getText();data.age = txtAge.getText(); data.sex = rbtnMale.isSelected()?"男":"女"data.email = txtEmail.g
30、etText();data.head = comboBox.getSelectedItem().toString();try Socket toServer; toServer = new Socket(strServerIp,1001); ObjectOutputStream streamToServer=new ObjectOutputStream (toServer.getOutputStream(); streamToServer.writeObject(Register_Customer)data); BufferedReader fromServer=new BufferedRea
31、der(new InputStreamReader(toServer.getInputStream(); String status=fromServer.readLine(); JOptionPane op=new JOptionPane(); op.showMessageDialog(null,status); if(status.equals(data.custName+"注冊成功") txtUserName.setText(""); pwdUserPassword.setText(""); pwdConfirmPass.set
32、Text(""); txtAge.setText(""); txtEmail.setText(""); streamToServer.close(); fromServer.close(); catch(Exception e) Syetem.out.println(e); 4.2 登錄模塊4.2.1 登錄界面用戶登錄首先要與服務器連接,服務器的連接是在Connection類中實現(xiàn)。本界面需要填寫的有兩個,一個是用戶名,一個是密碼。在客戶端,用戶輸入用戶名和密碼,然后建立與服務器的連接,告訴服務器我要登錄,服務器收到后,開始通過jdb
33、c讀取數(shù)據(jù)庫,然后與用戶輸入的信息比較,否則返回錯誤。圖4.3 登錄界面4.2.2 源代碼public void login() Customer data = new Customer();data.custName = txtUserName.getText();data.custPassword = pwdPassword.getText();try Socket toServer;toServer = new Socket(strServerIp, 1001); ObjectOutputStream streamToServer = new ObjectOutputStream(toS
34、erver.getOutputStream();streamToServer.writeObject(Customer) data);BufferedReader fromServer = new BufferedReader(new InputStreamReader(toServer.getInputStream();String status = fromServer.readLine();if (status.equals("登錄成功") new ChatRoom(String) data.custName, strServerIp);this.dispose();
35、streamToServer.close();fromServer.close();toServer.close(); else JOptionPane.showMessageDialog(null, status);streamToServer.close();fromServer.close();toServer.close(); catch (Exception e) e.printStackTrace(); 4.3消息通信模塊:與顯示的在線好友間通信凡是聊天工具,都少不了文本聊天功能,這是個基本功能。通過文本聊天,局域網(wǎng)內(nèi)用戶能夠發(fā)送和接收文字信息,并在程序窗體上顯示出來,相互之間進行
36、在線交流,并能根據(jù)用戶需要,對聊天記錄進行簡單的保存。文本聊天的信息傳輸協(xié)議主要有面向連接的TCP和無連接的UDP。TCP協(xié)議是互聯(lián)網(wǎng)中最重要的協(xié)議之一,主要特點是:保證數(shù)據(jù)包的準確到達;保證各數(shù)據(jù)包到達的順序和數(shù)據(jù)包發(fā)出的順序相同。UDP協(xié)議提供了快速但不一定可靠的傳輸服務,UDP協(xié)議采用無連接的套接字,不需要在網(wǎng)絡設備之間發(fā)送連接信息,和TCP相比,UDP缺乏雙方的握手信號,因此不保證數(shù)據(jù)包一定到達目的地,可靠性不如TCP,而且,由于UDP沒有任何對雙方會話的支持,不能保證各數(shù)據(jù)包到達的順序與數(shù)據(jù)包發(fā)出的順序相同。用戶需要發(fā)送信息時,在聊天內(nèi)容里寫下要發(fā)送的信息,然后點擊發(fā)送就可以發(fā)送到其
37、他客戶端,也可以選擇私聊、聊天表情,聊天信息通過服務器發(fā)送到其他客戶端。多人在線時,對某個人私聊,而第三個人的聊天界面不會看到私聊信息。圖4.4 用戶聊天窗口發(fā)送消息:public void sendMessage() Chat chatobj = new Chat();chatobj.chatUser = strLoginName;chatobj.chatMessage = txtMessage.getText();chatobj.chatToUser = String.valueOf(cmbUser.getSelectedItem();chatobj.whisper = chPrivate
38、Chat.isSelected() ? true : false;chatobj.emote = emote.getSelectedItem().toString();try Socket toServer = new Socket(strServerIp, 1001);ObjectOutputStream outObj = new ObjectOutputStream(toServer.getOutputStream();outObj.writeObject(chatobj);txtMessage.setText(""); outObj.close();toServer.
39、close(); catch (Exception e) 4.4 服務器端4.4.1 服務器端界面 服務器端界面主要包含:當前在線人數(shù)、服務器名稱 、服務器IP 、服務器端口 、用戶注冊、登錄、退出的信息 ,在線用戶列表 、發(fā)送系統(tǒng)消息等。圖4.5 服務器端界面 1圖4.6 服務器端界面2 4.4.2 源代碼public Connection(ServerFrame frame, Socket client, Vector u, Vector c) netClient = client;userOnline = u;userChat = c;sFrame = frame;try fromCli
40、ent = new ObjectInputStream(netClient.getInputStream();toClient = new PrintStream(netClient.getOutputStream(); netClient.close(); catch (Exception e) System.out.println(e);return;this.start();public void run() try obj = (Object) fromClient.readObject();if (obj.getClass().getName().equals("Custo
41、mer") serverLogin(); if (obj.getClass().getName().equals("Register_Customer") serverRegiste(); if (obj.getClass().getName().equals("Message") serverMessage(); if (obj.getClass().getName().equals("Exit") serverExit(); netClient.close(); catch (Exception e) System.ou
42、t.println(e); public void serverLogin() try Customer clientMessage2 = (Customer) obj;FileInputStream file3 = new FileInputStream("user.txt");ObjectInputStream objInput1 = new ObjectInputStream(file3); vList = (Vector) objInput1.readObject();int find = 0; for (int i = 0; i < vList.size()
43、; i+) Register_Customer reg = (Register_Customer) vList.elementAt(i);if (reg.custName.equals(clientMessage2.custName) find = 1;if(!reg.custPassword.equals(clientMessage2.custPassword) toClient.println("密碼不正確");break; else int login_flag = 0; for (int a = 0; a < userOnline.size(); a+) St
44、ring _custName = (Customer) userOnline.elementAt(a).custName; if (clientMessage2.custName.equals(_custName) login_flag = 1;break; if (login_flag = 0) clientMessage2.custHead = reg.head; userOnline.addElement(clientMessage2); toClient.println("登錄成功"); Date t = new Date();log("用戶"
45、+ clientMessage2.custName + "登錄成功,"+ "登錄時間:" + t.toLocaleString() + "n"); freshServerUserList(); break; else toClient.println("該用戶已登錄"); if (find = 0) toClient.println("沒有這個用戶,請先注冊");file3.close();objInput1.close();fromClient.close();catch (Exception
46、 e) System.out.println(e); private void freshServerUserList() String userList = new String50;Customer cus = null;for (int j = 0; j < userOnline.size(); j+) cus = (Customer) userOnline.get(j);userListj = cus.custName;sFrame.list.setListData(userList);sFrame.txtNumber.setText("" + userOnl
47、ine.size();sFrame.lblUserCount.setText("當前在線人數(shù):" + userOnline.size();public void serverRegiste() try int flag = 0; Register_Customer clientMessage = (Register_Customer) obj;File fList = new File("user.txt");if (fList.length() != 0)ObjectInputStream objInput = new ObjectInputStrea
48、m(new FileInputStream(fList);vList = (Vector) objInput.readObject();for (int i = 0; i < vList.size(); i+) Register_Customer reg = (Register_Customer) vList.elementAt(i);if (reg.custName.equals(clientMessage.custName) toClient.println("注冊名重復,請另外選擇");flag = 1;break; else if (reg.custName.
49、equals("所有人") toClient.println("禁止使用此注冊名,請另外選擇");flag = 1;break;if (flag = 0) vList.addElement(clientMessage); FileOutputStream file = new FileOutputStream(fList);ObjectOutputStream objout = new ObjectOutputStream(file);objout.writeObject(vList);toClient.println(clientMessage.cus
50、tName + "注冊成功");Date t = new Date();log("用戶" + clientMessage.custName + "注冊成功, " + "注冊時間:"+ t.toLocaleString() + "n");file.close();objout.close();fromClient.close(); catch (Exception e) System.out.println(e);public void serverExit() Exit exit = new Exit();exit = (Exit) obj;removeUser(exit);if (sFrame.ti.e
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《動脈瘤性骨囊腫》課件
- 軸承品牌框架合同范例
- 鍍鋅水槽轉(zhuǎn)讓合同范例
- 購房意向定金合同范例
- 酒店廚師長期雇傭合同范例
- 技術參股合同范例
- 消防銷售合同范例
- 個人購買別墅合同范例
- 服裝租賃合同范例范例pdf
- 農(nóng)村田地運貨合同范例
- 偉大的《紅樓夢》智慧樹知到期末考試答案章節(jié)答案2024年北京大學
- 2024年中儲糧集團招聘筆試參考題庫附帶答案詳解
- 24春國家開放大學《地域文化(本)》形考任務1-4參考答案
- 高等數(shù)學(高職教育)全套教學課件
- 瑞幸咖啡品牌營銷策略研究報告
- 醫(yī)學科研的道德與倫理
- 小學一年級上冊數(shù)學口算訓練題
- 江西省景德鎮(zhèn)市2023-2024學年高二上學期1月期末考試物理試題
- 期末試卷-2023-2024學年語文六年級上冊統(tǒng)編版
- 2024年1月國開電大法律事務??啤斗勺稍兣c調(diào)解》期末考試試題及答案
- 快速響應客戶需求機制
評論
0/150
提交評論