基于Java的聊天室程序設(shè)計(jì)_第1頁(yè)
基于Java的聊天室程序設(shè)計(jì)_第2頁(yè)
基于Java的聊天室程序設(shè)計(jì)_第3頁(yè)
基于Java的聊天室程序設(shè)計(jì)_第4頁(yè)
基于Java的聊天室程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

PAGE20基于Java的聊天室程序設(shè)計(jì)CHATROOMPROGRAMMINGBASEDONJAVAPAGEI摘要網(wǎng)絡(luò)聊天室是一種應(yīng)用廣泛的網(wǎng)絡(luò)聊天方式,操作簡(jiǎn)單,功能豐富,是教學(xué)和學(xué)習(xí)面向?qū)ο蟮木幊趟枷氲睦硐腠?xiàng)目。可以使用多種編程語(yǔ)言和開(kāi)發(fā)功能完善網(wǎng)絡(luò)聊天室。本畢業(yè)設(shè)計(jì)論文介紹用Java語(yǔ)言設(shè)計(jì)和實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)聊天室的過(guò)程,本系統(tǒng)采用C/S架構(gòu)設(shè)計(jì),整個(gè)項(xiàng)目分為服務(wù)器端和客戶端。使用最新Java2標(biāo)準(zhǔn)Swing組件,開(kāi)發(fā)出簡(jiǎn)潔美觀和布局合理的用戶和服務(wù)器界面;利用Socket網(wǎng)絡(luò)開(kāi)發(fā)急速實(shí)現(xiàn)客戶端和服務(wù)器端的連接訪問(wèn),實(shí)現(xiàn)網(wǎng)絡(luò)功能;通過(guò)對(duì)數(shù)據(jù)流操作的合理設(shè)計(jì),實(shí)現(xiàn)信息傳遞、接受和數(shù)據(jù)保存。同時(shí)采用多線程、多任務(wù)的設(shè)計(jì)思想開(kāi)發(fā)出性能穩(wěn)定,功能全面的服務(wù)器。完整的實(shí)現(xiàn)系統(tǒng)的功能。該聊天室工具主要解決了兩方面的問(wèn)題。服務(wù)器端和客戶端。在服務(wù)器端可以實(shí)現(xiàn)如下功能:能夠處理用戶的注冊(cè);通過(guò)身份驗(yàn)證方式處理用戶登錄;可以向所有在線用戶廣播信息;對(duì)于不良聊天人士給予警告或者趕出聊天室;刪除長(zhǎng)久不使用的用戶信息;配有操作文檔;及時(shí)接收用戶的服務(wù)請(qǐng)求幫助。在客戶端可以實(shí)現(xiàn)如下功能:聊天信息的傳輸,支持私聊,支持表情等功能。關(guān)鍵詞:聊天室;Java;Swing組件;Socket技術(shù)PAGE34PAGEIIABSTRACTThenetworkchatroomisakindofappliedextensivenetworkchatmethod,operateincaseandthefunctionisabundant,ItcanbeusedasagoodcaseforlearningofJavadesignlanguageandtheObject-OrientedProgramminglanguage,Thereismanyprogramminglanguageofdesigntodevelopanetworkchatroomwithperfectfunction.ThisgraduationthesisofdesignintroductionhowtousetheJavalanguagedesignandcarryoutnetworkchatroom,ThesystemadoptiontheC/Sstructuredesign,thewholesystemisdividedintotheserverandclient.UsedstandardmodulesofSwingoflatestJava2,developasimpleanddirectbeautyuserinterface,WemakeuseoftheSockettechnologytointerconnecttheserverandclientbynet-work;organizethedatabygooddesignofdatastreamtosentoracceptthemessagebetweenusersandtorecordthemessagefordataever;wealsousethemulti-threadtomaketheprogramwithmanyfunction.Thischatroom’stoolwillsolvetwomainproblems,oneisserverandtheotheriscustomer.Itwillobtainfollowingfunctionswithserver:handingtheregistrationofcustomer;passingverificationofbodymethod;processingcustomerlogging;broadcastinginformationtoon-linecustomers;warningandevictingbadchatpersonageoutofchatroom;deletinglong-lastthecustomerinformation;havingoperatingtext;acceptingcustomer’sservingrequests.Itwillobtainfollowingfunctionswithcustomer:deliveringthechatinformation;supportingprivatechat;supportingthefacialexpression;ect.Keywords:chat;Java;Swingcomponent;Socket

目錄第一章系統(tǒng)開(kāi)發(fā)的意義及需求分析 1第一節(jié)課題來(lái)源 1第二節(jié)需求分析 1第二章系統(tǒng)開(kāi)發(fā)技術(shù) 2第一節(jié)Java的網(wǎng)絡(luò)功能與編程 2第二節(jié)IP/TCP協(xié)議常識(shí) 3第三節(jié)Socket的簡(jiǎn)介 3第四節(jié)Swing的簡(jiǎn)介 5第五節(jié)C/S結(jié)構(gòu) PAGEREF_Toc296150490\h6第三章系統(tǒng)分析與設(shè)計(jì)方案 8第一節(jié)開(kāi)發(fā)環(huán)境及工具 8第二節(jié)聊天系統(tǒng)的總體設(shè)計(jì)要點(diǎn) \h8第三節(jié)系統(tǒng)的功能模塊劃分及設(shè)計(jì)原理 10第四章系統(tǒng)實(shí)現(xiàn)與最終效果 25第一節(jié)系統(tǒng)工作的過(guò)程 25第二節(jié)使用方法 25第三節(jié)各功能模塊運(yùn)行效果 25第四節(jié)功能模塊測(cè)試 31第五章總結(jié) 32第一節(jié)畢業(yè)設(shè)計(jì)總結(jié)和展望 32第二節(jié)經(jīng)驗(yàn)和感想 32參考文獻(xiàn) 34致謝 35第一章系統(tǒng)開(kāi)發(fā)的意義及需求分析第一節(jié)課題來(lái)源根據(jù)當(dāng)前網(wǎng)絡(luò)的需求,網(wǎng)絡(luò)聊天越來(lái)越受到各種網(wǎng)民所青睞。因此開(kāi)發(fā)網(wǎng)絡(luò)聊天是相當(dāng)有必要,而且在網(wǎng)站內(nèi)增加聊天功能,它不僅可以提高網(wǎng)站的訪問(wèn)量,同時(shí)可以留著訪客,更重要的是讓訪客透過(guò)聊天室實(shí)時(shí)的互相交流。而本人也學(xué)習(xí)過(guò)Java語(yǔ)言,對(duì)網(wǎng)絡(luò)編程也較有興趣,為了更好的考驗(yàn)自己對(duì)Java語(yǔ)言的掌握程度,本人就決定以《基于Java的網(wǎng)絡(luò)聊天室》為畢業(yè)設(shè)計(jì),希望通過(guò)這一次能進(jìn)一步提高本人的網(wǎng)絡(luò)開(kāi)發(fā)編程的能力。第二節(jié)需求分析聊天系統(tǒng)不外乎兩個(gè)方面,服務(wù)器端和客戶端。簡(jiǎn)單分析一下兩個(gè)方面所要完成的任務(wù),對(duì)設(shè)計(jì)這個(gè)程序來(lái)說(shuō),等于完成了一半。首先來(lái)看一下服務(wù)器。服務(wù)器端的任務(wù):1、服務(wù)器端應(yīng)當(dāng)建立一個(gè)ServerSocket,并且不斷進(jìn)行偵聽(tīng)是否有客戶端連接或者斷開(kāi)連接。

