最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

基于JAVA的網(wǎng)絡(luò)通訊系統(tǒng)設(shè)計與實現(xiàn)(論文+系統(tǒng))

2022-12-05 22:07 作者:ChatGPT云炬學(xué)長  | 我要投稿

(2009屆)

本科生畢業(yè)設(shè)計(論文)

基于Java的網(wǎng)絡(luò)通信系統(tǒng)設(shè)計與實現(xiàn)

學(xué) 院、系:計算機與通信學(xué)院專 業(yè):通信工程學(xué) 生 姓 名:班 級:學(xué)號指導(dǎo)教師姓名:職稱最終評定成績

2009年6 月

摘 要

在網(wǎng)絡(luò)越來越發(fā)達的今天,人們對網(wǎng)絡(luò)的依賴越來越多,越來越離不開網(wǎng)絡(luò),由此而產(chǎn)生的聊天工具越來越多,例如,國外的ICQ、國內(nèi)騰訊公司開發(fā)的OICQ。隨著網(wǎng)絡(luò)聊天一類的聊天系統(tǒng)的發(fā)展日新月異,因此產(chǎn)生了制作一個類似QQ的網(wǎng)絡(luò)聊天工具。Java是一種程序設(shè)計語言,它具有簡單的、完全面向?qū)ο笠约芭c平臺無關(guān)的結(jié)構(gòu),也具有可移植性、高性能和安全性,并提供了多線程的功能,而Java語言最大的成功之處在于它的平臺無關(guān)性和具有強大的網(wǎng)絡(luò)編程功能,基于Java網(wǎng)絡(luò)編程的強大功能,本人將用Java編寫一個網(wǎng)絡(luò)聊天系統(tǒng)。

論文首先論述了系統(tǒng)的開發(fā)背景,并對所用到的開發(fā)工具與關(guān)鍵技術(shù)做了簡單的介紹。接著對系統(tǒng)的研究意義,研究現(xiàn)狀及設(shè)計目標進行分析,通過對系統(tǒng)需求和可行性進行分析,確定了系統(tǒng)的功能模塊,并畫出相應(yīng)的功能結(jié)構(gòu)圖、模塊圖和數(shù)據(jù)流圖。其次按系統(tǒng)總體設(shè)計的結(jié)果,對系統(tǒng)中的數(shù)據(jù)庫進行結(jié)構(gòu)設(shè)計。

一般來說,聊天工具大多數(shù)由客戶端程序和服務(wù)器程序,外加服務(wù)器端用于存放客戶數(shù)據(jù)的數(shù)據(jù)庫組成,本系統(tǒng)采用客戶機/服務(wù)器架構(gòu)模式,通過Java提供的Socket類來連接客戶機和服務(wù)器并使客戶機和服務(wù)器之間相互通信,由于聊天是多點對多點的,而Java提供的多線程功能,用多線程可完成多點對多點的聊天。數(shù)據(jù)庫管理系統(tǒng)用SQL Server2000,完成并通過JDBC-ODBC橋訪問數(shù)據(jù)庫。聊天系統(tǒng)完成后將可進行多人對多人的聊天,對好友進行添加、刪除,對新用戶的注冊,發(fā)送消息、接受消息,傳輸文件等功能。界面設(shè)計細分化,方便使用者操作和理解。服務(wù)器實現(xiàn)了查詢和修改等功能,程序邏輯聯(lián)系較緊密。

關(guān)鍵詞:JAVA,C/S,SQL Server 2000, 多線程, 數(shù)據(jù)庫管理系統(tǒng)

ABSTRACT

More and more developed in the network today, people rely on more and more networks, 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 is a programming language with the simple construction which is completely object-oriented 。Java also possess the portability, high performance and security, and provide the multi – thread function. The best success is its and its strong network programming function, base on this, I will use Java to write a network chat system.
Firstly, the paper discussed the development background of the system, and made a briefly introduction to the development tool and key technologies. Then analyzed the system’s research significance , research present situation and project objective .According to the requirement analysis and feasibility analysis ,it can confirm the system’s functional module and draw corresponding functional configuration chart ,module chart and data stream chart. On the basis of the result of system designing, the paper design database by structured design method.

Generally speaking, most chat medium consist the client program, server program and the server which is use to content the database. This system adopt client/server pattern and the Socket class provide by Java to communicate the client and server. Because of chat is many to many, the multithreading function can implement the many-many chat, database management system use SQL Server2000 and JDBC-ODBC bridge to visit the database.
When chat system is achieved, it can possess functions like chat in a many-many way, add and delete the intimate, the new user’s registration, and sending and receiving message, transferring files and so on. The refinement of interface designing would facilitate user operation and understanding. The contact surface has the thin differentiation designs; modules have realized the functions such as inquiry, revision and so on. The logic relationship in this program is closed.

Keyword:?Java, Multithreading, Client/Server, SQL Server2000,

Database Management System

目 錄

第1章 緒論1

1.1 課題選擇的背景1

1.2 課題選擇意義1

1.3 系統(tǒng)開發(fā)技術(shù)簡介2

1.3.1 Java簡介2

1.3.2 JDBC技術(shù)簡介2

1.3.3 數(shù)據(jù)庫Microsoft SQL-Server 2000 簡介4

1.3.4 多線程介紹4

第2章 系統(tǒng)分析6

2.1 系統(tǒng)需求6

2.1.1 系統(tǒng)的特點分析6

2.1.2 網(wǎng)絡(luò)聊天系統(tǒng)需要解決的問題6

2.2 系統(tǒng)設(shè)計思想6

2.3 系統(tǒng)實現(xiàn)功能分析7

2.4 系統(tǒng)開發(fā)及運行環(huán)境7

第3章 系統(tǒng)總體設(shè)計8

3.1 總體構(gòu)架8

3.2 系統(tǒng)整體功能8

3.3 系統(tǒng)模塊功能設(shè)計9

第4章 數(shù)據(jù)庫設(shè)計12

4.1 系統(tǒng)E-R圖12

4.2 數(shù)據(jù)字典12

4.3 各個數(shù)據(jù)表的創(chuàng)建12

4.4 數(shù)據(jù)庫的連接13

第5章 系統(tǒng)實現(xiàn)與編碼15

5.1 服務(wù)器功能模塊的設(shè)計15

5.1.1 Socket和ServerSocket介紹15

5.2 服務(wù)器功能模塊的實現(xiàn)16

5.2.1 多線程服務(wù)器模塊實現(xiàn)16

5.2.2 在線用戶管理模塊實現(xiàn)18

5.2.3 部門管理模塊實現(xiàn)20

5.2.4 用戶管理模塊實現(xiàn)21

5.2.5日志管理模塊實現(xiàn)22

5.3協(xié)議設(shè)計與實現(xiàn)23

5.3.1 協(xié)議規(guī)則23

5.3.2 協(xié)議實現(xiàn)24

5.4客戶端功能模塊的設(shè)計與實現(xiàn)27

5.4.1 登陸認證模塊27

5.4.2 主界面模塊27

5.4.3 聊天模塊28

5.4.4 文件傳輸模塊29

第6章 系統(tǒng)測試33

6.1 系統(tǒng)測試概述33

6.1.1 測試目標33

6.1.2 測試實例研究與選擇33

6.1.3 系統(tǒng)測試環(huán)境33

6.2 測試內(nèi)容34

6.2.1 服務(wù)器模塊測試34

6.2.2 客戶端模塊測試34

6.2.3 平臺兼容性測試35

