




已閱讀5頁(yè),還剩62頁(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)介
本科生畢業(yè)設(shè) 計(jì) 姓 名: 學(xué) 號(hào): : 學(xué) 院: 專(zhuān) 業(yè): 論文題目: 專(zhuān) 題: 指導(dǎo)教師: 職 稱(chēng): 摘摘 要要 在網(wǎng)絡(luò)越來(lái)越發(fā)達(dá)的今天,人們對(duì)網(wǎng)絡(luò)的依賴(lài)越來(lái)越多,越來(lái)越離不 開(kāi)網(wǎng)絡(luò),由此而產(chǎn)生的聊天工具越來(lái)越多,例如,國(guó)外的 ICQ、國(guó)內(nèi)騰訊公 司開(kāi)發(fā)的 OICQ?;?Java 網(wǎng)絡(luò)編程的強(qiáng)大功能,本次畢業(yè)設(shè)計(jì)使用 Java 編寫(xiě)一個(gè)聊天系統(tǒng)。 一般來(lái)說(shuō),聊天工具大多數(shù)由客戶端程序和服務(wù)器程序外加服務(wù)器端 用于存放客戶數(shù)據(jù)的數(shù)據(jù)庫(kù)組成,本系統(tǒng)采用客戶機(jī)/服務(wù)器架構(gòu)模式通過(guò) Java 提供的 Soket 類(lèi)來(lái)連接客戶機(jī)和服務(wù)器并使客戶機(jī)和服務(wù)器之間相互 通信,由于聊天是多點(diǎn)對(duì)多點(diǎn)的而 Java 提供的多線程功能用多線程可完成 多點(diǎn)對(duì)多點(diǎn)的聊天,數(shù)據(jù)庫(kù)管理系統(tǒng)用 SQL Server2000 完成并通過(guò) JDBC- ODBC 橋訪問(wèn)數(shù)據(jù)庫(kù)。 本系統(tǒng)建立在 JAVA 平臺(tái)上,系統(tǒng)的設(shè)計(jì)使用了面向?qū)ο蠹夹g(shù)和面向?qū)?象的設(shè)計(jì)原則。系統(tǒng)采用 C/S 結(jié)構(gòu),客戶端與客戶端以及客戶端與服務(wù)器 端之間通過(guò) Socket 傳送消息。使用 JAVA 語(yǔ)言編寫(xiě),開(kāi)發(fā)工具采用 Eclipse。服務(wù)器端設(shè)計(jì)與實(shí)現(xiàn)過(guò)程中,采用了多線程技術(shù),可以在單個(gè)程 序當(dāng)中同時(shí)運(yùn)行多個(gè)不同的線程,執(zhí)行不同的任務(wù)。大大增強(qiáng)了程序?qū)Ψ?務(wù)器資源的利用。 聊天系統(tǒng)完成后將可進(jìn)行多人對(duì)多人的聊天,對(duì)好友進(jìn)行添加、刪除, 對(duì)新用戶的注冊(cè),發(fā)送消息、接受消息等等功能。 關(guān)鍵字:多線程 ;客戶機(jī)/服務(wù)器 ;JAVA ; Socket ; Eclipse ; TCP/IP Abstract as the network become more and more developed, people become more and more lean to the network, and can not leave with out it. This caused the chat materials become more numerous, as the overseas ICQ system, the OICQ system that invented by Tencent Co., and so on. So we create a network chat medium just like the QQ. Java network programming based on the power, the use of Java designed to prepare graduates a chat system. In general, the majority of the chat tool for client and server program in addition to server-side storage of customer data for the database, the system uses a client / server architecture model the adoption of Java provided Soket class connect client and server and between the client and server communicate with each other, as the chat is to provide point-to-multipoint and multi-threaded Java function to be completed by using multi-threaded chat and more point-to-multipoint, database management system with SQL Server2000 the completion and adoption of JDBC-ODBC Bridge access the database. The system built on the JAVA platform, the system design using object-oriented technology and object-oriented design principles. System uses the C / S structure, client and client-side and server-side client and send messages through Socket. The use of JAVA language, development tools using Eclipse. Design and Implementation of server-side process, the use of multi-threading technology, which can process in a single run at the same time a number of different threads, the implementation of different tasks. Procedures greatly enhanced the use of server resources. Chat system will allow people to complete chat to more friends,and the system can add, delete somebody,can deal with new user registration, send messages, receive messages and so on. Keywords : Multithreading ; Client/Server ;JAVA ;Socket ;Eclipse ;TCP/IP 目目 錄錄 1 緒論緒論.1 1.1 國(guó)內(nèi)外聊天系統(tǒng)的研究現(xiàn)狀.1 1.2 JAVA語(yǔ)言2 1.2.1 Java 的發(fā)展歷史.2 1.2.2 Java 的特點(diǎn).3 1.2.3 Java 與 Internet.4 1.3 SOCKET編程4 1.3.1 關(guān)于 TCP/IP 協(xié)議4 1.3.2 服務(wù)器和客戶機(jī)5 1.4 本文內(nèi)容安排.6 2 需求分析需求分析.7 2.1 可行性研究.7 2.1.1 可行性分析7 2.1.2 系統(tǒng)功能需求.7 2.1.3 系統(tǒng)性能需求8 2.1.4 系統(tǒng)運(yùn)行需求8 2.2 數(shù)據(jù)流圖.8 2.2.1 頂層數(shù)據(jù)流圖8 2.2.2 一層數(shù)據(jù)流圖9 2.2.3 二層數(shù)據(jù)流圖9 3 概要設(shè)計(jì)概要設(shè)計(jì).11 3.1 系統(tǒng)實(shí)現(xiàn)原理.11 3.2 系統(tǒng)實(shí)現(xiàn)層次圖:.12 3.3 各模塊詳細(xì)功能.12 3.3.2 服務(wù)器端結(jié)構(gòu).12 3.3.2 客戶端結(jié)構(gòu)14 3.3.3 用戶注冊(cè)流程15 3.3.4 用戶登陸流程.16 3.3.5 用戶聊天流程圖.17 3.3.6 用戶退出流程.18 4 詳細(xì)設(shè)計(jì)詳細(xì)設(shè)計(jì).19 4.1 系統(tǒng)流程圖.19 4.1.1 系統(tǒng)總體流程圖19 4.1.2 系統(tǒng)客戶端流程圖20 4.2 編寫(xiě)服務(wù)器端程序.20 4.2.1 問(wèn)題陳述20 4.2.2 解決方案21 4.3 客戶端程序編寫(xiě).28 4.3.1 用戶注冊(cè)28 4.3.2 用戶登錄35 4.3.3 聊天室38 結(jié)束語(yǔ)結(jié)束語(yǔ).45 參考文獻(xiàn)參考文獻(xiàn)46 翻譯部分翻譯部分47 英文原文.47 中文譯文.55 致致 謝謝.62 第 1 頁(yè) 1 緒論 1.1 國(guó)內(nèi)外聊天系統(tǒng)的研究現(xiàn)狀 目前國(guó)內(nèi)外做聊天系統(tǒng)的公司很多,產(chǎn)品也琳瑯滿目,國(guó)內(nèi)有諸如騰 訊 QQ、新浪 UC、網(wǎng)易泡泡等,國(guó)外有著名的 MSN(新版改名為 Live Messenger)以及跨平臺(tái) Gaim 等。本人取最具代表性的 QQ 和 MSN 進(jìn)行了 一些研究,作為我開(kāi)發(fā)聊天系統(tǒng)的準(zhǔn)備。 騰訊無(wú)疑是國(guó)內(nèi)即時(shí)通訊市場(chǎng)的霸主,自從 99 年進(jìn)入即時(shí)通訊領(lǐng)域并 迅速占市場(chǎng)之后,其在國(guó)內(nèi)用戶數(shù)量始終高居榜首,即使近幾年面對(duì)微軟 MSN 的強(qiáng)大攻勢(shì),騰訊 QQ 的時(shí)常占有率依然穩(wěn)步增長(zhǎng)。騰訊的成功與其 對(duì) QQ 的不斷創(chuàng)新和完善是分不開(kāi)的。 參考了許多網(wǎng)絡(luò)上的資料,以及自己通過(guò)觀察騰訊 QQ 運(yùn)行時(shí)的各種 細(xì)節(jié)??梢源_定騰訊 QQ 是以多服務(wù)器提供服務(wù)、服務(wù)器總控客戶端、客 戶端之間 UDP 直連通信的。并且在兩個(gè)客戶端之間不能建立直連的情況下, 才由服務(wù)器進(jìn)行中轉(zhuǎn)通信。 其模型如圖 1-1 圖 1-1 騰訊 QQ 服務(wù)器-客戶端模型 1 與騰訊 QQ 不同,微軟的 MSN Messenger 只使用了 TCP 作為傳輸層通 第 2 頁(yè) 信協(xié)議,所有客戶端與服務(wù)器進(jìn)行連接,然后通過(guò)與服務(wù)器的 TCP 連接進(jìn) 行中轉(zhuǎn)通信。 其模型如圖 1-2 圖 1-2 MSN 服務(wù)器-客戶端模型 2 騰訊使用的模型中,服務(wù)器主要處理客戶端各種狀態(tài)的控制,可以極 大減輕服務(wù)器的處理壓力,但其內(nèi)部協(xié)議和實(shí)現(xiàn)復(fù)雜度都較高。而 MSN Messenger 所有數(shù)據(jù)都要經(jīng)過(guò)服務(wù)器,服務(wù)器壓力可想而知(難怪平時(shí)很少 見(jiàn)到使用 MSN 進(jìn)行語(yǔ)音視頻聊天的) 。 綜合騰訊 QQ 和微軟 MSN Messenger 的特點(diǎn),我打算在我的系統(tǒng)中嘗 試建立其類(lèi)似騰訊 QQ 的服務(wù)器-客戶端模型,但以單服務(wù)器提供服務(wù)。 1.2 Java 語(yǔ)言 1.2.1 Java 的發(fā)展歷史的發(fā)展歷史 Java 的發(fā)展歷史,可以追朔到 1990 年。當(dāng)時(shí) Sun Microsystem 公司為 了發(fā)展消費(fèi)類(lèi)電子產(chǎn)品進(jìn)行了一個(gè)名為 Green 的項(xiàng)目計(jì)劃。這個(gè)計(jì)劃的負(fù) 責(zé)任是 James Gosling。起初他用具有面向?qū)ο筇卣鞯?C+語(yǔ)言編寫(xiě)嵌入式 軟件,可以放在面包機(jī)或 PDA(Personal Digital Assistant,個(gè)人數(shù)字主力) 等小型電子消費(fèi)這杯里,以使設(shè)備變得更為“聰明”,更具備人工只能。但 后來(lái)發(fā)現(xiàn) C+并不適合這類(lèi)任務(wù);因?yàn)?C+常會(huì)使系統(tǒng)失效。尤其在內(nèi)存 管理方面,c+采用直接地址訪問(wèn)方式。需要程序員記錄并管理內(nèi)存資源。 第 3 頁(yè) 這造成程序員編程的極大負(fù)擔(dān),并可能產(chǎn)生多個(gè) Bugs。面包機(jī)上的程序錯(cuò) 誤可能使面包機(jī)燒壞甚至爆炸。 為了解決此類(lèi)問(wèn)題,Gosling 決定開(kāi)發(fā)一種新的語(yǔ)言,并取名為 Oak。它采用了 大部分與 C+類(lèi)似的語(yǔ)法對(duì)可能具備危險(xiǎn)性的功能加以改進(jìn),例如將內(nèi)存管理改為由 語(yǔ)言自己進(jìn)行管理,以減少程序員的負(fù)擔(dān)及可能發(fā)生的錯(cuò)誤。Oak 是一種可移置的語(yǔ) 言,它是一種平臺(tái)獨(dú)立的語(yǔ)言,能夠在各種芯片上執(zhí)行,可以降低設(shè)備的研發(fā)成本。 1.2.2 Java 的特點(diǎn)的特點(diǎn) Java 是一種簡(jiǎn)單、安全、容易適用、面向?qū)ο蟆⒖梢浦?、高性能、?線程的語(yǔ)言。 1. 簡(jiǎn)單性 Java 語(yǔ)言簡(jiǎn)單高校,基本 Java 系統(tǒng)(編譯器和解釋器)所占空間不足 250KB 由于 Java 最初是為了對(duì)家用電器進(jìn)行集成控制而設(shè)計(jì)的,因而具備 簡(jiǎn)單命了的特征。 2. 面向?qū)ο?面向?qū)ο蠹夹g(shù)是現(xiàn)代工業(yè)的一次革新,提高了軟件的模塊化程度和重 復(fù)適用率,縮短了軟件開(kāi)發(fā)時(shí)間,減低了卡發(fā)成本。在 Java 之前雖然已經(jīng) 有面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言問(wèn)問(wèn)世,但有些如 c+并不是完全的面向?qū)ο螅?而是面向過(guò)程和面向?qū)ο蟮幕旌象w。Java 則是完全面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ) 言。 3. 安全性 Java 是可以用在網(wǎng)路及分布環(huán)境下的網(wǎng)路程序設(shè)計(jì)語(yǔ)言。在網(wǎng)路環(huán)境 下,語(yǔ)言的安全性變得更為重要。Java 提供了許多安全機(jī)制來(lái)保證其適用 上的安全性。 4. 平臺(tái)獨(dú)立 平臺(tái)獨(dú)立指程序不受操作平臺(tái)的限制,可以應(yīng)用在各種平臺(tái)上。Java 源程序經(jīng)過(guò)編譯后生成字節(jié)碼文件,而字節(jié)碼與具體的計(jì)算機(jī)無(wú)關(guān)。只要 計(jì)算機(jī)安裝了能解釋執(zhí)行字節(jié)碼的 Java 虛擬機(jī) JVM,就可以執(zhí)行字節(jié)碼文 件,從而實(shí)現(xiàn) Java 的平臺(tái)獨(dú)立性。 5. 多線程 Java 具備內(nèi)建的多線程功能,可以將一個(gè)程序的不同程序段設(shè)置為不 同的線程,使各線程并發(fā)、獨(dú)立執(zhí)行,提高系統(tǒng)的運(yùn)行效率。 6.網(wǎng)絡(luò)功能 Java 能從全球網(wǎng)絡(luò)資源獲取所需信息,如數(shù)據(jù)文件、影響文件、聲音 文件等,并對(duì)所得信息進(jìn)行處理,所以說(shuō) Java 是一種網(wǎng)絡(luò)語(yǔ)言。 7.執(zhí)行效率 Java 的字節(jié)碼需要經(jīng)過(guò) Java 虛擬機(jī) JVM 解釋成機(jī)器碼才能執(zhí)行,所 以速度上較慢。但是隨著 JVM 技術(shù)的進(jìn)步,使得其執(zhí)行速度直逼 C 與 C+。 第 4 頁(yè) 1.2.3 Java 與與 Internet Java 語(yǔ)言取得成功的領(lǐng)域之一就是網(wǎng)絡(luò)(其他語(yǔ)言)數(shù)頁(yè)代碼- (Java)一條語(yǔ)句 TCP/IP(傳輸控制協(xié)議/網(wǎng)間協(xié)議)是 internet 的主要協(xié)議,定義了計(jì)算 機(jī)和外設(shè)進(jìn)行通信所使用的規(guī)則(應(yīng)用層,傳輸層,網(wǎng)絡(luò)層,鏈路層).大多數(shù) 基于 internet 的應(yīng)用程序被看作 TCP/IP 協(xié)議的上一層. 如 : ftp, http, smtp, pop3, telnet, nntp 等。 IP 地址:TCP/IP 網(wǎng)絡(luò)中的每臺(tái)計(jì)算機(jī)都有唯一的地址-IP 地址. 在 Java 中,有一個(gè)用來(lái)存儲(chǔ) internet 地址的類(lèi)叫 InetAddress. Java 提供的網(wǎng)絡(luò)功能有三大類(lèi): URL, Socket, Datagram. 1、URL 是三大功能中最高級(jí)的一種,通過(guò) URL Java 程序可以直接送出 或讀入網(wǎng)絡(luò)上的數(shù)據(jù). 2、Socket 是傳統(tǒng)網(wǎng)絡(luò)程序最常用的方式,可以想象為兩個(gè)不同的程序 通過(guò)網(wǎng)絡(luò)的通信信道. 3、Datagram 是更低級(jí)的網(wǎng)絡(luò)傳輸方式,它把數(shù)據(jù)的目的紀(jì)錄在數(shù)據(jù)包 中,然后直接放在網(wǎng)絡(luò)上 1.3 Socket 編程 1.3.1 關(guān)于關(guān)于 TCP/IP 協(xié)議協(xié)議 TCP 協(xié)議是網(wǎng)絡(luò)通信的基石,對(duì)此,Java 專(zhuān)門(mén)提供了 Socket 的類(lèi)庫(kù), 在其中抽象出 TCP 協(xié)議通信的常用方法: TCP 協(xié)議與三次握手: 在講述 TCP 協(xié)議流程前,先來(lái)聲明兩個(gè)重要的概念: (1)客戶端,首先發(fā)送 TCP 請(qǐng)求的是客戶端,客戶端一般是服務(wù)(比如數(shù) 據(jù)查詢(xún)服務(wù))的請(qǐng)求者。 (2)服務(wù)器,在接收到客戶端的請(qǐng)求后(確保同客戶端的通信信道建立) 服務(wù)器會(huì)向客戶端提供服務(wù)。服務(wù)器一般是服務(wù)的執(zhí)行者,會(huì)向客戶端返 回服務(wù)執(zhí)行的結(jié)果。 為了實(shí)現(xiàn)客戶端同服務(wù)器端的通信,客戶端首先發(fā)送一個(gè)“SYN”數(shù)據(jù) 包。如果服務(wù)器收到 SYN 標(biāo)記,它將發(fā)回一個(gè)“SYN+ACK”數(shù)據(jù)包。接著, 客戶端為了表示收到了這個(gè) SYN+ACK 信息,會(huì)向服務(wù)器發(fā)送一個(gè)最終確認(rèn) 信息(ACK 包) 。這種 SYN,SYN+ACK,ACK 的步驟被稱(chēng)為 TCP 連接建立時(shí)的 “三次握手” ,在這之后,連接就建立起來(lái)了,這個(gè)連接將一直保持活動(dòng)狀 態(tài),直到超時(shí)或者任何一方發(fā)出一個(gè) FIN(結(jié)束)信號(hào)。這種通信模式也叫 客戶端/服務(wù)器(C/S)模式。 第 5 頁(yè) 主機(jī) A 主機(jī) B 圖 1-3 三次握手協(xié)議 由此可見(jiàn),通過(guò)客戶端和服務(wù)器的“三次握手” ,雙方可以建立暢通的 通信信道,在此信道上雙方互相傳輸數(shù)據(jù)。 1.3.2 服務(wù)器和客戶機(jī)服務(wù)器和客戶機(jī) 網(wǎng)絡(luò)最基本的目的就是讓兩臺(tái)機(jī)器連接到一起,并相互“交談”或者“溝 通”。一旦兩臺(tái)機(jī)器都發(fā)現(xiàn)了對(duì)方,就可以展開(kāi)一次令人愉快的雙向?qū)υ挕?但它們?cè)鯓硬拍堋鞍l(fā)現(xiàn)”對(duì)方呢?這就像在游樂(lè)園里那樣:一臺(tái)機(jī)器不得不 停留在一個(gè)地方,偵聽(tīng)其他機(jī)器說(shuō):“嘿,你在哪里呢?” “停留在一個(gè)地方”的機(jī)器叫做“服務(wù)器”(Server);到處“找人”的機(jī)器 則叫做“客戶機(jī)”(Client)或者“客戶”。它們之間的區(qū)別只有在客戶機(jī)試圖 同服務(wù)器連接的時(shí)候才顯得非常明顯。一旦連通,就變成了一種雙向通信, 誰(shuí)來(lái)扮演服務(wù)器或者客戶機(jī)便顯得不那么重要了。 所以服務(wù)器的主要任務(wù)是偵聽(tīng)建立連接的請(qǐng)求,這是由我們創(chuàng)建的特 定服務(wù)器對(duì)象完成的。而客戶機(jī)的任務(wù)是試著與一臺(tái)服務(wù)器建立連接,這 是由我們創(chuàng)建的特定客戶機(jī)對(duì)象完成的。一旦連接建好,那么無(wú)論在服務(wù) 器端還是客戶機(jī)端,連接只是魔術(shù)般地變成了一個(gè) IO 數(shù)據(jù)流對(duì)象。從這時(shí) 開(kāi)始,我們可以象讀寫(xiě)一個(gè)普通的文件那樣對(duì)待連接。所以一旦建好連接, 我們只需使用自己熟悉的 IO 命令即可。這正是 Java 聯(lián)網(wǎng)最方便的一個(gè)地方。 ACK=1 第一次握手,主機(jī) A 向 主機(jī) B 發(fā)送連接請(qǐng)求 第二次握手,主機(jī) B 收到主機(jī) A 的請(qǐng)求,向主機(jī) A 回發(fā)一個(gè)確認(rèn), ,同時(shí)向主機(jī) A 發(fā)送一個(gè)連接請(qǐng) 求 第三次握手,主機(jī) A 收 到主機(jī) B 發(fā)送的數(shù)據(jù)包 在向主機(jī) B 發(fā)送一個(gè)確 認(rèn)連接 SYN=1,SEQ= ACK=1,SYN=1,SEQ= aaaaaaaaaa 第 6 頁(yè) 圖 1-4 服務(wù)器和客戶機(jī)的連接 1.4 本文內(nèi)容安排 本論文內(nèi)容安排如下: 第二章為聊天系統(tǒng)的需求分析,主要介紹系統(tǒng)的可行性研究,需求分 析流程圖等。 第三章為概要設(shè)計(jì),分模塊介紹系統(tǒng)的具體實(shí)現(xiàn)過(guò)程。 第四章為詳細(xì)設(shè)計(jì)。 第 7 頁(yè) 2 需求分析 2.1 可行性研究 2.1.1 可行性分析可行性分析 經(jīng)濟(jì)可行性:由于本系統(tǒng)的主要背景是畢業(yè)課程設(shè)計(jì),不注重直接的經(jīng) 濟(jì)效益和其后的發(fā)展方向,只在注重自身水平和能力的提高,對(duì)自身的經(jīng) 濟(jì)要求也不高,只要有一臺(tái)能運(yùn)行 Java 軟件的電腦便可,所以不用考慮到 經(jīng)濟(jì)問(wèn)題。 技術(shù)可行性: 本系統(tǒng)的開(kāi)發(fā)利用 Microsoft SQL Server2000 作為本系 統(tǒng)的數(shù)據(jù)庫(kù),它是一個(gè)支持多用戶的新型數(shù)據(jù)庫(kù),適用于大中規(guī)模的數(shù)據(jù)量 需求。學(xué)校校園網(wǎng)的建設(shè)也為新系統(tǒng)服務(wù)器/客戶端的結(jié)構(gòu)提供了硬件的支 持。使用 Java 作為系統(tǒng)開(kāi)發(fā)的開(kāi)發(fā)環(huán)境,它提供完善的指令控制語(yǔ)句、類(lèi) 與對(duì)象的支持及豐富的數(shù)據(jù)類(lèi)型,給開(kāi)發(fā)高性能系統(tǒng)提供的保障為開(kāi)發(fā)滿足 客戶要求的系統(tǒng),保證了代碼的模塊化要求,而代碼模塊化的提高,非常有利 于以后對(duì)新系統(tǒng)的擴(kuò)展與修改。 運(yùn)行可行性: 本系統(tǒng)為一個(gè)小型的局域網(wǎng)聊天系統(tǒng),所耗費(fèi)的資源非常 的小,現(xiàn)在一般的電腦無(wú)論是硬件還是軟件都能夠滿足條件,因此,本系統(tǒng)在 運(yùn)行上是可行的。 綜上所述,本系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)在技術(shù)上和硬件設(shè)備上的條件都是滿足 的,因此,它在技術(shù)上是可行的。 2.1.2 系統(tǒng)功能需求系統(tǒng)功能需求 本系統(tǒng)主要通過(guò)客戶端,服務(wù)器端來(lái)體現(xiàn)聊天系統(tǒng)的基本功能。 (1)服務(wù)器端 1.處理用戶注冊(cè) 2.處理用戶登錄 3.處理用戶發(fā)送信息,服務(wù)器監(jiān)控聊天內(nèi)容,服務(wù)器過(guò)濾非法內(nèi)容 4.處理用戶得到信息 5.處理用戶退出 8. 服務(wù)器踢人。 9. 保存服務(wù)器日志。 10.保存用戶聊天信息。 (2)客戶端 1.用戶注冊(cè)界面及結(jié)果 第 8 頁(yè) 2.用戶登錄界面及結(jié)果 3.用戶發(fā)送信息界面及結(jié)果 4.用戶得到信息界面及結(jié)果 5.用戶退出界面及結(jié)果 2.1.3 系統(tǒng)性能需求系統(tǒng)性能需求 實(shí)用性:為局域網(wǎng)聊天提供方便,有效進(jìn)行作業(yè)管理。 操作簡(jiǎn)單:本系統(tǒng)應(yīng)該適用于不同水平的使用者,包括事業(yè)單位和企 業(yè)單位,同時(shí)系統(tǒng)不應(yīng)太復(fù)雜和煩瑣,因此要求系統(tǒng)的操作盡可能簡(jiǎn)單易 行。 技術(shù)先進(jìn):產(chǎn)品的系統(tǒng)設(shè)計(jì)和開(kāi)發(fā)應(yīng)緊跟著整個(gè)計(jì)算機(jī)發(fā)展潮流,采 用當(dāng)時(shí)最先進(jìn)的設(shè)計(jì)思想,利用最新的開(kāi)發(fā)技術(shù)和開(kāi)發(fā)工具。使系統(tǒng)能夠 無(wú)論在功能設(shè)計(jì)上,還是在技術(shù)實(shí)現(xiàn)上,都處于同行業(yè)的領(lǐng)先地位。 安裝使用簡(jiǎn)便:服務(wù)器端的安裝簡(jiǎn)潔明了,客戶機(jī)無(wú)需再裝任何軟件 就可以直接注冊(cè)登陸聊天。 適應(yīng)性:應(yīng)該能廣泛應(yīng)用于不同類(lèi)型的企事業(yè)單位。系統(tǒng)采用模塊化 設(shè)計(jì),用戶可以根據(jù)自己的實(shí)際情況自行組合,使系統(tǒng)在不同的硬件環(huán)境 下都能得以應(yīng)用。 代碼可讀性好:文中的代碼將盡可能簡(jiǎn)潔,易懂。 2.1.4 系統(tǒng)運(yùn)行需求系統(tǒng)運(yùn)行需求 運(yùn)行環(huán)境:Windows 9x、2000、xp、2003,Linux 必要環(huán)境:JDK 1.5 以上 硬件環(huán)境:CPU 400MHz 以上,內(nèi)存 64MB 以上 2.2 數(shù)據(jù)流圖 2.2.1 頂層數(shù)據(jù)流圖頂層數(shù)據(jù)流圖 聊天用戶 局域網(wǎng)多 人聊天系 統(tǒng) 聊天用戶 圖 2-1 頂層數(shù)據(jù)流圖 第 9 頁(yè) 2.2.2 一層數(shù)據(jù)流圖一層數(shù)據(jù)流圖 . 聊天用戶聊天用戶 客戶端 服務(wù)器端 寫(xiě)聊天信息 返回 讀取 返回 提交反饋 存儲(chǔ) 圖 2-2 一層數(shù)據(jù)流圖 2.2.3 二層數(shù)據(jù)流圖二層數(shù)據(jù)流圖 第 10 頁(yè) 用戶 客戶端 服務(wù)器端 用戶注 冊(cè) 用戶登錄 用戶發(fā)送 信息 聊天內(nèi)容 非法內(nèi)容 用戶得到 的信息 處理用戶 退出 服務(wù)器日志數(shù)據(jù)聊天信息 保存 保存 處理 監(jiān)控 屏蔽 圖 2-3 系統(tǒng)二層數(shù)據(jù)流圖 第 11 頁(yè) 3 概要設(shè)計(jì) 3.1 系統(tǒng)實(shí)現(xiàn)原理 聊天系統(tǒng)的設(shè)計(jì)跟普通網(wǎng)站設(shè)計(jì)有著許多不同的地方,普通網(wǎng)站設(shè)計(jì) 所考慮的因素,例如,普通網(wǎng)站需要對(duì)布局進(jìn)入大量美化以及動(dòng)畫(huà)設(shè)計(jì)等 等,而聊天室只要提供滿足訪客雙方直接實(shí)時(shí)聊天即可。因此,在設(shè)計(jì)聊 天系統(tǒng)的過(guò)程中,必須要考慮好以下幾個(gè)設(shè)計(jì)要點(diǎn): 在 Internet 上的聊天程序一般都是以服務(wù)器提供服務(wù)端連接響應(yīng),使 用者通過(guò)客戶端程序登錄到服務(wù)器,就可以與登錄在同一服務(wù)器上的用戶 交談,這是一個(gè)面向連接的通信過(guò)程。因此,程序要在 TCP/IP 環(huán)境下,實(shí) 現(xiàn)服務(wù)器端和客戶端兩部分程序。 圖 3-1 系統(tǒng)實(shí)現(xiàn)原理圖 第 12 頁(yè) 3.2 系統(tǒng)實(shí)現(xiàn)層次圖: 局域網(wǎng)多人聊天 系統(tǒng) 客戶端服務(wù)器端 與聊 天室 成員 私聊 可以 改變 聊天 內(nèi)容 風(fēng)格 用戶 注冊(cè) (含 頭像 )、 登錄 服 務(wù) 器 發(fā) 送 通 知 服 務(wù) 器 踢 人 保 存 服 務(wù) 器 日 志 保 存 用 戶 聊 天 信 息 服 務(wù) 器 過(guò) 濾 非 法 內(nèi) 容 服 務(wù) 器 監(jiān) 控 聊 天 內(nèi) 容 聊天 室成 員一 起聊 天 時(shí) 鐘 功 能 圖 3-2 系統(tǒng)實(shí)現(xiàn)層次圖 3.3 各模塊詳細(xì)功能 3.3.1 服務(wù)器端結(jié)構(gòu)服務(wù)器端結(jié)構(gòu) 第 13 頁(yè) 圖 3-3 服務(wù)器端結(jié)構(gòu)圖 ServeFrame.java 為服務(wù)器端程序界面,負(fù)責(zé)為服務(wù)器的啟動(dòng)提供界面服 務(wù)。 AppServer.java 為服務(wù)器端啟動(dòng)界面,負(fù)責(zé)監(jiān)聽(tīng)服務(wù)器的狀態(tài),在線人 數(shù),最多在線人數(shù),服務(wù)器名稱(chēng),訪問(wèn)協(xié)議,服務(wù)器 IP,服務(wù)器端口以及 用戶信息的管理,日志的保存。 Connection.java 是連接服務(wù)器和客戶端的橋梁,主要負(fù)責(zé)將客戶端的信 息傳送給服務(wù)器,并將服務(wù)器端的信息反饋給客戶端,即所謂的“三次握 手”。也是 Socket 編程的重要部分。 WordFilter.java 負(fù)責(zé)將聊天過(guò)程中不合法的話語(yǔ)文件等過(guò)濾掉,返回合 法內(nèi)容。 第 14 頁(yè) 3.3.2 客戶端結(jié)構(gòu)客戶端結(jié)構(gòu) 圖 3-4 客戶端結(jié)構(gòu)圖 ChatClient.java 為客戶端程序啟動(dòng)類(lèi),負(fù)責(zé)客戶端的啟動(dòng)和退出。 Login.java 為客戶端程序登錄界面,負(fù)責(zé)用戶帳號(hào)信息的驗(yàn)證與反饋。 Register.java 為客戶端程序注冊(cè)界面,負(fù)責(zé)用戶帳號(hào)信息的注冊(cè)驗(yàn)證與 反饋。 ChatRoom.java 為客戶端程序聊天室主界面,負(fù)責(zé)接收、發(fā)送聊天內(nèi)容與 服務(wù)器端的 Connection.java 親密合作。 Windowclose 為 ChatRoom.java 的內(nèi)部類(lèi),負(fù)責(zé)監(jiān)聽(tīng)聊天室界面的操作, 當(dāng)用戶退出時(shí)返回給服務(wù)器信息。 Clock.java 為客戶端程序的一個(gè)小程序,實(shí)現(xiàn)的一個(gè)石英鐘功能。 第 15 頁(yè) 3.3.3 用戶注冊(cè)流程用戶注冊(cè)流程 圖 3-5 用戶注冊(cè)流程圖 當(dāng)用戶注冊(cè)時(shí),客戶端由 Register.java 界面收集用戶注冊(cè)信息后, 封裝成 Register_Customer 對(duì)象類(lèi)然后通過(guò)建立在 Socket 的連接之上的對(duì) 象輸出流將用戶注冊(cè)信息發(fā)送給服務(wù)器,服務(wù)器端將請(qǐng)求轉(zhuǎn)發(fā)給 Connection 處理,Connection 在收到信息后將數(shù)據(jù)完整保存在對(duì)象型數(shù)據(jù) 庫(kù)中,如果注冊(cè)成功,客戶端可以返回到 Login.java 界面登錄。 第 16 頁(yè) 3.3.4 用戶登陸流程用戶登陸流程 圖 3-6 用戶登錄流程圖 當(dāng)用戶登錄時(shí),客戶端由 Login.java 界面收集并驗(yàn)證用戶登錄信息后, 封裝成 Customer 對(duì)象類(lèi)然后通過(guò)建立在 Socket 的連接之上的對(duì)象輸出流 將用戶登錄信息發(fā)送給服務(wù)器,服務(wù)器端將請(qǐng)求轉(zhuǎn)發(fā)給 Connection 處理, Connection 在收到信息后將驗(yàn)證數(shù)據(jù)的完整性并在對(duì)象型數(shù)據(jù)庫(kù)中查找該 用戶名是否已經(jīng)注冊(cè),然后將注冊(cè)用戶的信息與登錄請(qǐng)求信息進(jìn)行密碼驗(yàn) 證,在登錄成功后將該用戶添加到在線用戶列表,最后將登錄結(jié)果返回給 客戶端。如果登錄成功,客戶端將繼續(xù)啟動(dòng)聊天室主界面。 第 17 頁(yè) 3.3.5 用戶聊天流程圖用戶聊天流程圖 圖 3-7 用戶聊天流程圖 當(dāng)用戶進(jìn)入聊天室發(fā)送聊天信息時(shí),客戶端由 Chat.java 界面收集聊 天信息后,發(fā)送聊天數(shù)據(jù)類(lèi)型給服務(wù)器,服務(wù)器端將請(qǐng)求轉(zhuǎn)發(fā)給 Connection 處理,Connection 在收到聊天請(qǐng)求后將聊天信息轉(zhuǎn)發(fā)給聊天室, 如果選擇私聊就經(jīng)過(guò) Connection 分析后轉(zhuǎn)發(fā)給另外一個(gè)客戶端用戶,最后 聊天信息會(huì)出現(xiàn)在聊天室里,客戶端將繼續(xù)啟動(dòng)聊天室主界面。 第 18 頁(yè) 3.3.6 用戶退出流程用戶退出流程 圖 3-8 用戶推出流程圖 當(dāng)用戶退出聊天室時(shí),客戶端由用戶窗體監(jiān)聽(tīng)器 Windowsclose 收集用 戶退出信息后,通過(guò)退出用戶數(shù)據(jù)類(lèi)型發(fā)送退出信息,然后通過(guò)建立在 Socket 的連接之上的對(duì)象輸出流將用戶退出信息發(fā)送給服務(wù)器,服務(wù)器端 將請(qǐng)求轉(zhuǎn)發(fā)給 Connection 處理,Connection 在收到信息后查看用戶是否登 錄,在退出成功后將該用戶在線用戶列表欄中撤銷(xiāo),最后將退出成功結(jié)果 返回給客戶端。 第 19 頁(yè) 4 詳細(xì)設(shè)計(jì) 4.1 系統(tǒng)流程圖 4.1.1 系統(tǒng)總體流程圖系統(tǒng)總體流程圖 開(kāi)始 啟動(dòng)服務(wù)器 判斷啟動(dòng)信息 啟動(dòng)客戶端 判斷登錄信息 登錄聊天室 退出聊天室 結(jié)束 是 是 注冊(cè)用戶 退出服務(wù)器 否 是 否 圖 4-1 系統(tǒng)總體流程圖 第 20 頁(yè) 4.1.2 系統(tǒng)客戶端流程圖系統(tǒng)客戶端流程圖 開(kāi)始 客戶端登錄界面 聊天室界面 清屏聊天內(nèi)容時(shí)鐘保存 聊天對(duì)象字體顏色表情 退出 結(jié)束 圖 4-2 客戶端流程圖 4.2 編寫(xiě)服務(wù)器端程序 4.2.1 問(wèn)題陳述問(wèn)題陳述 1. 接受用戶注冊(cè)信息并保存在一個(gè)基于文件的對(duì)象型數(shù)據(jù)庫(kù)。 2. 能夠允許注冊(cè)過(guò)的用戶登錄聊天界面并可以聊天。 3. 能夠接受私聊信息并發(fā)送給特定的用戶。 4. 服務(wù)器運(yùn)行在自定義的端口上 1001. 5. 服務(wù)器監(jiān)控用戶列表和用戶聊天信息(除私聊外)。 6. 服務(wù)器踢人,發(fā)送通知。 7. 服務(wù)器保存日志。 第 21 頁(yè) 4.2.2 解決方案解決方案 后臺(tái)數(shù)據(jù)庫(kù)設(shè)計(jì) 基于服務(wù)器跨平臺(tái)運(yùn)行的構(gòu)想,服務(wù)器的后臺(tái)數(shù)據(jù)庫(kù)使用了 SQL Server2000。 (1)login 表: Login 表 (2)register 表 register 表 此表主要包含了用戶帳戶基本信息。 聊天系統(tǒng)采用用戶名作為用戶帳號(hào),并給每個(gè)用戶生成一個(gè)唯一 ID 來(lái) 做系統(tǒng)內(nèi)部的用戶標(biāo)識(shí)。 用戶注冊(cè) 1.去數(shù)據(jù)庫(kù)讀數(shù)據(jù) 首先創(chuàng)建一個(gè) File 文件類(lèi),載入“user.txt”,再用對(duì)象輸入流 ObjectInputStream 將用戶信息導(dǎo)入到系統(tǒng)中。 2.客戶端請(qǐng)求注冊(cè) 客戶端通過(guò) Register.java 請(qǐng)求注冊(cè),填寫(xiě)注冊(cè)信息,并驗(yàn)證密碼是否 符合規(guī)定,是否兩次輸入一致,如不一致會(huì)提示重新輸入,最后將請(qǐng)求信 息發(fā)送給服務(wù)器端。 int flag = 0; / 是否重名判斷標(biāo)志 Register_Customer clientMessage = (Register_Customer) obj; File fList = new File(“user.txt“); 第 22 頁(yè) if (fList.length() != 0)/ 判斷是否是第一個(gè)注冊(cè)用戶 ObjectInputStream objInput = new ObjectInputStream( new FileInputStream(fList); vList = (Vector) objInput.readObject(); / 判斷是否有重名 for (int i = 0; i = 50) toClient.println(“登錄人數(shù)過(guò)多,請(qǐng)稍候再試“); break; if (login_flag = 0) / chenmin clientMessage2.custHead = reg.head; userOnline.addElement(clientMessage2); if (find = 0) toClient.println(“沒(méi)有這個(gè)用戶,請(qǐng)先注冊(cè)“); 用戶退出 1.接收退出信息 當(dāng)用戶退出時(shí),客戶端將會(huì)用基于 Socket 的對(duì)象輸出流發(fā)送給服務(wù)器 退出對(duì)象。 2.在線列表中刪除用戶 用戶退出后應(yīng)該把用戶從在線列表中刪除,否則用戶退出用戶還在在線 列表中,那么該用戶下次將會(huì)無(wú)法登錄。 3.更新在線列表 用戶退出后將服務(wù)器端監(jiān)控界面的用戶列表更新。否則用戶數(shù)據(jù)將會(huì)不 同步。 用戶退出模塊程序: public void serverExit() Exit exit = new Exit(); exit = (Exit) obj; removeUser(exit); / chenmin if (sFrame.ti.equals(exit.exitname) sFrame.ti = “; Date t = new Date(); log(“用戶“ + exit.exitname + “已經(jīng)退出, “ + “退出時(shí)間:“ + 第 25 頁(yè) t.toLocaleString(); freshServerUserList(); 接收用戶聊天信息 1.接收用戶聊天信息 當(dāng)用戶發(fā)送聊天信息時(shí),服務(wù)端將會(huì)收到客戶端用 Socket 傳輸過(guò)來(lái)的 聊天信息對(duì)象,然后將其強(qiáng)制轉(zhuǎn)換為 Chat 對(duì)象。 2.過(guò)濾用戶聊天內(nèi)容的非法信息 分析聊天信息對(duì)象的聊天內(nèi)容,用語(yǔ)言過(guò)濾類(lèi)將非法字符過(guò)濾掉。語(yǔ)言 過(guò)濾的時(shí)候?qū)?huì)打開(kāi)“badword.txt”文件,不允許出現(xiàn)的關(guān)鍵詞將會(huì)存儲(chǔ) 在文件中,關(guān)鍵字之間以逗號(hào)分割。當(dāng)聊天內(nèi)容中出現(xiàn)要過(guò)渡的關(guān)鍵字是 將會(huì)被系統(tǒng)屏蔽,而聊天內(nèi)容 3.接收服務(wù)器端的系統(tǒng)消息 當(dāng)有其他用戶登陸時(shí),系統(tǒng)會(huì)給在線的所有用戶發(fā)送用戶登陸信息,并 且通過(guò)服務(wù)器可以給各用戶發(fā)送系統(tǒng)消息。系統(tǒng)消息發(fā)出后,如再有登錄 者也可以接收到系統(tǒng)消息。 4.返回給客戶端 當(dāng)以上信息都封裝成功后,打開(kāi)與客戶端連接的 Socket 的輸出流,然 后再用 ObjectOutputStream 對(duì)象輸出流包裝后輸出給客戶端。 public void serverChat() / 將接收到的對(duì)象值賦給聊天信息的序列化對(duì)象 Chat cObj = new Chat(); cObj = (Chat) obj; / chenmin cObj.chatMessage = WordFilter.filter(cObj.chatMessage); chatLog(cObj); / 將聊天信息的序列化對(duì)象填加到保存聊天信息的矢量中 userChat.addElement(Chat) cObj); return; 服務(wù)器踢人 服務(wù)器將要踢的人的用戶名存到變量 sFrame 中,下發(fā)給客戶端,當(dāng)客 戶端發(fā)現(xiàn)自己是被踢對(duì)象后就會(huì)自動(dòng)退出聊天室并給服務(wù)器返回退出信息。 第 26 頁(yè) 圖 4-3 服務(wù)器踢人 服務(wù)器踢人模塊程序: private void removeUser(Exit exit) / TODO 自動(dòng)生成方法存根 Vector vec = new Vector(); Customer _cus = null; for (int j = 0; j “; newlog += obj.chatToUser; newlog += “:“; newlog += obj.chatMessage; sFrame.taMessage.setText(newlog); 4.3 客戶端程序編寫(xiě) 4.3.1 用戶注冊(cè)用戶注冊(cè) 收集用戶注冊(cè)信息 程序?qū)⑼ㄟ^(guò) Register.java 用戶注冊(cè)界面收集用戶的用戶名、密碼、 年齡、電子郵箱。如圖 4-7 第 29 頁(yè) 圖 4-7 用戶注冊(cè)界面 客戶端用戶注冊(cè)信息模塊程序: /連接到服務(wù)器 Socket toServer; toServer = new Socket(strServerIp,1001); ObjectOutputStream streamToServer=new ObjectOutputStream (toServer.getOutputStream(); /寫(xiě)客戶詳細(xì)資料到服務(wù)器socket streamToServer.writeObject(Register_Customer)data); /讀來(lái)自服務(wù)器socket的登陸狀態(tài) BufferedReader fromServer=new BufferedReader(new InputStreamReader(toServer.getInputStream(); String status=fromServer.readLine(); /顯示成功消息 JOptionPane op=new JOptionPane(); op.showMessageDialog(null,status); if(status.equals(data.custName+“注冊(cè)成功“) txtUserName.setText(“); pwdUserPassword.setText(“); pwdConfirmPass.setText(“); txtAge.setText(“); txtEmail.setText(“); 驗(yàn)證用戶名是否為空 第 30 頁(yè) 即用戶名的長(zhǎng)度不可為 0,如果驗(yàn)證通過(guò)即進(jìn)行下面的驗(yàn)證,否則 返回“用戶名為空”的錯(cuò)誤。 圖 4-8 驗(yàn)證用戶名及密碼界面 /驗(yàn)證用戶名是否為空 if(data.custName.length()=0) JOptionPane.showMessageDialog(null,“用戶名不能為空“); return; 驗(yàn)證密碼是否為空 即密碼的字符長(zhǎng)度不為 0,如果驗(yàn)證通過(guò),就進(jìn)行繼續(xù)下面的驗(yàn)證,否 則返回“用戶密碼為空”錯(cuò)誤。 /驗(yàn)證密碼是否為空 if(data.custPassword.length()=0) JOptionPane.showMessageDialog(null,“密碼不能為空“); return; 驗(yàn)證密碼的一致性 驗(yàn)證密碼兩次輸入是否一致,如果驗(yàn)證通過(guò),就進(jìn)行繼續(xù)下面的驗(yàn)證, 否則返回“密碼兩次輸入不一致,請(qǐng)重新輸入”錯(cuò)誤,如圖 4-9 第 31 頁(yè) 圖 4-9 驗(yàn)證密碼的一致性 /驗(yàn)證密碼的一致性 if(!data.custPassword.equals(pwdConfirmPass.getText() JOptionPane.showMessageDialog(null,“密碼兩次輸入不一致,請(qǐng) 重新輸入“); return; 驗(yàn)證年齡的合法性 即用戶年齡的字符長(zhǎng)度不為 0,如果驗(yàn)證通過(guò),就進(jìn)行繼續(xù)下面驗(yàn)證, 否則返回“用戶年齡不能為空”的提示。 圖 4-10 驗(yàn)證年齡的合法性 /驗(yàn)證年齡是否為空 第 32 頁(yè) if(data.age.length()=0) JOptionPane.showMessageDialog(null,“年齡不能為空“); return; /驗(yàn)證年齡的合法性 int age=Integer.parseInt(txtAge.getText(); if (age100) JOptionPane.showMessageDialog(null,“年齡輸入不合法“); return; 驗(yàn)證郵箱的合法性 即電子郵箱字符串必須有“”,如果驗(yàn)證通過(guò),就進(jìn)行繼續(xù)下面驗(yàn)證, 否則返回“電子郵箱不合法”,如圖 圖 4-11 驗(yàn)證郵箱的合法性 /驗(yàn)證Email的正確性 int Found_flag=0; /判斷標(biāo)志 for (int i=0;iportport static public void main( String args ) throws Exception / Get the port # from the command line int port = Integer.parseInt( args0 ); / Create a Server object, which will automatically begin / accepting connections. new Server( port ); 現(xiàn)在我們開(kāi)始監(jiān)聽(tīng),下一節(jié)我們將繼續(xù)介紹是如何接受連接的,看看 我們是如何處理它們的。 我們已經(jīng)準(zhǔn)備從我們的客戶接受連接,這就是說(shuō)料體內(nèi)是如何進(jìn)行的。 4.監(jiān)聽(tīng)循環(huán) 上面我們提到了 java 中一個(gè)叫做套接字的對(duì)象,它代表著通過(guò)建立從 別的地方的應(yīng)用程序接收數(shù)據(jù)。 一個(gè)客戶端從定義,啟動(dòng)到連接服務(wù)器,我們是怎么得到這個(gè) socket 的呢?服務(wù)器端首先要做的工作是等待連接的建立,也就是說(shuō)我們需要發(fā) 送一些信息到客戶端,代表著連接的建立。 這就是 serversocket 是如何工作的,有一個(gè) serversocket 對(duì)象,它 第 58 頁(yè) 一直監(jiān)聽(tīng)著一個(gè)端口,當(dāng)有一個(gè)新的連接到來(lái)的時(shí)候,它將創(chuàng)建一個(gè) socket 對(duì)象代表著連接的建立。 接受 socket 可能你服務(wù)器程序是為了服務(wù)來(lái)自互聯(lián)網(wǎng)上的很多客戶端,這些客戶 端將彼此不相關(guān)的與你的服務(wù)器建立連接,也就是說(shuō)我們不能控制客戶端 連接到來(lái)的時(shí)間和順序,下面我們將介紹多線程一個(gè)比較優(yōu)越的方法處理 這些連接不管他們什么時(shí)候到來(lái)。 但是當(dāng)連接到來(lái)時(shí)我們將試圖處理這個(gè)連接。Socket 暗含了一個(gè)簡(jiǎn)單 直接的處理方法:它串行接受連接,正如你一個(gè)挨一個(gè)的問(wèn)他們一樣,而 它們專(zhuān)門(mén)在排著隊(duì)等待。下面就是模型:/ start listening on the port ServerSocket ss = new ServerSocket( port ); / loop forever while (true) / get a connection Socket newSocket = ss.accept(); / deal with the connection / . 當(dāng) serversocket 的方法調(diào)用時(shí),accept()實(shí)例將返回一個(gè) socket 對(duì) 象代表著新的連接的建立,這次連接處理完畢,將再次調(diào)用 accpt()處理 下一個(gè)連接,就是用這種方法,不管連接到來(lái)的有多快,不管你的計(jì)算機(jī) 有多少處理器和網(wǎng)絡(luò)接口,一個(gè)時(shí)刻只能建立一個(gè)連接(如果一時(shí)間沒(méi)有 連接請(qǐng)求,accpet()實(shí)例將一直等待,知道有連接來(lái)請(qǐng)求。 一般來(lái)說(shuō),系列化是一個(gè)有效處理事情同時(shí)發(fā)生的一個(gè)有效的方法, 但是它的一個(gè)潛在的缺點(diǎn)是消除了排比,也就是說(shuō),串行化阻止了我們?cè)?同一時(shí)間做很多的事情。上面的代碼,當(dāng)程序處理一個(gè)連接的時(shí)候,其他 的連接是必須等待的。 但是對(duì)我們來(lái)說(shuō)系列化已經(jīng)不是一個(gè)問(wèn)題,因?yàn)槊看芜B接到來(lái)的時(shí)候, 我們將建立一個(gè)新的線程來(lái)處理它。一旦線程創(chuàng)建,它將去處理新的連接, 我們的循環(huán)接受 accept()將去等待接收新的連接。如果建立線程的速度 夠快,連接將不會(huì)被阻塞。 代碼: 然我們看看代碼做的這些,下面的代碼涉及到我們談?wù)摰臇|西,監(jiān)聽(tīng) 一個(gè)端口,接收連接,并且創(chuàng)建新的線程處理它們。下面它們將做一些有 用的東西,讓我們看看: 第 59 頁(yè) private void listen( int port ) throws IOException / Create the ServerSocket ss = new ServerSocket( port ); / Tell the world were ready to go System.out.println( “Listening on “+ss ); / Keep accepting connections forever while (true) / Grab the next incoming connection Socket s = ss.accept(); / Tell the world weve got it System.out.println( “Connection from “+s ); / Create a DataOutputStream for writing data to the / other side DataOutputStream dout = new DataOutputStream( s.getOutputStream() ); / Save this stream so we dont need to make it again outputStreams.put( s, dout ); / Create a new thread for this connection, and then forget / about it new ServerThread( this, s ); 代碼的最后一行創(chuàng)建了一個(gè)線程處理新的連接。對(duì)于 serverthread ,這是該課題 的下一節(jié)。 5.單線程類(lèi) 什么是 thread? Java 語(yǔ)言的兩個(gè)主要優(yōu)勢(shì)是網(wǎng)絡(luò)和多線程。這并不是說(shuō)其他語(yǔ)言,不 支持這些功能,其實(shí)其他語(yǔ)言也支持這些功能。但是 java 用來(lái)提供這些功 能非常優(yōu)雅,特別是作為一種商業(yè)語(yǔ)言。 一個(gè)線程是一般定義為一個(gè)單獨(dú)的控制線,它的真正意思是說(shuō)一個(gè)多 線程的程序包含有多個(gè)活動(dòng)在同時(shí)進(jìn)行。 除了多線程是在一個(gè)程序里共享數(shù)據(jù)資源以外,它類(lèi)似任務(wù)和多任務(wù) 處理的概念。這使它們共享數(shù)據(jù)直接高效,但也使它們更容易相互混淆。 為什么要使用多線程? 詳細(xì)討論多線程超出了補(bǔ)習(xí)的范圍,雖然你在程序中使用線程的原因 不只一個(gè),但最重要的原因是是要建造一個(gè)輸入輸出的聊天服務(wù)器。 第 60 頁(yè) 你的聊天服務(wù)器和客戶端的用戶溝通,用戶通常情況下要比服務(wù)器慢 的多,也就是說(shuō)服務(wù)器端要浪費(fèi)很多的時(shí)間等待用戶發(fā)送消息。而我們又 不知道誰(shuí)先發(fā)送消息,如果使用單線程,只有等到 0 號(hào)用戶先發(fā)送消息然 后才輪到
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 會(huì)議餐飲服務(wù)合同范例
- 代理做賬合同范例
- 公文寫(xiě)作的語(yǔ)言表達(dá)試題及答案
- 行政管理的公共資源配置研究試題及答案
- 他人房產(chǎn)買(mǎi)賣(mài)合同范例
- 專(zhuān)業(yè)分包總價(jià)合同范例
- 行政管理中的公文處理技能評(píng)估試題及答案
- 農(nóng)耕華采購(gòu)合同樣本
- 共享合同范例
- 自考行政管理的復(fù)習(xí)技巧與經(jīng)驗(yàn)分享試題及答案
- ktv保安合同協(xié)議書(shū)
- 2025屆山東省威海市二中高三二診模擬考試生物試卷含解析
- 語(yǔ)文課程標(biāo)準(zhǔn)修訂要點(diǎn)分析
- 2025年隨州國(guó)投集團(tuán)公開(kāi)招聘42名工作人員筆試參考題庫(kù)附帶答案詳解
- 廈大介紹課件
- 2025陜西氫能產(chǎn)業(yè)發(fā)展有限公司所屬單位招聘(101人)筆試參考題庫(kù)附帶答案詳解
- 陜西建筑工程驗(yàn)收資料(A表)
- 租賃種植空地合同協(xié)議
- 鎳銅合金涂層組織與性能的研究:激光輔助電沉積技術(shù)的應(yīng)用
- 2025年四川省成都市錦江區(qū)嘉祥外國(guó)語(yǔ)高級(jí)中學(xué)高考數(shù)學(xué)三診試卷(含答案)
- 【MOOC】《學(xué)術(shù)交流英語(yǔ)》(東南大學(xué))章節(jié)中國(guó)大學(xué)慕課答案
評(píng)論
0/150
提交評(píng)論