2、服務(wù)器端應(yīng)當(dāng)是一個(gè)信息發(fā)送中心,所有客戶端的信息都傳到服務(wù)器端,由服務(wù)器端根據(jù)要求分發(fā)信息。以上就是服務(wù)器端最主要的兩個(gè)任務(wù)。不難看出,服務(wù)器端的任務(wù)并不復(fù)雜。客戶端應(yīng)該完成的工作包括:1、與服務(wù)器端建立通信通道,向服務(wù)器端發(fā)送信息。

2、接收來(lái)自服務(wù)器的信息。相對(duì)服務(wù)器而言,客戶端的任務(wù)更加簡(jiǎn)單,有了以上的簡(jiǎn)單分析,可以知道,解決上述四個(gè)問(wèn)題,即完成了該聊天系統(tǒng)的核心。

第二章系統(tǒng)開(kāi)發(fā)技術(shù)第一節(jié)Java的網(wǎng)絡(luò)功能與編程一、Java概述:美國(guó)硅谷有一句行話,每10年~15年有一次輪回。最近的一次輪回就是從Java開(kāi)始。Java是一個(gè)由Sun公司開(kāi)發(fā)而成的新一代編程語(yǔ)言。使用它可在各式各樣不同種機(jī)器、不同種操作平臺(tái)的網(wǎng)絡(luò)環(huán)境中開(kāi)發(fā)軟件。不論你使用的是哪一種www瀏覽器,哪一種計(jì)算機(jī),哪一種操作系統(tǒng),只要www瀏覽器上面注明了“支持Java”,你就可以看到生動(dòng)的主頁(yè)。Java正在逐步成為Internet應(yīng)用的主要開(kāi)發(fā)語(yǔ)言。它徹底改變了應(yīng)用軟件的開(kāi)發(fā)模式,帶來(lái)了自PC機(jī)以來(lái)又一次技術(shù)革命,為迅速發(fā)展的信息世界增添了新的活力。Java語(yǔ)言有下面一些特點(diǎn):簡(jiǎn)單、面向?qū)ο?、分布式、解釋?zhí)行、安全、體系結(jié)構(gòu)中立、可移植、高性能、多線程以及動(dòng)態(tài)性。豐富的類庫(kù)Java提供了大量的類以滿足網(wǎng)絡(luò)化、多線程、面向?qū)ο笙到y(tǒng)的需要。語(yǔ)言包提供的支持包括字符串處理、多線程處理、數(shù)學(xué)函數(shù)處理等,可以用它簡(jiǎn)單地實(shí)現(xiàn)Java程序的運(yùn)行平臺(tái)。實(shí)用程序包提供的支持包括哈希表、堆棧、可變數(shù)組、時(shí)間和日期等。輸入輸出包用統(tǒng)一的"流"模型來(lái)實(shí)現(xiàn)所有格式的I/O,包括文件系統(tǒng)、網(wǎng)絡(luò)、輸入低級(jí)網(wǎng)絡(luò)包用于實(shí)現(xiàn)Socket編程。抽象圖形用戶接口包實(shí)現(xiàn)了不同平臺(tái)的計(jì)算機(jī)的圖形用戶接口部件,包括窗口、菜單、滾動(dòng)條、對(duì)話框等,使得Java可以移植到不同平臺(tái)的機(jī)器。網(wǎng)絡(luò)包支持Internet的TCP/IP協(xié)議,提供了與Internet的接口。它支持URL連接,WWW的即時(shí)訪問(wèn),并且簡(jiǎn)化了用戶/服務(wù)器模型的程序設(shè)計(jì)。Java和C、C++對(duì)于變量聲明、參數(shù)傳遞、操作符、流控制等使用了相同的傳統(tǒng),使得熟悉C、C++的程序員能很方便地進(jìn)行編程。同時(shí),Java為了實(shí)現(xiàn)其簡(jiǎn)單、安全等特性,也摒棄了C和C++中許多不合理的內(nèi)容[1]。二、Java語(yǔ)言在網(wǎng)絡(luò)上的應(yīng)用Java程序可以獲取網(wǎng)絡(luò)上結(jié)點(diǎn)的圖象、聲音、HTML文檔及文本等資源,并可以對(duì)獲得的資源進(jìn)行處理。例如Java程序可以每隔一定時(shí)間讀取某結(jié)點(diǎn)提供的最新數(shù)據(jù),并以圖表的形式顯示出來(lái)。在編程處理上,一般先生成一個(gè)URL類型的對(duì)象,然后用Java中相應(yīng)的方法(method)獲取該對(duì)象所代表的資源。第二節(jié)IP/TCP協(xié)議常識(shí)一、IP、TCP協(xié)議的特點(diǎn):TCP/IP(TransmissionControlProtocol/InternetProtocol)是傳輸控制協(xié)議/網(wǎng)際協(xié)議的縮寫(xiě),TCP/IP是當(dāng)今網(wǎng)絡(luò)互聯(lián)的核心協(xié)議。TCP/IP協(xié)議的體系結(jié)構(gòu)共有四個(gè)層次,即應(yīng)用層、傳輸層、網(wǎng)絡(luò)互聯(lián)層和網(wǎng)絡(luò)接口層。IP協(xié)議的作用:第一,它是網(wǎng)絡(luò)層的協(xié)議,提供互聯(lián)網(wǎng)上數(shù)據(jù)傳輸?shù)慕y(tǒng)一格式。第二,提供不可靠的無(wú)連接的服務(wù)。第三,定義了互聯(lián)網(wǎng)上的傳輸數(shù)據(jù)的基本單元,提供了供路由選擇的信息,沒(méi)有差錯(cuò)校驗(yàn)和處理的機(jī)制。TCP協(xié)議的功能:差錯(cuò)控制——可靠性、面向連接、分段(Segment)、端口號(hào)。TCP是傳輸控制協(xié)議,是面向連接的提供了一種可靠的傳輸服務(wù),它用三次握手和滑動(dòng)窗口機(jī)制來(lái)保證傳輸?shù)目煽啃?,及進(jìn)行流量控制。二、TCP/IP協(xié)議進(jìn)行傳輸數(shù)據(jù)傳輸?shù)倪^(guò)程:應(yīng)用程序?yàn)榱藗鬏敂?shù)據(jù)會(huì)調(diào)用TCP,將數(shù)據(jù)和對(duì)應(yīng)的參數(shù)傳給TCP,將TCP數(shù)據(jù)包封裝在IP包內(nèi),通過(guò)網(wǎng)絡(luò)送給目的TCP。接收方TCP在接收到數(shù)據(jù)后通知上層應(yīng)用程序,TCP將保證接收數(shù)據(jù)的正確性。在實(shí)現(xiàn)TCP的主機(jī)上,TCP可以被看成是一個(gè)模塊,和文件系統(tǒng)區(qū)別不大,TCP也可以調(diào)用一些操作系統(tǒng)的功能,TCP不直接和網(wǎng)絡(luò)打交道,控制網(wǎng)絡(luò)的任務(wù)由專門的設(shè)備驅(qū)動(dòng)模塊完成。TCP只是調(diào)用IP接口,向TCP提供所有TCP需要的服務(wù)[2]。三、端口號(hào):有的時(shí)候,一個(gè)ip地址不能完整的標(biāo)識(shí)一臺(tái)服務(wù)器,這是因?yàn)橐慌_(tái)物理性的計(jì)算機(jī)同時(shí)運(yùn)行著多個(gè)應(yīng)用程序,這就需要我們來(lái)區(qū)別同一臺(tái)機(jī)子上的不同的服務(wù),所以就在傳輸層和應(yīng)用層上設(shè)置接口,就是端口。端口實(shí)際是一個(gè)16位長(zhǎng)的地址,他的范圍是0~65535之間,其中0~1023是熟知端口,主要是給提供服務(wù)的應(yīng)用程序使用,這些端口是所有應(yīng)用進(jìn)程都知道的,1024~65535為一般端口,也稱動(dòng)態(tài)端口、連接端口,用來(lái)隨時(shí)分配要求通信的個(gè)客戶端應(yīng)用程序。在數(shù)據(jù)傳輸過(guò)程中,各種服務(wù)器不斷的檢測(cè)分配給他的端口,一邊發(fā)現(xiàn)要求和他通信的客戶端[3]。第三節(jié)Socket的簡(jiǎn)介Socket簡(jiǎn)稱套接字,用于實(shí)現(xiàn)網(wǎng)絡(luò)上客戶和服務(wù)器之間的連接。也就是說(shuō)網(wǎng)絡(luò)上兩個(gè)或兩個(gè)以上雙工方式通信的進(jìn)程之間總有一個(gè)連接,這個(gè)連接的端點(diǎn)成為套接字,套接字是在比較低的層次上通信的。Java通過(guò)socket來(lái)完成它所有的網(wǎng)絡(luò)底層的通訊,socket是一種通訊的通道,通過(guò)它可以將數(shù)據(jù)通過(guò)特定的端中發(fā)送及接收。Java中的socket可以分成二大類:DatagramSockets(數(shù)據(jù)包socket)和StreamSockets(流socket)。StreamSocket有一個(gè)永久性的鏈接,可以確保數(shù)據(jù)可靠的發(fā)送到對(duì)方。但是StreamSocket所占的資源更多。Java主要通過(guò)Socket及ServerSocket來(lái)實(shí)現(xiàn)StreamSocket,一個(gè)用于客戶端,另一個(gè)用戶服務(wù)器端。具體的說(shuō):一個(gè)服務(wù)器應(yīng)用程序一般偵聽(tīng)一個(gè)特定的端口等待客戶端的連接請(qǐng)求,當(dāng)一個(gè)連接請(qǐng)求到達(dá)時(shí),客戶端和服務(wù)器端建立一個(gè)通信連接,在連接過(guò)程中,客戶端被分配一個(gè)本地端口與一個(gè)Socket建立連接,客戶端通過(guò)寫(xiě)Socket來(lái)通知服務(wù)器,以讀Socket中的信息,類似的服務(wù)器也獲得一個(gè)本地端口,它需要一個(gè)新的端口號(hào)來(lái)偵聽(tīng)原始端口上的其他連接請(qǐng)求。服務(wù)器也通過(guò)它的本地端口連接一個(gè)Socket,通過(guò)讀寫(xiě)和客戶端通信[8]??蛻魴C(jī)必須知道有關(guān)服務(wù)器的IP地址。對(duì)于著一點(diǎn)Java也提供了一個(gè)相關(guān)的類InetAddress該對(duì)象的實(shí)例必須通過(guò)它的靜態(tài)方法來(lái)提供。它的靜態(tài)方法主要提供了得到本機(jī)IP和通過(guò)名字或IP直接得到InetAddress的方法。上面的方法基本可以建立一條連線讓兩臺(tái)計(jì)算機(jī)相互交流了。數(shù)據(jù)則是通過(guò)I/O流進(jìn)行傳輸。因?yàn)榈讓拥木W(wǎng)絡(luò)是繼續(xù)數(shù)據(jù)的。除非遠(yuǎn)程調(diào)用,處理問(wèn)題的核心在執(zhí)行上。所以你也必須導(dǎo)入Java.io這個(gè)包。Java的IO操作也不復(fù)雜。它提供了針對(duì)于字節(jié)流和Unicode的讀者和寫(xiě)者,然后也提供了一個(gè)緩沖用于數(shù)據(jù)的讀寫(xiě)。而原始的字節(jié)流來(lái)源于Socket的兩個(gè)方法,getInputStream()和getOutputStream()方,分別用來(lái)得到輸入和輸出。服務(wù)器可以不斷接收客戶機(jī)所寫(xiě)入的信息只到。客戶機(jī)發(fā)送"End"字符串就退出程序。并且服務(wù)器也會(huì)做出"Receive"為回應(yīng)。Socket描述符是一個(gè)指向內(nèi)部數(shù)據(jù)結(jié)構(gòu)的指針,它指向描述符表入口。調(diào)用Socket函數(shù)時(shí),socket執(zhí)行體將建立一個(gè)Socket,實(shí)際上"建立一個(gè)Socket"意味著為一個(gè)Socket數(shù)據(jù)結(jié)構(gòu)分配存儲(chǔ)空間。Socket執(zhí)行體為你管理描述符表。