6.3 測試結(jié)果分析評價35

結(jié) 論36

參考文獻37

致 謝38

第1章 緒論

1.1 課題選擇的背景

信息時代的到來引發(fā)了一場知識和信息革命,計算機和現(xiàn)代網(wǎng)絡(luò)技術(shù)的廣泛應(yīng)用極大地促進了社會經(jīng)濟的發(fā)展,同時也帶來了一些新興產(chǎn)業(yè)的發(fā)展,比如聊天軟件。隨著計算機網(wǎng)絡(luò)日新月異的發(fā)展,人們的交流方式越來越多,傳統(tǒng)的交流方式已經(jīng)難以滿足人們的交流的需求了,網(wǎng)絡(luò)聊天已經(jīng)慢慢成為人們生活的一部分,呈現(xiàn)出良好的勢頭和廣闊的發(fā)展前景。在互聯(lián)網(wǎng)上即時的和好友取得聯(lián)系,已經(jīng)成為當今社會人們主流的聯(lián)系方式。同時,即時通信系統(tǒng)對現(xiàn)代企業(yè)也有著重大意義,它能實現(xiàn)快速人際交流、數(shù)據(jù)共享,從而提高效率和生產(chǎn)力。實時通信為諸多企業(yè)開拓了網(wǎng)絡(luò)應(yīng)用的新領(lǐng)域。自從它誕生以來,以實時交互、資費低廉等優(yōu)點,受到廣大個人用戶的喜愛,已經(jīng)成為網(wǎng)絡(luò)生活中不可或缺的一部分。越來越多的企業(yè)已開始認識到即時通信工具能夠帶來極高的生產(chǎn)力,并借助它的應(yīng)用,來提高業(yè)務(wù)協(xié)同性及反饋的敏感度和快捷度。網(wǎng)上聊天系統(tǒng)是為人們之間進行交流和聯(lián)系提供的一個平臺。通過提供完善的網(wǎng)上聊天系統(tǒng)服務(wù),可以達到增進彼此之間的了解,增進人與人之間的感情交流。因此,兩臺計算機之間進行即時通訊、發(fā)送文件等交流方式已經(jīng)成為必然潮流。于是出現(xiàn)了QQ、UC 等聊天工具,然而QQ、UC 等聊天工具雖然方便、實用,但是,娛樂功能太多,有很多吸引人的娛樂功能,從一定程度上來說,是一種娛樂工具,不能作為用于即時通訊的專用工具。目前,用于實現(xiàn)單一的即時通訊的軟件實在太少,為此,我們決定開發(fā)一個專用于實現(xiàn)多臺計算機之間即時通訊的軟件,以方便多臺計算機之間信息的快速交流。

1.2 課題選擇意義

計算機越來越成為我們生活中的重要工具,自從1968年世界上第一個計算機網(wǎng)絡(luò)--ARPA網(wǎng)(美國國防部高級研究計劃網(wǎng))投入運行以來,計算機網(wǎng)絡(luò)技術(shù)在全世界范圍內(nèi)迅速發(fā)展,猶如雨后春筍,各種網(wǎng)絡(luò)紛紛涌現(xiàn)。不同國家的計算機網(wǎng)絡(luò)相互連接,形成跨國計算機網(wǎng)絡(luò),促進了世界各國之間的科技、文化和經(jīng)濟交流。在電子商務(wù)的應(yīng)用中,計算機網(wǎng)絡(luò)作為基礎(chǔ)設(shè)施,將分散在各地的計算機系統(tǒng)連接起來,使得計算機之間的通訊在商務(wù)活動中發(fā)揮了重要的作用,從此計算機的作用不再那么單調(diào),現(xiàn)在Internet把幾乎全球的服務(wù)器相互連接起來,這樣不僅使網(wǎng)絡(luò)上的計算機之間進行相互訪問并下載對自己有用的資源,還可以用來寫信、聽音樂、看電視、通過可視電話進行通信,通過Internet網(wǎng)進行信息查詢、網(wǎng)上購物等。計算機正在改變我們的通信、工作和娛樂的方式。

1.3 系統(tǒng)開發(fā)技術(shù)簡介

1.3.1 Java簡介

Java是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計語言(以下簡稱Java語言)和Java平臺的總稱。它以C++為基礎(chǔ),但是卻是一個全新的軟件開發(fā)語言。Java是一個簡單,面象對象,分布式,解釋性,強壯,安全,與系統(tǒng)無關(guān),可移植,高性能,多線程和動態(tài)的語言-------這是 Sun給Java的定義。

Java平臺由Java虛擬機(Java Virtual Machine)和Java 應(yīng)用編程接口(Application Programming Interface、簡稱API)構(gòu)成。Java 應(yīng)用編程接口為Java應(yīng)用提供了一個獨立于操作系統(tǒng)的標準接口,可分為基本部分和擴展部分。在硬件或操作系統(tǒng)平臺上安裝一個Java平臺之后,Java應(yīng)用程序就可運行。現(xiàn)在Java平臺已經(jīng)嵌入了幾乎所有的操作系統(tǒng)。

Java是一種簡單的,面向?qū)ο蟮?,分布式的,解釋型的,健壯安全的,結(jié)構(gòu)中立的,可移植的,性能優(yōu)異、多線程的動態(tài)語言。Java 對開發(fā)者具有不可估量的價值,使他們可以:

  • 在一個平臺上編寫軟件,然后即可在幾乎所有其他平臺上運行

  • 創(chuàng)建可在 Web 瀏覽器和 Web 服務(wù)中運行的程序

  • 開發(fā)適用于在線論壇、存儲、投票、HTML 格式處理以及其他用途的服務(wù)器端應(yīng)用程序

  • 將采用 Java 語言的應(yīng)用程序或服務(wù)組合在一起,形成高度定制的應(yīng)用程序或服務(wù)

  • 為移動電話、遠程處理器、低成本的消費產(chǎn)品以及其他任何具有數(shù)字核心的設(shè)備編寫強大而高效的應(yīng)用程序
    Sun公司的口號就是"網(wǎng)絡(luò)就是計算機",Java能使所有東西從桌面計算平穩(wěn)的轉(zhuǎn)變?yōu)榛诰W(wǎng)絡(luò)的計算,它是專門為此而建立的,并顯然是為了完成這個任務(wù)而來的。使用Java,我們可以相對輕松的一天編寫一個有條理的網(wǎng)絡(luò)程序。今天,Java的網(wǎng)絡(luò)功能正在飛躍發(fā)展,不斷有新的特性增加到這個有價值的基礎(chǔ)上,JavaSoft實驗室正在不斷努力使Java更加完善。
    1.3.2 JDBC技術(shù)簡介
    JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,JDBC是Java的開發(fā)者Sun的Javasoft公司制定的。它由一組用Java語言編寫的類和接口組成。JDBC為工具/數(shù)據(jù)庫開發(fā)人員提供了一個標準的API,據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠用純 Java API 編寫數(shù)據(jù)庫應(yīng)用程序。
    有了JDBC,向各種關(guān)系數(shù)據(jù)發(fā)送SQL語句就是一件很容易的事。換言之,有了JDBC API,就不必為訪問Sybase數(shù)據(jù)庫專門寫一個程序,為訪問Oracle數(shù)據(jù)庫又專門寫一個程序,或為訪問Informix數(shù)據(jù)庫又編寫另一個程序等等,程序員只需用JDBC API寫一個程序就夠了,它可向相應(yīng)數(shù)據(jù)庫發(fā)送SQL調(diào)用。同時,將Java語言和JDBC結(jié)合起來使程序員不必為不同的平臺編寫不同的應(yīng)用程序,只須寫一遍程序就可以讓它在任何平臺上運行,這也是Java語言“編寫一次,處處運行”的優(yōu)勢。
    Java數(shù)據(jù)庫連接體系結(jié)構(gòu)是用于Java應(yīng)用程序連接數(shù)據(jù)庫的標準方法。JDBC對Java程序員而言是API,對實現(xiàn)與數(shù)據(jù)庫連接的服務(wù)提供商而言是接口模型。作為API,JDBC為程序開發(fā)提供標準的接口,并為數(shù)據(jù)庫廠商及第三方中間件廠商實現(xiàn)與數(shù)據(jù)庫的連接提供了標準方法。JDBC使用已有的SQL標準并支持與其它數(shù)據(jù)庫連接標準,如ODBC之間的橋接。JDBC實現(xiàn)了所有這些面向標準的目標并且具有簡單、嚴格類型定義且高性能實現(xiàn)的接口。
    Java 具有堅固、安全、易于使用、易于理解和可從網(wǎng)絡(luò)上自動下載等特性,是編寫數(shù)據(jù)庫應(yīng)用程序的杰出語言。所需要的只是 Java應(yīng)用程序與各種不同數(shù)據(jù)庫之間進行對話的方法。而 JDBC 正是作為此種用途的機制。
    ODBC在Windows系列平臺應(yīng)用程序中和JDBC在Web和Internet應(yīng)用程序中的作用的作用類似。ODBC(OpenData Base Connectivity),稱為開放式數(shù)據(jù)庫互聯(lián)技術(shù),是由Microsoft公司倡導(dǎo)并得到業(yè)界普遍響應(yīng)的一門數(shù)據(jù)庫連接技術(shù)。 JDBC現(xiàn)在可以連接的數(shù)據(jù)庫包括:xbase、Oracle、Sybase、Aceess以及Paradox等。
    JDBC的工作機制 :JDBC定義了Java語言同SQL數(shù)據(jù)之間的程序設(shè)計接口。JDBC有一個非常獨特的動態(tài)連接結(jié)構(gòu),它使得系統(tǒng)模塊化。使用JDBC來完成對數(shù)據(jù)庫的訪問包括以下四個主要組件:Java的應(yīng)用程序、JDBC驅(qū)動器管理器、驅(qū)動器和數(shù)據(jù)源。
    JavaSoft公司開發(fā)了JDBC API,JDBC API是一個標準統(tǒng)一的SQL數(shù)據(jù)存取接口。 JDBC在Internet中的作用與ODBC在Windows系列中的作用類似。它為Java程序提供了一個統(tǒng)一縫地操作各種數(shù)據(jù)庫的接口,程序員編程時,可以不關(guān)心它所要操作的數(shù)據(jù)庫是哪個廠家的產(chǎn)品,從而提高了軟件的通用性,而且在Internet上確實無法預(yù)料你的用戶想訪問什么類型的數(shù)據(jù)庫。只要系統(tǒng)上安裝了正確的驅(qū)動器組,JDBC應(yīng)用程序就可以訪問其相關(guān)的數(shù)據(jù)庫。
    1.3.3 數(shù)據(jù)庫Microsoft SQL-Server 2000 簡介
    Microsoft SQL-Server(簡稱 SQL-Server)是微軟公司推出的一個高性能的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),隨著其產(chǎn)品性能的不斷提高,使之在數(shù)據(jù)庫系統(tǒng)領(lǐng)域中占有重要地位。Microsoft SQL-Server 2000是繼SQL-Server 6.5和SQL-Server 7.0以后,推出的又一改進的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它能使用戶快捷地管理數(shù)據(jù)庫和開發(fā)應(yīng)用程序。SQL-Server 2000使用了最先進的數(shù)據(jù)庫結(jié)構(gòu),與Windows DNA緊密集成,具有強大的Web功能,它可以利用高端硬件平臺以及最新網(wǎng)絡(luò)和存儲技術(shù),可以為最大的Web站點和企業(yè)應(yīng)用提供優(yōu)良的擴展性和可靠性,使用戶能夠在Internet領(lǐng)域快速建立服務(wù)系統(tǒng),為占領(lǐng)市場贏得寶貴的時間。同時,SQL-Server 2000還為用戶提供了重要的安全性功能的增強,為用戶的數(shù)據(jù)安全提供了可靠的保證。另外,SQL-Server 2000在數(shù)據(jù)庫服務(wù)器自動管理技術(shù)方面處于數(shù)據(jù)庫領(lǐng)域的領(lǐng)先地位,它可以使用戶免去繁瑣復(fù)雜的工作量,從而又精于處理更重要的問題,使系統(tǒng)在商業(yè)戰(zhàn)略上占得先機。SQL-Server 數(shù)據(jù)庫系統(tǒng)特點:與Internet高度集成;高伸縮性和適應(yīng)性;企業(yè)級數(shù)據(jù)庫功能強。
    存儲過程是存儲在服務(wù)器上的預(yù)先編譯好的SQL語句,可以在服務(wù)器上的SQL Server環(huán)境下運行[12]。使用存儲過程有如下的好處:執(zhí)行時間短;客戶/服務(wù)器開發(fā)分離;安全性高。SQL-Server 2000工具界面與標準Windows 界面非常類似,具有菜單欄、圖標、樹狀視圖控件、單選按鈕等。這些熟悉的界面使以前即使從沒有見到過這些應(yīng)用程序的人也能夠很快地了解一些基本的功能。
    1.3.4 多線程介紹
    Java 支持內(nèi)置多線程編程。多線程程序包括兩條或兩條以上并發(fā)運行的部分。程序中每個這樣的部分都叫一個線程,每個線程都是獨立的執(zhí)行路徑。因此,多線程是多任務(wù)處理的一種特殊形式。
    多任務(wù)處理有兩種截然不同的類型:基于進程的和基于線程的。進程本質(zhì)上一個正在執(zhí)行的程序。因此,基于進程的多任務(wù)處理的特點是允許你的計算機同時運行兩個或更多的程序。舉例來說,基于進程的讀任務(wù)處理使你在運行文本編輯器的時候可以同時運行Java 編譯器。在基于進程的多任務(wù)處理中,程序是調(diào)度程序多分派的最小代碼。也就是說,進程是資源申請、調(diào)度和獨立運行的單位,因此,它使用系統(tǒng)中的運行資源。
    在基于線程的多任務(wù)處理環(huán)境中,線程是最小的執(zhí)行單位。線程是進程中的一個單一的連續(xù)控制流程。一個進程可以擁有多個線程。這意味著一個程序可以同時執(zhí)行兩個或多個任務(wù)的功能。例如,一個文本編輯器可以在打印的同時格式化文本。所以,多進程程序處理大局問題,而多線程程序處理細節(jié)問題。
    多線程程序比多進程程序需要更少的管理開銷。進程是重量級的任務(wù),需要分配它們自己獨立的地址空間。進程間通信是昂貴和受限的。進程間的轉(zhuǎn)換也是很需要花費的。另一方面,線程是輕量級的選手,它和進程一樣擁有獨立的執(zhí)行控制,由操作系統(tǒng)負責(zé)調(diào)度。區(qū)別在于線程沒有獨立的存儲空間,而是和所屬進程的其他線程共享一個存儲空間,因此,線程間通信是容易的,線程間的轉(zhuǎn)換也是低開銷的。當Java 程序使用多進程的任務(wù)處理環(huán)境時,多進程的程序不受Java 的控制,而多線程則受控于Java。
    多線程可以幫會你寫出CPU 最大利用率的高效程序,因為空閑時間保持最低。這對Java 運行的交互式的網(wǎng)絡(luò)互聯(lián)環(huán)境至關(guān)重要,因為空閑時間是公共的,舉個例子來說,網(wǎng)絡(luò)的數(shù)據(jù)處理傳輸速率遠低于計算機處理能力,本地文件系統(tǒng)資源的讀寫速度遠低于CPU 的處理能力,當然,用戶輸入也比計算機慢的多。在傳統(tǒng)的單線程環(huán)境中,你的程序必須等待每一個這樣的任務(wù)完成以后才能執(zhí)行下一步—盡管CPU 有很多空閑時間。多線程是你能夠獲得并充分利用這些空閑時間。
    ·多線程編程簡單,效率高(能直接共享數(shù)據(jù)和資源,而多進程卻不能)
    ·適合于開發(fā)多種交互接口的程序
    ·減輕編寫交互頻繁,涉及面多的程序的困難
    在本系統(tǒng)中,設(shè)置后臺線程處理服務(wù)器和客戶程序的通信。服務(wù)器資源以輕量級的線程提供,和多個客戶線程并發(fā)連接通信。這樣可以減輕服務(wù)器端的開銷,同時保證了多個用戶端連接能夠得到快速而高效的服務(wù)。
    第2章 系統(tǒng)分析
    2.1 系統(tǒng)需求
    隨著網(wǎng)絡(luò)的迅速發(fā)展,通過即時通訊工具進行相互交流,溝通會對用戶帶來很多的方便,像現(xiàn)在很流行的QQ、MSN、UC等,它們?yōu)橛脩魝冎g的溝通帶來很多的方便的,但是這些即時工具在企業(yè)或者學(xué)校禁止用戶訪問外網(wǎng)的時候,這些即時的通信工具就不能使用了,用戶之間就不能很方便的溝通交流了,可以通過自己設(shè)計一個即時通訊工具,自己建立服務(wù)器,放在內(nèi)部網(wǎng)絡(luò),在用戶不能訪問外部網(wǎng)絡(luò)的時候,可以很方便用戶之間進行溝通交流。
    2.1.1 系統(tǒng)的特點分析
    基于JAVA的網(wǎng)絡(luò)聊天系統(tǒng)基于C/S 模式實現(xiàn),采用Java 語言編寫。所有用戶都通過服務(wù)器端中轉(zhuǎn)消息,這也是現(xiàn)有大多數(shù)聊天系統(tǒng)所采用的模式。本系統(tǒng)真正地實現(xiàn)了多點聊天的功能,可以在多點間快速傳遞信息。同時,它體積小,功能單一,界面簡潔美觀,容易上手,只要簡單閱讀服務(wù)器端和客戶端的幫助文檔即可完全掌握它的使用方法,同時該系統(tǒng)是網(wǎng)絡(luò)聊天,特別是局域網(wǎng)聊天不可多得的好幫手。
    2.1.2 網(wǎng)絡(luò)聊天系統(tǒng)需要解決的問題
    首先,網(wǎng)絡(luò)聊天系統(tǒng)是一個比較復(fù)雜的系統(tǒng),良好的架構(gòu)設(shè)計非常的重要:C/S 模式是較為成熟的軟件運行模式,基于局域網(wǎng)設(shè)計,運行速度快,安全性高,為當今主要的軟件所采用的模式。不好的架構(gòu)會在系統(tǒng)實現(xiàn)或者維護階段系統(tǒng)的擴展帶來很多麻煩。
    其次,服務(wù)器的承載能力,如何處理多個用戶的同時登錄和請求,好的設(shè)計會使系統(tǒng)在很多并發(fā)用戶登錄的時候不至于系統(tǒng)崩潰。
    最后,服務(wù)器和客戶端的通信協(xié)議制定比較困難,如何制定一套簡單,并且易于客戶端和服務(wù)器之間理解的通信規(guī)則非常重要,否則會在服務(wù)器和客戶端通信設(shè)計的時候帶來很多的問題。
    2.2 系統(tǒng)設(shè)計思想
    本系統(tǒng)的設(shè)計思路如下:

  1. 系統(tǒng)采用模塊化設(shè)計,針對不同的應(yīng)用設(shè)計不同的模塊,并對這些模塊都進行集中式管理,作為應(yīng)用程序有較強的可操作性和擴展性。

  2. 合理的數(shù)據(jù)流設(shè)計,在應(yīng)用系統(tǒng)設(shè)計中,相對獨立的模塊間以數(shù)據(jù)流相互連接,使各模塊間的耦合性較低,方便系統(tǒng)運行,提高系統(tǒng)安全性,盡量保證低耦合,高內(nèi)聚。

  3. 采用封裝的思想,根據(jù)模塊的不同情況進行類的封裝,并重用各個模塊,并合理利用各種設(shè)計模式,為以后維護帶來方便。