兩個(gè)網(wǎng)絡(luò)程序之間的一個(gè)網(wǎng)絡(luò)連接包括五種信息:通信協(xié)議、本地協(xié)議地址、本地主機(jī)端口、遠(yuǎn)端主機(jī)地址和遠(yuǎn)端協(xié)議端口。Socket數(shù)據(jù)結(jié)構(gòu)中包含這五種信息。一、Socket程序的工作過(guò)程:1.建立Socket連接:在通信開(kāi)始之前由通信雙方確認(rèn)身份,建立一條專用的虛擬連接道。2.數(shù)據(jù)通信:利用虛擬連接通道傳送數(shù)據(jù)信息進(jìn)行通信。3.關(guān)閉:通信結(jié)束時(shí),再將所建的虛擬連接拆除。具體如下:1服務(wù)器1服務(wù)器serversocket2監(jiān)聽(tīng)4.連接5讀6寫(xiě)7關(guān)閉3客戶端socket6讀5寫(xiě)7關(guān)閉圖2-1Socket程序的工作過(guò)程二、三次握手協(xié)議:第一次握手:原主機(jī)發(fā)送一個(gè)帶有本次連接的序號(hào)的請(qǐng)求的一個(gè)數(shù)據(jù)幀第二次握手:目的主機(jī)收到請(qǐng)求后,如果同意連接,則發(fā)回一個(gè)帶有一個(gè)本次連接序號(hào)和源端機(jī)連接序列號(hào)的確認(rèn)。第三此握手:源端機(jī)收到含有兩次初始序列號(hào)的應(yīng)答后,再向目的主機(jī)發(fā)送一個(gè)帶有兩次連接的序列號(hào)的確認(rèn)。具體過(guò)程如下:圖2-2三次握手協(xié)議第四節(jié)Swing的簡(jiǎn)介AWT是Swing的基礎(chǔ)。Swing的產(chǎn)生主要原因就是AWT不能滿足圖形化用戶界面發(fā)展的需要。