2.3 系統(tǒng)實現(xiàn)功能分析

本次設(shè)計主要實現(xiàn)了以下幾個功能:

● 客戶端功能設(shè)計如下:

  1. 身份認證,該模塊主要實現(xiàn)用戶的登陸認證,以及服務(wù)器代理IP和端口的設(shè)置,并檢查數(shù)據(jù)的合法性。

  2. 聊天功能,該模塊主要用Socket實現(xiàn)不同用戶之間消息的的發(fā)送,并且不僅僅傳文本格式的數(shù)據(jù),也可以傳輸圖片,需要自己封裝并自定義消息流,并能夠識別顯示。

  3. 文件傳輸,該模塊主要實現(xiàn)不同用戶之間進行文件的傳輸。

● 服務(wù)器端功能設(shè)計如下:

  1. 在線用戶統(tǒng)計,該模塊主要實現(xiàn)在線用戶的查看顯示,并可以控制其在線狀態(tài),強迫特定用戶下線。

  2. 日志記錄,該模塊主要記錄客戶端用戶上線、下線情況,并存儲下來。

  3. 發(fā)布信息,該模塊主要服務(wù)器可以發(fā)布系統(tǒng)信息,使客戶端可以接收。

2.4 系統(tǒng)開發(fā)及運行環(huán)境

  1. 系統(tǒng)開發(fā)平臺:本系統(tǒng)采用eclipse 及WINDOWS XP設(shè)計。

  2. 硬件環(huán)境:
    運行本系統(tǒng)的硬件基本要求如下:
    CPU:Intel P3及以上;
    內(nèi)存:256MB及以上;
    硬盤:40GB及以上。

  3. 數(shù)據(jù)庫管理系統(tǒng)軟件:SQL Server 2000。

第3章 系統(tǒng)總體設(shè)計

3.1 總體構(gòu)架

基于Java的網(wǎng)絡(luò)聊天系統(tǒng)設(shè)計與實現(xiàn)主要考慮三個個方面的設(shè)計,即服務(wù)器模塊設(shè)計,服務(wù)器客與客戶端通信規(guī)則設(shè)計和客戶端模塊設(shè)計,本系統(tǒng)整體構(gòu)架如圖3.1所示。

圖3.1 系統(tǒng)整體構(gòu)架圖

3.2 系統(tǒng)整體功能

基于JAVA的網(wǎng)絡(luò)聊天系統(tǒng)分為服務(wù)器端和客服端,其中:

服務(wù)器端包括:在線用戶管理模塊,用戶管理模塊,部門管理模塊,日志管理模塊;

客服端包括:用戶認證模塊,主界面模塊,聊天模塊,文件傳輸模塊。

系統(tǒng)整體功能設(shè)計如下圖2.2所示

圖3.2 系統(tǒng)整體功能設(shè)計圖

3.3 系統(tǒng)模塊功能設(shè)計

整個系統(tǒng)分為3個模塊,其中主要功能如下:

(一)服務(wù)器端模塊

服務(wù)器端模塊首先設(shè)計多線程來處理客戶端的連接,當受到客戶端請求的時候,建立一個新的線程來處理客戶端的連接。并且在一個注冊中心中登記該線程,并存儲客戶端用戶的一些信息,方便服務(wù)器統(tǒng)計在線用戶,以便與這些在線用戶進行通信。除此之外,為了方便用戶更好的操作和掌握服務(wù)器端,系統(tǒng)還設(shè)計四個管理服務(wù)器的模塊,分別是在線用戶管理模塊,用戶管理模塊塊,部門管理管理模塊和日志管理模塊。各個模塊功能設(shè)計如下:

  1. 在線用戶管理模塊
    該模塊主要實現(xiàn)在線用戶管理,查看當前登陸賬號的所有用戶信息(在線用戶的)。并且管理員有權(quán)限設(shè)置用戶的在線狀態(tài),可以強制用戶下線。同時添加一些輔助的功能,比如服務(wù)器發(fā)送一些系統(tǒng)公告信息等,這樣有利于系統(tǒng)消息的及時發(fā)送。

  2. 用戶管理模塊
    該模塊主要實現(xiàn)新用戶的添加、注冊用戶的刪除、修改和查看的功能,管理數(shù)據(jù)庫中存儲的用戶信息。該模塊可以對注冊用戶的信息(注冊用戶的編號,姓名,性別,頭像,年齡,家庭住址,聯(lián)系電話,注冊時間愛你)進行修改以及查看,并且保證客戶端使用這些用戶信息登陸服務(wù)器。

  3. 部門管理模塊
    該模塊主要實現(xiàn)部門的添加、注冊部門的刪除、修改和查看的功能,管理數(shù)據(jù)庫中存儲的部門信息。該模塊可以對注冊部門的信息(部門名稱,部門描述)進行修改以及查看。

  4. 日志管理模塊

日志管理模塊主要實現(xiàn)服務(wù)器運行狀態(tài)信息,以及注冊用戶登陸的一些信息進行記錄,管理員可以在需要的時候查看日志,監(jiān)控服務(wù)器的一些狀態(tài),以及客戶端一些用戶的狀態(tài)。

(二)協(xié)議規(guī)則模塊

該模塊主要實現(xiàn)服務(wù)器與客戶端之間通信規(guī)則的制定。其具體思路是:在服務(wù)器使用Socket通信的時候,把服務(wù)器與客戶端通信的信息封裝為一個類對象,然后通過自己手動將這些類對象轉(zhuǎn)化為輸入流,并在另一端輸出流,根據(jù)自己制定的規(guī)則逆序解析流,把流轉(zhuǎn)化為類對象。實現(xiàn)服務(wù)器與客戶端之間的通信。其中具體的表示信息要自己制定,比如登陸成功標示,失敗標示,修改密碼標示,聊天標示等,這些都需要自己通過一些數(shù)字標記。

(三)客戶端模塊

客戶端模塊主要實現(xiàn),用戶賬號到服務(wù)器的認證,以及登陸之后與其他用戶通信或者部門通信,除了簡單文本聊天之外,也考慮用戶之間文件傳輸?shù)墓δ?。其中客戶端之間的通信,是在客戶端之間搭建服務(wù)器,也即客戶端自己建立SocketServer,并用多線程來處理對不同用戶的聊天。用戶之間文件傳輸也是通過搭建客戶端之間的服務(wù)器來實現(xiàn)文件出傳的,不需要通過服務(wù)器來實現(xiàn)信息的傳輸,可以減少延遲,也減少了服務(wù)器端的流量損失。但是在客戶之間搭建連接的時候仍然需要通過服務(wù)器來實現(xiàn)一些簡單的通知操作,實現(xiàn)客戶端與客戶端之間搭建其連接。因此客戶端大體分四個模塊,分別是用戶認證模塊,主界面模塊,聊天模塊和文件傳輸模塊。各個功能模塊設(shè)計如下:

  1. 用戶認證模塊
    可以模仿QQ登陸界面,輸入用戶名和密碼,以及服務(wù)器IP和端口,實現(xiàn)賬號和密碼到服務(wù)器的認證,判斷用戶是否有權(quán)限登錄主界面進行信息溝通。

  2. 主界面模塊
    該模塊主要實現(xiàn)類似QQ友好的界面,查看自己的信息,修改密碼,顯示好友列表組列表信息。使用Swing現(xiàn)有組建擴展制作合適的界面設(shè)計,并搭配后臺功能。

  3. 聊天模塊
    該模塊主要實現(xiàn)不同用戶之間信息的發(fā)送,如何實現(xiàn)點對點用戶通信,多點用戶通信,要考慮多線程的設(shè)計才可以實現(xiàn)。同時信息發(fā)送除了文本之外還要考慮其他信息格式比如圖片之類。

  4. 文件傳輸模塊
    實現(xiàn)不同用戶之間多線程的文件傳輸。
    第4章 數(shù)據(jù)庫設(shè)計
    4.1 系統(tǒng)E-R圖

    1. E-R模型


基于網(wǎng)絡(luò)聊天系統(tǒng)數(shù)據(jù)庫E-R模型,如圖 所示:

圖4.1 聊天系統(tǒng)E-R圖

4.2 數(shù)據(jù)字典

  1. 用戶表 (用戶ID(主鍵),用戶名,密碼,用戶密碼,性別,頭像ID,部門ID,年齡,電話號碼,地址,注冊時間,狀態(tài))。

  2. 分組信息表(分組ID(主鍵),分組名字,標記)。

4.3 各個數(shù)據(jù)表的創(chuàng)建

基于網(wǎng)絡(luò)聊天系統(tǒng)數(shù)據(jù)庫包括部門信息以及用戶信息,部門信息表格和用戶信息表格的設(shè)計結(jié)果如表4.1,表4.2所示:每個表格表示在數(shù)據(jù)庫中的一個表。

表4.1部門信息表(T_DEPARTMENT)

列名數(shù)據(jù)類型可否為空字段名稱字段大小D_IDVARCHARNo null分組ID3D_NAMEVARCHAR√分組名字50D_REMARKVARCHAR√標記100

表4.2 用戶表(T_USER)

列名數(shù)據(jù)類型可否為空字段名稱字段大小U_IDVARCHARNot null用戶ID6U_NAMEVARCHAR√用戶名50U_PASSWORDVARCHAR√用戶密碼20U_SEXVARCHAR√性別3U_ICONIDINT√頭像ID4U_DEPTIDVARCHAR√部門ID3U_AGEINT√年齡4U_TELVARCHAR√電話號碼20U_ADDRESSVARCHAR√地址100U_REGTIMEDATETIME√注冊時間8U_ISONLINEINT√狀態(tài)4

4.4 數(shù)據(jù)庫的連接

打開控制面板,找到管理工具,在選中數(shù)據(jù)源配置,進行ODBC數(shù)據(jù)源的配置其中主要的配置流程如下面圖所示:

圖4.2 配置QQ數(shù)據(jù)源界面