AWT設(shè)計(jì)的初衷是支持開(kāi)發(fā)小應(yīng)用程序的簡(jiǎn)單用戶界面。例如AWT缺少剪貼板、打印支持、鍵盤導(dǎo)航等特性,而且原來(lái)的AWT甚至不包括彈出式菜單或滾動(dòng)窗格等基本元素。隨著發(fā)展的需要,Swing出現(xiàn)了,Swing組件幾乎都是輕量組件,與重量組件相比,沒(méi)有本地的對(duì)等組件,不像重量組件要在它們自己的本地不透明窗體中繪制,輕量組件在它們的重量組件的窗口中繪制。Swing是由100%純Java實(shí)現(xiàn)的,Swing組件是用Java實(shí)現(xiàn)的輕量級(jí)(light-weight)組件,沒(méi)有本地代碼,不依賴操作系統(tǒng)的支持,這是它與AWT組件的最大區(qū)別。由于AWT組件通過(guò)與具體平臺(tái)相關(guān)的對(duì)等類(Peer)實(shí)現(xiàn),因此Swing比AWT組件具有更強(qiáng)的實(shí)用性。Swing在不同的平臺(tái)上表現(xiàn)一致,并且有能力提供本地窗口系統(tǒng)不支持的其它特性。Swing采用了一種MVC的設(shè)計(jì)范式,即“模型-視圖-控制”(Model-View-Controller),其中模型用來(lái)保存內(nèi)容,視圖用來(lái)顯示內(nèi)容,控制器用來(lái)控制用戶輸入。Swing外觀感覺(jué)采用可插入的外觀感覺(jué)(PluggableLookandFeel,PL&F)。在AWT組件中,由于控制組件外觀的對(duì)等類與具體平臺(tái)相關(guān),使得AWT組件總是只有與本機(jī)相關(guān)的外觀。Swing使得程序在一個(gè)平臺(tái)上運(yùn)行時(shí)能夠有不同的外觀。用戶可以選擇自己習(xí)慣的外觀。一、框架、監(jiān)聽(tīng)器和事件:框架(Frame,JFrame)是Java圖形用戶界面的基礎(chǔ),它就是我們通常所說(shuō)的窗口,是Windows/XWindow應(yīng)用程序的典型特征。說(shuō)到Windows/XWindow,大家很容易聯(lián)想到“事件(Event)驅(qū)動(dòng)”。Java的圖形用戶界面正是事件驅(qū)動(dòng)的,并且由各種各樣的監(jiān)聽(tīng)器(Listener)負(fù)責(zé)捕捉各種事件。如果我們需要對(duì)某一個(gè)組件的某種事件進(jìn)行捕捉和處理時(shí),就需要為其添加監(jiān)聽(tīng)器。比如,我們要在一個(gè)窗口(JFrame)激活時(shí)改變它的標(biāo)題,我們就需要為這個(gè)窗口(JFrame對(duì)象)添加一個(gè)可以監(jiān)聽(tīng)到“激活窗口”這一事件的監(jiān)聽(tīng)器——WindowListener。添加監(jiān)聽(tīng)器通常由組件類提供的一個(gè)addXxxxxListener的方法來(lái)完成。比如JFrame就提供有addWindowListener方法添加窗口監(jiān)聽(tīng)器(WindowListener)。二、按鈕、切換按鈕、復(fù)選按鈕和單選按鈕切換按鈕,有兩種狀態(tài)的按鈕,即按下?tīng)顟B(tài)和彈起狀態(tài),若稱為選擇狀態(tài)或未選擇狀態(tài)。復(fù)選按鈕,又叫復(fù)選框,用一個(gè)小方框中是否打勾來(lái)表示兩種狀態(tài)。單選按鈕,又叫收音機(jī)按鈕,以小圓框打點(diǎn)表示被選中。常成組出現(xiàn),一組單選按鈕中只有一個(gè)能被選中。除一般按鈕外,其余三種按鈕都有兩種狀態(tài),即選擇(按下)狀態(tài)和未選擇(彈起)狀態(tài)。那么我們又該如何判斷呢?切換按鈕(JToggleButton)提供了一個(gè)isSelected()方法用來(lái)判斷當(dāng)前所處的狀態(tài),返回值為真(true)時(shí)表示它處于選擇狀態(tài),返回值為假(false)時(shí)表示它處于未選擇狀態(tài)。而復(fù)選按鈕(JCheckBox)和單選按鈕(JRadioButton)都是從JToggleButton繼承的,所以也具有isSelected()方法。三、文本輸入框、密碼輸入框文本輸入框包括兩種,單行文本輸入框(JTextField)和多行文本輸入框(JTextArea)。密碼輸入框則只有一種(JPasswordField)。JPasswordField是JTextField的子類,它們的主要區(qū)別是JPasswordField不會(huì)顯示出用戶輸入的東西,而只會(huì)顯示出程序員設(shè)定的一個(gè)固定字符,比如'*'或者'#'。四、窗格、滾動(dòng)窗格和布局管理窗格(JPanel)和滾動(dòng)窗格(JScrollPane)在圖形用戶界面設(shè)計(jì)中大量用于各種組件在窗口上的布置和安排。這里所謂的布置和安排,就是布局(Layout)。將加入到容器(通常為窗口等)的組件按照一定的順序和規(guī)則放置,使之看起來(lái)更美觀,這就是布局。布局由布局管理器(LayoutManager)來(lái)管理。