圖4.3 配置QQ數(shù)據(jù)庫界面

圖4.4 測試數(shù)據(jù)源連接

第5章 系統(tǒng)實現(xiàn)與編碼

5.1 服務(wù)器功能模塊的設(shè)計

5.1.1 Socket和ServerSocket介紹

Socket,簡稱套接字,用于實現(xiàn)網(wǎng)絡(luò)上客戶和服務(wù)器之間的連接。也就是說網(wǎng)絡(luò)上兩個或兩個以上雙工方式通信的進程之間總有一個連接,這個連接的端點成為套接字,套接字是在比較低的層次上通信的。

具體的說:一個服務(wù)器應(yīng)用程序一般偵聽一個特定的端口等待客戶端的連接請求,當一個連接請求到達時,客戶端和服武器端建立一個通信連接,在連接過程中,客戶端被分配一個本地端口與一個socket建立連接,客戶端通過寫socket來通知服務(wù)器,以讀socket中的信息,類似的服務(wù)器也獲得一個本地端口,它需要一個新的端口號來偵聽原始端口上的其他連接請求。服務(wù)器也通過它的本地端口連接一個socket,通過讀寫和客戶端通信。

Socket程序的工作過程:

1、建立Socket連接:在通信開始之前由通信雙方確認身份,建立一條專用的虛擬連接通道。

2、數(shù)據(jù)通信:利用虛擬連接通道傳送數(shù)據(jù)信息進行通道。

3、關(guān)閉:通信結(jié)束時,再將所建的虛擬連接拆除。

實現(xiàn)套接字的服務(wù)端,需要使用ServerSocket 類。ServerSocket類是服務(wù)器程序的運行基礎(chǔ),它允許程序綁定一個端口號來監(jiān)聽客戶端的請求,一旦產(chǎn)生客戶端請求,它將接受這一請求,同時產(chǎn)生一個完整的Socket 連接對象。服務(wù)器綁定的端口必須公開,以便讓客戶端程序知道如何連接這個服務(wù)器。同時,作為服務(wù)器,它必須能夠接收多個客戶的請求,這就需要為服務(wù)器設(shè)置一個請求隊列,如果服務(wù)器不能馬上響應(yīng)客戶端的請求,要將這個請求放進請求隊列中,等服務(wù)器將當前的請求處理完,會自動到請求隊列中按照先后順序取出請求進行處理。服務(wù)器的資源是有限的,這就導(dǎo)致它的最大連接數(shù)是有限的,通過ServerSocket 的構(gòu)造函數(shù)可以指定這個最大連接數(shù)。如果不明

確指定這個連接數(shù),默認最大連接數(shù)為50,也就是說,客戶端的請求隊列最大可以容納50 個請求,當超過這個最大連接數(shù)時,用戶的請求將不再會被響應(yīng)。 利用SocketServer 也提供了一些方法,它們主要有:

accept() 返回一個“已連接”的Socket 對象

getInetAddress() 得到該服務(wù)器的IP 地址

getLocalPort() 得到服務(wù)器所偵聽的端口號

setSoTimeout() 設(shè)置服務(wù)器超時時間

getSoTimeout() 得到服務(wù)器超時時間

服務(wù)器和客戶端通過Socket簡單通信框架下圖所示。

圖 5.1 服務(wù)器和客戶端通過Socket簡單通信框架

5.2 服務(wù)器功能模塊的實現(xiàn)

5.2.1 多線程服務(wù)器模塊實現(xiàn)

服務(wù)器模塊核心功能是使用Socket Server實現(xiàn)多線程的服務(wù)器,針對每一個客戶建立一個單獨的線程處理客戶端的請求。其具體思路是,首先建立Socket Server,并綁定服務(wù)器IP和某個未使用的端口。然后監(jiān)聽該端口,如果有客戶端的Socket連接則建立一個客戶端線程ClientThread類對象,有該對象處理該客戶的一些請求,并在ClientThread中保存User Bean對象,該對象保存了用戶的一些基本信息,比如賬號、密碼、年齡、是否在線等。如果服務(wù)器沒有關(guān)閉Socket Server則服務(wù)器則一直處理客戶端連接。其核心代碼如下。

public class MessageServer extends Thread {

//服務(wù)器端SocketServer

private ServerSocket server;

private boolean isStop = false;

public MessageServer(int port) throws IOException {

server = new ServerSocket(port);

}

/**

* 消息服務(wù)

*/

public void run() {

Socket client;

try {

while (!isStop) {

//建立處理客戶端連接的線程

client = server.accept();

(new ClientThread(client)).start();

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (server != null) {

try {

server.close();

} catch (IOException e1) {

// e1.printStackTrace();

}

}

isStop = true;

}

}

}

5.2.2 在線用戶管理模塊實現(xiàn)

該模塊主要實現(xiàn)在線用戶統(tǒng)計、多線程服務(wù)器的啟動關(guān)閉、以及服務(wù)器發(fā)送系統(tǒng)公告等功能。其中在線用戶統(tǒng)計是在客戶端每次連接的時候服務(wù)器建立了ClientThread來單獨處理某個客戶請求,如果該客戶登陸成功的話則在工具類PubValue中一個HashMap添加該用戶信息,查看在線用戶信息的時候,可以通過工具類PubValue來的HashMap讀取在線用戶列表。系統(tǒng)公告則是通過服務(wù)器根據(jù)在線用戶列表,廣播系統(tǒng)公告到每個客戶端,實現(xiàn)信息的公布。其實核心代碼如下:

private void login(Message message) throws IOException {

if (message.getType().equals(PackOper.LOGIN)) {

User user = (User) message;

List list = UserDaoFactory.getUserDao().selectId(user.getId());

if (list.size() > 0) {

User tempUser = (User) list.get(0);

if (tempUser.getPassword().equals(user.getPassword())) {

if (tempUser.getIsOnline() == Parameter.ONLINE) { message.setType(PackOper.LOGIN_ONLINED);

myObjectOut.writeMessage(message);

this.setStop();

return;

}

ServerUI.getInstance().getLogUI().addLog(

LogOper.getInstance().insertOnLineLog(tempUser));

//登錄成功后

//先通知所有人

//再通知此用戶

//再把自己加到線程組中

//接著更新數(shù)據(jù)庫

//下載樹給此用戶

tempUser.setType(PackOper.LOGIN_SUCCEED);

tempUser.setIsOnline(pub.Parameter.ONLINE);

this.chatCompany(tempUser);

this.user = tempUser;

this.myObjectOut.writeMessage(tempUser);

PubValue.addUserThread(this.user.getId(), this);

UserDaoFactory.getUserDao().setOnline(tempUser.getId(),

Parameter.ONLINE);

ServerUI.getInstance().getOnLineUI().updateOnLine();

try {

Thread.sleep(10);

} catch (InterruptedException e1) {

// e1.printStackTrace();

}

// 登錄成功后發(fā)送樹

PubValue.company.setType(PackOper.ADD_COMPANY);

myObjectOut.writeMessage(PubValue.company);

list = DepartmentDaoFactory.

getDepartmentDao().select(null);

Iterator it = list.iterator();

while (it.hasNext()) {

message = (Message) it.next();

message.setType(PackOper.ADD_DEPARTMENT);

myObjectOut.writeMessage(message);

}

list = UserDaoFactory.getUserDao().select(null);

it = list.iterator();

while (it.hasNext()) {

message = (Message) it.next();

message.setType(PackOper.ADD_USER);

myObjectOut.writeMessage(message);

}

return;

}

}

message.setType(PackOper.LOGIN_DEFEATED);

myObjectOut.writeMessage(message);

this.setStop();

}

}

其實現(xiàn)效果如圖所示:

圖5.2 聊天服務(wù)器端界面

5.2.3 部門管理模塊實現(xiàn)

該模塊主要實現(xiàn)對部門進行管理,根據(jù)情況添加,刪除或者修改部門等。其設(shè)計主要是通過SQL語句來操作數(shù)據(jù)庫數(shù)據(jù)的。跟普通的管理系統(tǒng)設(shè)計思路一樣。沒有太多的算法,主要是SQL語句的構(gòu)造,以及數(shù)據(jù)庫操作的API函數(shù)的使用。其實現(xiàn)效果如圖所示.

圖5.3 部門管理模塊界面

5.2.4 用戶管理模塊實現(xiàn)

該模塊類似于部門管理模塊的設(shè)計,主要是針對用戶的一些信息進行管理,根據(jù)需要添加、刪除或者修改用戶信息。其實現(xiàn)主要也是SQL語句的構(gòu)造以及JDBC驅(qū)動提供函數(shù)的使用。比較復(fù)雜的部分設(shè)計主要體現(xiàn)界面的設(shè)計,如何使用Swing構(gòu)造友好并且易于交互的界面需要花費一些時間。以及實現(xiàn)組合條件的用戶查詢,可以根據(jù)用戶賬號查詢,或者所在部門查詢,或者編號查詢,或者根據(jù)這三個條件組合查詢,這一功能比較復(fù)雜,如何根據(jù)不同的情況構(gòu)造合適的SQL語句進行數(shù)據(jù)查詢,顯得很重要,否則粗略的設(shè)計會增加很多冗余代碼。其整體實現(xiàn)效果如下圖5.4所示。

圖5.4 用戶管理界面

5.2.5日志管理模塊實現(xiàn)

日志管理模塊主要是監(jiān)控服務(wù)器的一些狀態(tài),以及客戶端用戶登陸的情況。這些日志信息記錄是通過工具類LogOper實現(xiàn)日志的記錄。該類使用了設(shè)計模式中單例模式,保證服務(wù)器端在進行日志操作的時候只有一個實例在內(nèi)存中進行日志的記錄。其日志的存放路徑主要是在系統(tǒng)目錄下,其文件名為server.log。通過服務(wù)器UI界面查詢?nèi)罩拘畔⒁彩峭ㄟ^讀取該文件來查詢?nèi)罩居涗浀摹F鋵崿F(xiàn)效果如下圖5.5:

圖5.5 日志管理模塊界面

5.3協(xié)議設(shè)計與實現(xiàn)

5.3.1 協(xié)議規(guī)則

協(xié)議規(guī)則里主要用一些整數(shù)來表示服務(wù)器與客戶端通信的時候包的類型。服務(wù)器可以按照這個規(guī)則來解析包,并根據(jù)包中的信息做出相應(yīng)的操作。其標示的具體含義和定義規(guī)則下表5.1所示。

表5.1 協(xié)議規(guī)則表

標示名字標示值標示意義LOGIN10登錄包標識LOGIN_SUCCEED11登錄成功標識LOGIN_DEFEATED12登錄失敗標識LOGIN_ONLINED13已經(jīng)在線標識ADD_COMPANY14添加公司標識ADD_DEPARTMENT15添加部門標識ADD_USER16添加用戶包標識UPDATE_COMPANY17更新公司信息標識UPDATE_DEPARTMENT18更新部門信息UPDATE_USER19更新用戶信息DELETE_DEPARTMENT20刪除部門DELETE_USER21刪除用戶CHAT_USER22私聊CHAT_DEPARTMENT23部門聊天CHAT_ALL24公司聊天MESSAGE25公司通知UPFILE26要求傳送文件UPFILE_FIAT27許可傳送文件SEND_DEFUSE28發(fā)送方取消UPFILE_DEFUSE29不許可傳送文件DOWN_LINE30下線包FORCEDOWN_LINE31強制下線包UPPASSWORD32修改密碼UPPASSWORD_DEFEATED33原密碼不對UPPASSWORD_NEW_NULL34新密碼為空UPPASSWORD_SUCCEED35修改密碼成功SERVERCLOSE36服務(wù)器關(guān)閉

5.3.2 協(xié)議實現(xiàn)

協(xié)議的指定主要是考慮在進行通信的過程中,保證服務(wù)器和客戶端的通信消息能夠被雙方正確的理解,并作出相應(yīng)的處理,比如登陸失敗消息,登陸成功消息,文件傳輸消息,聊天消息等,服務(wù)器和客戶端必須要按照指定的規(guī)則去打包和解析消息。其中協(xié)議的設(shè)計是通過對Socket流進行自定義的封裝,把已經(jīng)定義好的對象的每一個屬性按照unicode編碼中的一些特殊的編碼\u0000(空格)進行分隔封裝,并發(fā)送輸入和輸出流,另一端安裝封裝的逆序把輸出流封裝為對象,并識別該對象隨對應(yīng)是什么樣的消息,客戶端或者服務(wù)器作出相應(yīng)的處理。而通過繼承輸入輸出流實現(xiàn)了服務(wù)器器信息的發(fā)送,但是具體的包類型是什么樣的消息是通過標示來標記。通過標示來解析這些包是什么樣類型的包,實現(xiàn)服務(wù)器和客戶端之間可理解的通信。其核心類PackOper類主要代碼如下:

/**

* 解包類

*?@author?Administrator

*/

public?class?PackOper?implements?PackInterface {/**

* 創(chuàng)建一個包,根據(jù)object類型

*?@param?object

*?@return

*/

public?byte[] createPackage(Object object) {

if?(object ==?null) {

return?null;

}

if?(object?instanceof?MessagePack) {

return?createMessagePack((MessagePack) object);

}

if?(object?instanceof?User) {

return?createUser((User) object);

}

if?(object?instanceof?Department) {

return?createDepartment((Department) object);

}

if?(object?instanceof?Company) {

return?createCompany((Company) object);

}

return?null;

}

/**

* 創(chuàng)建消息包

*?@param?pack

*?@return

*/

private?byte[] createMessagePack(MessagePack pack) {

return?createByte(STARTSEPARATOR?+ pack.getType() +?SEAS

+ pack.getFrom() +?SEAS?+ pack.getFromIP() +?SEAS

+ pack.getFromPort() +?SEAS?+ pack.getTo() +?SEAS

+ pack.getMessage() +?ENDSEPARATOR);

}

/**

* 解一般消息包

*?@param?strs

*?@return

*/

private?Message unbindMessagePack(String[] strs) {

MessagePack messagePack =?null;

if?(strs !=?null) {

try?{

messagePack =?new?MessagePack();

messagePack.setType(strs[0]);

messagePack.setFrom(strs[1]);

messagePack.setFromIP(strs[2]);

messagePack.setFromPort(Integer.parseInt(strs[3]));

messagePack.setTo(strs[4]);

messagePack.setMessage(strs[5]);

}?catch?(Exception e) {

return?null;

}

}

return

}

}

MyObjectInputStream.java,該文件繼承輸出流,并自定義解析輸出流的規(guī)則。Unit包里封裝了所有消息類封裝Bean。MyObjectInputStream.java,該文件繼承輸入流,并自定義解析輸入流的規(guī)則。PackOper.java該文件主要實現(xiàn)了,Socket發(fā)送字節(jié)流的解包規(guī)則,并轉(zhuǎn)化字節(jié)流為對象。也即服務(wù)器實現(xiàn)客戶端不同消息識別,服務(wù)器端并作出相應(yīng)處理。