我們?cè)O(shè)計(jì)一個(gè)窗口,其中是要添加若干組件的。為了管理好這些管理的布局,我們就要使用布局管理器。比如說(shuō),設(shè)計(jì)一個(gè)簡(jiǎn)單的編輯器,這個(gè)編輯器中只需要放置兩個(gè)按鈕和一個(gè)多行文本框。這些組件是是按照一定的位置關(guān)系較規(guī)范的安排的。那么,為了按照一定的位置關(guān)系安排這些組件,需要用到布局管理器了。常用的布局管理器有:FlowLayout、BorderLayout、GridLayout、BoxLayout等,其中FlowLayout和BorderLayout最常用。第五節(jié)C/S結(jié)構(gòu)C/S結(jié)構(gòu),即大家熟知的客戶機(jī)和服務(wù)器結(jié)構(gòu)。它是軟件系統(tǒng)體系結(jié)構(gòu),通過(guò)它可以充分利用兩端硬件環(huán)境的優(yōu)勢(shì),將任務(wù)合理分配到Client端和Server端來(lái)實(shí)現(xiàn),降低了系統(tǒng)的通訊開(kāi)銷。目前大多數(shù)應(yīng)用軟件系統(tǒng)都是Client/Server形式的兩層結(jié)構(gòu),由于現(xiàn)在的軟件應(yīng)用系統(tǒng)正在向分布式的Web應(yīng)用發(fā)展,Web和Client/Server應(yīng)用都可以進(jìn)行同樣的業(yè)務(wù)處理,應(yīng)用不同的模塊共享邏輯組件;因此,內(nèi)部的和外部的用戶都可以訪問(wèn)新的和現(xiàn)有的應(yīng)用系統(tǒng),通過(guò)現(xiàn)有應(yīng)用系統(tǒng)中的邏輯可以擴(kuò)展出新的應(yīng)用系統(tǒng)。這也就是目前應(yīng)用系統(tǒng)的發(fā)展方向。Client/Server或客戶/服務(wù)器模式:Client和Server常常分別處在相距很遠(yuǎn)的兩臺(tái)計(jì)算機(jī)上,Client程序的任務(wù)是將用戶的要求提交給Server程序,再將Server程序返回的結(jié)果以特定的形式顯示給用戶;Server程序的任務(wù)是接收客戶程序提出的服務(wù)請(qǐng)求,進(jìn)行相應(yīng)的處理,再將結(jié)果返回給客戶程序。一、C/S工作模式C/S結(jié)構(gòu)的基本原則是將計(jì)算機(jī)應(yīng)用任務(wù)分解成多個(gè)子任務(wù),由多臺(tái)計(jì)算機(jī)分工完成,即采用“功能分布”原則??蛻舳送瓿蓴?shù)據(jù)處理,數(shù)據(jù)表示以及用戶接口功能;服務(wù)器端完成DBMS的核心功能。這種客戶請(qǐng)求服務(wù)、服務(wù)器提供服務(wù)的處理方式是一種新型的計(jì)算機(jī)應(yīng)用模式。二、C/S結(jié)構(gòu)的優(yōu)點(diǎn)C/S結(jié)構(gòu)的優(yōu)點(diǎn)是能充分發(fā)揮客戶端PC的處理能力,很多工作可以在客戶端處理后再提交給服務(wù)器。對(duì)應(yīng)的優(yōu)點(diǎn)就是客戶端響應(yīng)速度快。缺點(diǎn)主要有以下幾個(gè):只適用于局域網(wǎng)。而隨著互聯(lián)網(wǎng)的飛速發(fā)展,移動(dòng)辦公和分布式辦公越來(lái)越普及,這需要我們的系統(tǒng)具有擴(kuò)展性。這種方式遠(yuǎn)程訪問(wèn)需要專門的技術(shù),同時(shí)要對(duì)系統(tǒng)進(jìn)行專門的設(shè)計(jì)來(lái)處理分布式的數(shù)據(jù)。客戶端需要安裝專用的客戶端軟件。首先涉及到安裝的工作量,其次任何一臺(tái)電腦出問(wèn)題,如病毒、硬件損壞,都需要進(jìn)行安裝或維護(hù)。特別是有很多分部或?qū)Yu店的情況,不是工作量的問(wèn)題,而是路程的問(wèn)題。還有,系統(tǒng)軟件升級(jí)時(shí),每一臺(tái)客戶機(jī)需要重新安裝,其維護(hù)和升級(jí)成本非常高。

第三章系統(tǒng)分析與設(shè)計(jì)方案第一節(jié)開(kāi)發(fā)環(huán)境及工具本系統(tǒng)所用的工具:服務(wù)器端:(Windows平臺(tái))首先應(yīng)有Java環(huán)境jdk,建議采用jdk1.4.2;Eclipse??蛻舳耍篔ava環(huán)境jdk,建議jdk1.42;Eclipse。本系統(tǒng)運(yùn)行所需用到的環(huán)境為:硬件配置:中央處理器(CPU):P42.0G以上的處理器;硬盤:40GB以上硬盤;內(nèi)存:256以上的DDR內(nèi)存;顯卡:128M以上顯存顯卡軟件配置:WINDOWSXP版本、All-In-One-Eclipse-311、j2sdk-1.42等。第二節(jié)聊天系統(tǒng)的總體設(shè)計(jì)要點(diǎn)一、實(shí)現(xiàn)思想在Internet上的聊天程序一般都是以服務(wù)器提供服務(wù)端連接響應(yīng),使用者通過(guò)客戶端程序登錄到服務(wù)器,就可以與登錄在同一服務(wù)器上的用戶交談,這是一個(gè)面向連接的通信過(guò)程。因此,程序要在TCP/IP環(huán)境下,實(shí)現(xiàn)服務(wù)器端和客戶端兩部分程序。服務(wù)器端工作流程:服務(wù)器端通過(guò)系統(tǒng)調(diào)用創(chuàng)建一個(gè)ServerSocket與指定的本地端口綁定,就可以在端口進(jìn)行偵聽(tīng)。如果有客戶端連接請(qǐng)求,則創(chuàng)建一個(gè)Socket,將客戶端地址賦給這個(gè)Socket。然后登錄成功的客戶就可以在服務(wù)器上聊天了??蛻舳斯ぷ髁鞒?客戶端程序相對(duì)簡(jiǎn)單,只需要建立一個(gè)Socket與服務(wù)器端連接,成功后通過(guò)這個(gè)Socket來(lái)發(fā)送和接收數(shù)據(jù)就可以了。二、系統(tǒng)功能流圖:否否是服務(wù)器serversocket監(jiān)聽(tīng)建立與客戶端連接的套接字1.讀客戶端信息2.向客戶端轉(zhuǎn)發(fā)信息關(guān)閉服務(wù)器客戶端socket1.讀服務(wù)端信息2.向服務(wù)器寫(xiě)信息關(guān)閉客戶端啟動(dòng)AppServer.java啟動(dòng)ChatClient.java登錄注冊(cè)是否注冊(cè)圖3-1系統(tǒng)功能流圖功能流說(shuō)明如下:1.啟動(dòng)服務(wù)器程序,服務(wù)器端創(chuàng)建一個(gè)ServerSocket對(duì)象,指定端口號(hào)。2.ServerSocket對(duì)象等候客戶端的連接請(qǐng)求。3.啟動(dòng)客戶端程序,登錄用戶。如果未注冊(cè),先注冊(cè)再登錄。登錄成功進(jìn)入聊天室用戶界面。4.客戶端創(chuàng)建一個(gè)Socket對(duì)象,指定主機(jī)地址和端口號(hào),向服務(wù)器發(fā)送連接請(qǐng)求。5.服務(wù)器端收到客戶端請(qǐng)求,建立一條TCP連接,再創(chuàng)建一個(gè)Socket對(duì)象與客戶端的Socket對(duì)象進(jìn)行通信。6.服務(wù)器端和客戶端分別建立字節(jié)輸入/輸出流,進(jìn)行數(shù)據(jù)傳輸準(zhǔn)備。7.服務(wù)器端和客戶端通過(guò)各自的字節(jié)輸入流獲得對(duì)方發(fā)送過(guò)來(lái)的數(shù)據(jù),通過(guò)字節(jié)輸出向?qū)Ψ桨l(fā)送數(shù)據(jù)。8.一方?jīng)Q定結(jié)束通信,向?qū)Ψ桨l(fā)送結(jié)束信息,另一方收到結(jié)束信息后,雙方分別關(guān)閉各自的TCP連接。9.對(duì)象停止等候客戶端連接請(qǐng)求。三、多用戶實(shí)時(shí)工作原理圖圖3-2多用戶實(shí)時(shí)工作原理圖注:服務(wù)器的run()方法中采用了while(true)結(jié)構(gòu),不斷監(jiān)聽(tīng)客戶端的請(qǐng)求,如收到請(qǐng)求,建立與當(dāng)前請(qǐng)求的客戶端連接的套接字,從而與客戶端建立聯(lián)系。第三節(jié)系統(tǒng)的功能模塊劃分及設(shè)計(jì)原理當(dāng)用戶聊天時(shí),將當(dāng)前用戶名、聊天對(duì)象、聊天內(nèi)容和是否私聊進(jìn)行封裝并且序列化,然后與服務(wù)器建立Socket連接,再用對(duì)象輸出流包裝Socket的輸出流將聊天信息對(duì)象發(fā)送給服務(wù)器端。當(dāng)用戶發(fā)送聊天信息時(shí),服務(wù)端將會(huì)收到客戶端用Socket傳輸過(guò)來(lái)的聊天信息對(duì)象,然后將其強(qiáng)制轉(zhuǎn)換為Chat對(duì)象,并將本次用戶的聊天信息對(duì)象添加到聊天對(duì)象集Message中,以供所有聊天用戶訪問(wèn)。接收用戶的聊天信息是由多線程技術(shù)實(shí)現(xiàn)的,因?yàn)榭蛻舳吮仨殨r(shí)時(shí)關(guān)注更新服務(wù)器上是否有最新消息,在本程序中設(shè)定的是1秒刷新服務(wù)器一次,如果間隔時(shí)間太短將會(huì)增加客戶端與服務(wù)器端的通信負(fù)擔(dān),而間隔時(shí)間長(zhǎng)就會(huì)讓人感覺(jué)沒(méi)有時(shí)效性,所以經(jīng)過(guò)權(quán)衡后認(rèn)為1秒最佳,因?yàn)槊總€(gè)用戶都不可能在1秒內(nèi)連續(xù)發(fā)送信息。當(dāng)每次用戶接收到聊天信息后將會(huì)開(kāi)始分析聊天信息然后將適合自己的信息人性化顯示在聊天信息界面上。一、服務(wù)器程序模塊(AppServer.Java)服務(wù)器與客戶間通過(guò)套接口Socket(TCP)連接。在Java中使用套接口相當(dāng)簡(jiǎn)單,JavaAPI為處理套接口的通信提供了一個(gè)類Java/r/.Socket,使得編寫(xiě)網(wǎng)絡(luò)應(yīng)用程序相對(duì)容易。服務(wù)器采用多線程以滿足多用戶的請(qǐng)求,并通過(guò)創(chuàng)建一個(gè)ServerSocket對(duì)象來(lái)監(jiān)聽(tīng)來(lái)自客戶的連接請(qǐng)求,默認(rèn)端口為8000,然后無(wú)限循環(huán)調(diào)用accept()方法接受客戶程序的連接。服務(wù)器具有以下功能:1.啟動(dòng)服務(wù),建立偵聽(tīng),接受客戶端連接。2.從流中讀取經(jīng)過(guò)序列化的對(duì)象。3.分析讀取的對(duì)象進(jìn)行相應(yīng)的操作(登錄信息的驗(yàn)證反饋、注冊(cè)信息的驗(yàn)證和反饋、轉(zhuǎn)發(fā)聊天信息等)4.向客戶端發(fā)送系統(tǒng)消息。5.保存日志6.關(guān)閉服務(wù),并向客戶端發(fā)送服務(wù)器關(guān)閉消息。服務(wù)器程序模塊源碼:privateServerSocketserverSocket;privateServerFramesFrame;privatestaticVectoruserOnline=newVector(1,1);privatestaticVectorv=newVector(1,1);//創(chuàng)建服務(wù)器啟動(dòng)服務(wù)監(jiān)聽(tīng)1001端口publicAppServer(){sFrame=newServerFrame(); try{ serverSocket=newServerSocket(1001); //獲取服務(wù)器的主機(jī)名和IP地址 InetAddressaddress=InetAddress.getLocalHost(); sFrame.txtServerName.setText(address.getHostName()); sFrame.txtIP.setText(address.getHostAddress()); sFrame.txtPort.setText("1001"); }catch(IOExceptione){fail(e,"不能啟動(dòng)服務(wù)!");} sFrame.txtStatus.setText("已啟動(dòng)..."); this.start();//啟動(dòng)線程 }publicstaticvoidfail(Exceptione,Stringstr){ System.out.println(str+"。"+e); } /** *監(jiān)聽(tīng)客戶的請(qǐng)求,當(dāng)有用戶請(qǐng)求時(shí)創(chuàng)建Connection線程 */publicvoidrun(){ try{ while(true){ //監(jiān)聽(tīng)并接受客戶的請(qǐng)求 Socketclient=serverSocket.accept(); newConnection(sFrame,client,userOnline,v);//支持多線程 }}catch(IOExceptione){ fail(e,"不能監(jiān)聽(tīng)!"); } } /** *啟動(dòng)服務(wù)器 */publicstaticvoidmain(Stringargs[]){ newAppServer(); }}當(dāng)用戶發(fā)送聊天信息時(shí),服務(wù)端將會(huì)收到客戶端用Socket傳輸過(guò)來(lái)的聊天信息對(duì)象,然后將其強(qiáng)制轉(zhuǎn)換為Chat對(duì)象,并將本次用戶的聊天信息對(duì)象添加到聊天對(duì)象集Message中,以供所有聊天用戶訪問(wèn)。二、登錄程序模塊(Login.Java)是客戶端程序登錄界面,負(fù)責(zé)用戶帳號(hào)信息的驗(yàn)證與接收服務(wù)器的反饋??蛻舳苏?qǐng)求連接,服務(wù)器的accept()方法建立與客戶端的套接字連接。客戶端將登錄信息封裝成Customer對(duì)象通過(guò)輸出流發(fā)送服務(wù)器,等待服務(wù)器的驗(yàn)證,服務(wù)器反饋驗(yàn)證信息,客戶端根據(jù)反饋信息進(jìn)行登錄和登錄信息錯(cuò)誤處理。關(guān)鍵代碼如下:publicvoidactionPerformed(ActionEventae){Objectsource=ae.getSource();if(source.equals(btnLogin)){//判斷用戶名和密碼是否為空 if(txtUserName.getText().equals("")||pwdPassword.getText().equals("")){JOptionPaneop1=newJOptionPane(); op1.showMessageDialog(null,"用戶名或密碼不能為空"); }else{strServerIp=txtServer.getText(); login(); }}if(source.equals(btnRegister)){ strServerIp=txtServer.getText(); this.dispose(); newRegister(strServerIp); }if(source==btnExit){ System.exit(0); } }//actionPerformed()結(jié)束publicvoidlogin() { //接受客戶的詳細(xì)資料 Customerdata=newCustomer(); data.custName=txtUserName.getText(); data.custPassword=pwdPassword.getText(); try{ //連接到服務(wù)器 SockettoServer; toServer=newSocket(strServerIp,1001); ObjectOutputStreamtreamToServer=newObjectOutputStream(toServer .getOutputStream()); //寫(xiě)客戶詳細(xì)資料到服務(wù)器socket streamToServer.writeObject((Customer)data); //讀來(lái)自服務(wù)器socket的登錄狀態(tài) BufferedReaderfromServer=newBufferedReader( newInputStreamReader(toServer.getInputStream())); Stringstatus=fromServer.readLine(); if(status.equals("登錄成功")){ newChatRoom((String)data.custName,strServerIp); this.dispose(); //關(guān)閉流對(duì)象 streamToServer.close(); fromServer.close(); toServer.close(); }else{ JOptionPane.showMessageDialog(null,status); //關(guān)閉流對(duì)象 streamToServer.close(); fromServer.close(); toServer.close(); } }catch(ConnectExceptione1){ JOptionPane.showMessageDialog(null,"未能建立到指定服務(wù)器的連接!"); }catch(InvalidClassExceptione2){ JOptionPane.showMessageDialog(null,"類錯(cuò)誤!"); }catch(NotSerializableExceptione3){ JOptionPane.showMessageDialog(null,"對(duì)象未序列化!"); }catch(IOExceptione4){ JOptionPane.showMessageDialog(null,"不能寫(xiě)入到指定服務(wù)器!"); } }//login()結(jié)束 /** *啟動(dòng)登陸窗體 *@paramargs */ publicstaticvoidmain(Stringargs[]){ newLogin();}三、注冊(cè)程序模塊(Register.Java)為客戶端程序注冊(cè)界面,負(fù)責(zé)用戶帳號(hào)信息的注冊(cè)驗(yàn)證與反饋。注冊(cè)模塊的原理跟登錄模塊基本相同。注冊(cè)信息封裝成Register_Customer對(duì)象,但服務(wù)器只驗(yàn)證用戶名,且只要求用戶名不重復(fù),服務(wù)器檢驗(yàn)注冊(cè)信息文件中的用戶名,若不重復(fù)則反饋?zhàn)?cè)成功的信息。其他的注冊(cè)信息(密碼、年齡、郵箱)合法性都交給注冊(cè)模塊自己完成。關(guān)鍵代碼如下:publicvoidactionPerformed(ActionEventae) {Objectsource=newObject(); source=ae.getSource();if(source.equals(btnOk))//"確定"按鈕{ register(); } if(source.equals(btnCancel))//"返回"按鈕 { newLogin(); this.dispose(); } if(source.equals(btnClear))//"清空"按鈕 {txtUserName.setText(""); pwdUserPassword.setText(""); pwdConfirmPass.setText(""); txtAge.setText(""); txtEmail.setText(""); } }//actionPerformed()結(jié)束publicvoidregister() { //接受客戶的詳細(xì)資料Register_Customerdata=newRegister_Customer(); data.custName=txtUserName.getText(); data.custPassword=pwdUserPassword.getText(); data.age=txtAge.getText(); data.sex=rbtnMale.isSelected()?"男":"女"; data.email=txtEmail.getText(); data.head=comboBox.getSelectedItem().toString(); //驗(yàn)證用戶名是否為空 if(data.custName.length()==0) { JOptionPane.showMessageDialog(null,"用戶名不能為空"); return; } //驗(yàn)證密碼是否為空 if(data.custPassword.length()==0) { JOptionPane.showMessageDialog(null,"密碼不能為空"); return; } //驗(yàn)證密碼的一致性 if(!data.custPassword.equals(pwdConfirmPass.getText())) { JOptionPane.showMessageDialog(null,"密碼兩次輸入不一致,請(qǐng)重新輸入"); return; } //驗(yàn)證年齡是否為空 if(data.age.length()==0) { JOptionPane.showMessageDialog(null,"年齡不能為空"); return; } //驗(yàn)證年齡的合法性 intage=Integer.parseInt(txtAge.getText()); if(age<=0||age>100){ JOptionPane.showMessageDialog(null,"年齡輸入不合法"); return; } //驗(yàn)證Email的正確性 intFound_flag=0;//判斷標(biāo)志 for(inti=0;i<data.email.length();i++) { if(data.email.charAt(i)=='@') { Found_flag++; } } if(Found_flag!=1) { JOptionPane.showMessageDialog(null,"電子郵箱格式不正確,請(qǐng)重新輸入"); return; } try { //連接到服務(wù)器 SockettoServer; toServer=newSocket(strServerIp,1001); ObjectOutputStreamstreamToServer=newObjectOutputStream(toServer.getOutputStream()); //寫(xiě)客戶詳細(xì)資料到服務(wù)器socket streamToServer.writeObject((Register_Customer)data);//讀來(lái)自服務(wù)器socket的登陸狀態(tài)BufferedReaderfromServer=newBufferedReader(newInputStreamReader(toServer.getInputStream()));Stringstatus=fromServer.readLine();//顯示成功消息JOptionPaneop=newJOptionPane();op.showMessageDialog(null,status);if(status.equals(data.custName+"注冊(cè)成功")) {txtUserName.setText("");pwdUserPassword.setText("");pwdConfirmPass.setText("");txtAge.setText("");txtEmail.setText(""); }//關(guān)閉流對(duì)象 streamToServer.close();fromServer.close(); } catch(InvalidClassExceptione1) { JOptionPane.showMessageDialog(null,"類錯(cuò)誤!"); } catch(NotSerializableExceptione2) { JOptionPane.showMessageDialog(null,"對(duì)象未序列化!"); } catch(IOExceptione3) { JOptionPane.showMessageDialog(null,"不能寫(xiě)入到指定服務(wù)器!"); } }//方法register()結(jié)束 publicstaticvoidmain(Stringargs[]) { newRegister(""); }四、客戶聊天主程序模塊(ChatRoom.Java)客戶通過(guò)Socket(InetAddress,port)建立與服務(wù)器的連接??蛻舳送ㄟ^(guò)構(gòu)造ObjectInputstream,ObjectOutputstream與服務(wù)器建立輸入輸出流,然后雙方通過(guò)該輸入輸出流來(lái)相互傳遞信息,服務(wù)器一旦收到客戶方的連接請(qǐng)求,服務(wù)器accept()方法返回一個(gè)新建的Socket對(duì)象??蛻舳私邮芊?wù)器傳來(lái)的聊天信息進(jìn)行處理后顯示在自己的聊天紀(jì)錄中。同樣客戶端要發(fā)送文件和信息時(shí)也向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器同樣通過(guò)accept()方法返回一個(gè)Socket對(duì)象,客戶端就可也進(jìn)行相應(yīng)的操作。聊天客戶端必須具有以下功能。1.連接服務(wù)器,發(fā)送用戶登陸請(qǐng)求。2.向服務(wù)器發(fā)送聊天信息。3.接收服務(wù)器轉(zhuǎn)發(fā)的了信息。4.接受服務(wù)器發(fā)送的系統(tǒng)消息。關(guān)鍵源碼如下:publicvoidrun(){intintMessageCounter=0;intintUserTotal=0;booleanisFirstLogin=true;//判斷是否剛登陸booleanisFound;//判斷是否找到用戶Vectoruser_exit=newVector();try{ //SockettoServer; //toServer=newSocket(strServerIp,1001); for(;;){ SockettoServer; toServer=newSocket(strServerIp,1001); //將信息發(fā)往服務(wù)器 ObjectInputStreamstreamfromserver=newObjectInputStream( toServer.getOutputStream()); //收來(lái)自服務(wù)器的信息 ObjectInputStreamstreamfromserver=newObjectInputStream( toServer.getInputStream()); messobj=(Message)streamfromserver.readObject(); ////////刷新聊天信息列表////////// if(isFirstLogin)//如果剛登陸 { intMessageCounter=messobj.chat.size();//屏蔽該用戶登陸前的聊天內(nèi)容 isFirstLogin=false; } if(strLoginName.equals(messobj.ti)){ //taUserMessage.append("nibeiti"); exitChatRoom(); JOptionPane.showMessageDialog(null,strLoginName +"你被管理員剔除!"); } if(!serverMessage.equals(messobj.serverMessage)){ serverMessage=messobj.serverMessage; taUserMessage.append("[系統(tǒng)消息]:"+serverMessage+"\n"); } //taUserMessage.setText(""); for(inti=intMessageCounter;i<messobj.chat.size();i++){ Chattemp=(Chat)messobj.chat.elementAt(i); Stringemote=temp.emote; if(emote.equals("表情")){ emote=""; }else{ emote+="地"; } Stringtemp_message; if(temp.chatUser.equals(strLoginName)){ if(temp.chatToUser.equals(strLoginName)){ temp_message="系統(tǒng)提示您:請(qǐng)不要自言自語(yǔ)!"+"\n"; }else{ if(!temp.whisper)//不是悄悄話 { temp_message="【你】對(duì)【"+temp.chatToUser+"】" +emote+"說(shuō):"+temp.chatMessage+"\n"; }else {temp_message="【你】悄悄對(duì)【"+temp.chatToUser +"】"+emote+"說(shuō):"+temp.chatMessage+"\n"; } } }else{ if(temp.chatToUser.equals(strLoginName)){ if(!temp.whisper)//不是悄悄話 { temp_message="【"+temp.chatUser+"】對(duì)【你】" +emote+"說(shuō):"+temp.chatMessage +"\n"; }else{ temp_message="【"+temp.chatUser+"】悄悄對(duì)【你】" +emote+"說(shuō):"+temp.chatMessage +"\n"; } }else{ if(!temp.chatUser.equals(temp.chatToUser))//對(duì)方?jīng)]有自言自語(yǔ) { if(!temp.whisper)//不是悄悄話 { temp_message="【"+temp.chatUser+"】對(duì)【" +temp.chatToUser+"】"+emote +"說(shuō):"+temp.chatMessage+"\n"; }else{ temp_message=""; } }else{ emp_message=""; } } } taUserMessage.append(temp_message); intMessageCounter++;}//顯示用戶進(jìn)入聊天室的信息if(messobj.userOnLine.size()>intUserTotal){//chenminStringtempstr=((Customer)messobj.userOnLine .elementAt(messobj.userOnLine.size()-1)).custName;//Stringtempstr

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論