5.4客戶端功能模塊的設(shè)計與實現(xiàn)

5.4.1 登陸認證模塊

該模塊主要實現(xiàn)用戶的登陸認證,以及服務(wù)器代理IP和端口的設(shè)置,并檢查數(shù)據(jù)的合法性。主要是參考現(xiàn)在通用即時聊天工具QQ界面進行設(shè)計,沒有采用具體的算法實現(xiàn)漂亮的算法,只是截取QQ界面的圖片作為自己設(shè)計界面的背景。同時用戶登錄身份認證使用簡單模擬的QQ協(xié)議通過發(fā)送登陸驗證包消息給服務(wù)器,服務(wù)器解包之后查詢數(shù)據(jù)庫檢查用戶身份的合法性,并發(fā)送給客戶端認證成功或者失敗包,客戶端解包之后如果認證成功則登陸成功,顯示主界面,否則提示用戶登陸失敗,提示用戶重新登陸。并且可以根據(jù)服務(wù)器IP和端口的變化進行動態(tài)設(shè)置服務(wù)器地址,具有很好的靈活性。具體實現(xiàn)效果如下圖5.6所示。

圖5.6 用戶登陸界面

5.4.2 主界面模塊

該模塊是參考QQ設(shè)計,截取QQ圖片作為自己界面設(shè)計背景素材。其中分組信息也是通過向服務(wù)器發(fā)送查詢該客戶端用戶的分組以及好友信息包,服務(wù)器解包之后查詢數(shù)據(jù)庫,并將查詢結(jié)果封裝成對象之后,轉(zhuǎn)化為Socket流發(fā)送給客戶端,客戶端將包信息解析封裝為對象,并顯示數(shù)據(jù)庫到客戶端主界面上。該模塊設(shè)計難點主要在如何有效的使用Swing提供的現(xiàn)有組建去擴展,實現(xiàn)漂亮的交互界面。如圖5.7:

圖5.7 用戶登陸后主界面

5.4.3 聊天模塊

聊天模塊設(shè)計思路如下:

該模塊是現(xiàn)在比較流行的QQ作為參考,設(shè)計的聊天的界面,特別是表情的發(fā)送,表情的窗口是FaceUI類封裝的,它調(diào)用相應(yīng)的輔助類來實現(xiàn)模擬QQ表情的實現(xiàn),同時,自定義封裝了聊天文本框,來實現(xiàn)文字和圖片混合的文本框,在發(fā)送的時候獲取用戶發(fā)送的內(nèi)容,自己封裝為預(yù)定義好的對象,并轉(zhuǎn)化為Socket流發(fā)送,經(jīng)過服務(wù)器,有服務(wù)器找到對應(yīng)客戶端并轉(zhuǎn)發(fā)消息,另一個客戶端運行專門的客戶端線程檢測消息,接收到服務(wù)器的消息之后,自動彈出聊天窗體,并把好友發(fā)過來的消息顯示在聊天界面上。其中,ChatUI類封裝了聊天主界面,實現(xiàn)聊天的功能。FaceUI類實現(xiàn)聊天的時候可以添加表情。其實現(xiàn)效果如下圖5.8:

圖5.8聊天界面

5.4.4 文件傳輸模塊

該模塊主要實現(xiàn)了用戶之間的聊天功能,可以傳輸表情和文字。而且也可以實現(xiàn)不同用戶之間多線程的文件傳輸功能,可以在聊天的同時不影響文件傳輸并行進行,而且多線程傳輸文件也提高了文件的傳輸速度。實現(xiàn)技術(shù)組要采用多線程文件傳輸模塊設(shè)計,主要實現(xiàn)不同用戶之間進行發(fā)送文件,SendStreamThread類,該類主要采用多線程的思想,發(fā)送Socket流,實現(xiàn)客戶端和服務(wù)器的通信,并通過服務(wù)器實現(xiàn)客戶端與另一個客戶端通信的功能。ReceiveStreamThread類,該類主要采用多線程的思想,接收Socket流,實現(xiàn)客戶端和服務(wù)器的通信,接收Socket流并根據(jù)QQ協(xié)議規(guī)則將Socket流轉(zhuǎn)化為相應(yīng)的消息對象,并通知本地主線程,作出相應(yīng)的處理。該類無論是在服務(wù)器或者是客戶端都在一直運行,只要發(fā)現(xiàn)有Socket流到來就接收,并交給主線程進行處理。其核心代碼如下,以ReceiveStreamThread類為例。

public class ReceiveStreamThread extends Thread {

private Socket socket;

private TransTask transTask;

public ReceiveStreamThread(Socket socket) {

this.socket = socket;

}

public void run() {

BufferedInputStream bufInStream = null;

BufferedOutputStream bufOutStream = null;

MyObjectInputStream myObjectIn = null;

MyObjectOutputStream myObjectOut = null;

try {

myObjectIn = new MyObjectInputStream(socket.getInputStream());

myObjectOut = new MyObjectOutputStream(socket.getOutputStream());

MessagePack msgPack = (MessagePack) myObjectIn.readMessage();

if (!msgPack.getType().equals(PackOper.UPFILE)) {

socket.close();

return;

}

// 尋找是否有此任務(wù)

this.transTask = TransFileStock.getReceiveFileUI(msgPack.getMessage());

if (transTask == null) {

socket.close();

return;

}

msgPack.setType(PackOper.UPFILE_FIAT);

myObjectOut.writeMessage(msgPack);

bufInStream = new BufferedInputStream(socket.getInputStream());

bufOutStream = new BufferedOutputStream(new FileOutputStream(

transTask.getSendFile()));

byte[] bufByte = new byte[1024];

int readLen = -1;

int readSum = 0;

while ((readLen = bufInStream.read(bufByte, 0, bufByte.length)) > 0

&& !transTask.getFileUI().isCancel()) {

bufOutStream.write(bufByte, 0, readLen);

readSum += readLen;

transTask.getFileUI().setPlan(readSum);

}

bufOutStream.flush();


if(readSum < transTask.getFileLength()){

transTask.getFileUI().setClose();

}else{

//傳送完畢

transTask.getFileUI().setTransFinish();

}

TransFileStock.removeReceiveTrans(transTask.toString());

} catch (UnsupportedEncodingException e) {

// TODO 自動生成 catch 塊

e.printStackTrace();

} catch (IOException e) {

// TODO 自動生成 catch 塊

e.printStackTrace();

} }

}

其實現(xiàn)效果如下圖5.9所示。


基于JAVA的網(wǎng)絡(luò)通訊系統(tǒng)設(shè)計與實現(xiàn)(論文+系統(tǒng))的評論 (共 條)

分享到微博請遵守國家法律
克什克腾旗| 福安市| 和硕县| 南京市| 建水县| 香格里拉县| 右玉县| 南溪县| 海口市| 屏边| 凭祥市| 阿拉尔市| 新津县| 界首市| 福州市| 平和县| 文登市| 南澳县| 屏边| 宜昌市| 竹北市| 洛浦县| 东方市| 大埔县| 滨州市| 衢州市| 泰来县| SHOW| 临清市| 辽中县| 揭东县| 天水市| 镇远县| 沅江市| 玉林市| 武威市| 西畴县| 建瓯市| 孝昌县| 潍坊市| 灵璧县|