軟件工程課程設(shè)計報告報告Socket聊天系統(tǒng)_第1頁
軟件工程課程設(shè)計報告報告Socket聊天系統(tǒng)_第2頁
軟件工程課程設(shè)計報告報告Socket聊天系統(tǒng)_第3頁
軟件工程課程設(shè)計報告報告Socket聊天系統(tǒng)_第4頁
軟件工程課程設(shè)計報告報告Socket聊天系統(tǒng)_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 Socket聊天系統(tǒng) 計科10102班35 *衛(wèi)軍- . z. - w -目錄TOC o 1-3 h u HYPERLINK l _Toc9229 1.前言 PAGEREF _Toc9229 4 HYPERLINK l _Toc3729 2.需求分析 PAGEREF _Toc3729 5 HYPERLINK l _Toc8545 2.1系統(tǒng)的功能需求 PAGEREF _Toc8545 5 HYPERLINK l _Toc9031 2.1.4點歌 PAGEREF _Toc9031 5 HYPERLINK l _Toc6720 2.1.5分組管理 PAGEREF _Toc6720 5 HYPER

2、LINK l _Toc31814 2.1.6個人信息管理 PAGEREF _Toc31814 5 HYPERLINK l _Toc2708 2.1.7用戶管理 PAGEREF _Toc2708 5 HYPERLINK l _Toc26366 2.1.8視頻通話 PAGEREF _Toc26366 5 HYPERLINK l _Toc3696 2.2非功能需求: PAGEREF _Toc3696 5 HYPERLINK l _Toc10744 2.2.2網(wǎng)絡(luò)安全 PAGEREF _Toc10744 5 HYPERLINK l _Toc2554 2.3用例分析 PAGEREF _Toc2554 6

3、 HYPERLINK l _Toc22930 2.3.1參與者 PAGEREF _Toc22930 6 HYPERLINK l _Toc17822 2.3.2用例分析 PAGEREF _Toc17822 6 HYPERLINK l _Toc13296 2.3.3系統(tǒng)的用例圖 PAGEREF _Toc13296 6 HYPERLINK l _Toc18636 3.總體設(shè)計 PAGEREF _Toc18636 8 HYPERLINK l _Toc17710 3.1TCP服務(wù)器設(shè)置 PAGEREF _Toc17710 8 HYPERLINK l _Toc20443 3.2分析類圖 PAGEREF _

4、Toc20443 9 HYPERLINK l _Toc24140 3.3順序圖 PAGEREF _Toc24140 10 HYPERLINK l _Toc24000 3.2.1用戶私聊順序圖 PAGEREF _Toc24000 10 HYPERLINK l _Toc31866 3.2.2用戶傳送文件序列圖 PAGEREF _Toc31866 11 HYPERLINK l _Toc12474 3.3協(xié)作圖 PAGEREF _Toc12474 11 HYPERLINK l _Toc27554 3.3.1用戶私聊協(xié)作圖 PAGEREF _Toc27554 11 HYPERLINK l _Toc228

5、19 3.3.2用戶傳送文件協(xié)作圖 PAGEREF _Toc22819 12 HYPERLINK l _Toc1636 4.詳細(xì)設(shè)計 PAGEREF _Toc1636 14 HYPERLINK l _Toc27653 4.1客戶端設(shè)計 PAGEREF _Toc27653 14 HYPERLINK l _Toc18150 4.2服務(wù)端設(shè)計 PAGEREF _Toc18150 14 HYPERLINK l _Toc22312 4.3多線程設(shè)計 PAGEREF _Toc22312 15 HYPERLINK l _Toc14112 5.代碼實現(xiàn) PAGEREF _Toc14112 16 HYPERLI

6、NK l _Toc19119 5.1服務(wù)端設(shè)計 PAGEREF _Toc19119 16 HYPERLINK l _Toc1166 5.2客戶端設(shè)計 PAGEREF _Toc1166 18 HYPERLINK l _Toc3200 5.3多線程 PAGEREF _Toc3200 22 HYPERLINK l _Toc23149 5.3.1服務(wù)端多線程 PAGEREF _Toc23149 22 HYPERLINK l _Toc27658 5.3.2客戶端多線程 PAGEREF _Toc27658 24 HYPERLINK l _Toc324996.運行與測試 PAGEREF _Toc32499

7、25 HYPERLINK l _Toc298 6.1用戶登錄界面 PAGEREF _Toc298 25 HYPERLINK l _Toc21275 6.2輸入端口界面 PAGEREF _Toc21275 25 HYPERLINK l _Toc30522 6.3服務(wù)器記錄,在線的用戶信息。 PAGEREF _Toc30522 26 HYPERLINK l _Toc4603 6.4私聊 PAGEREF _Toc4603 26 HYPERLINK l _Toc28045 6.4.1登錄 PAGEREF _Toc28045 26 HYPERLINK l _Toc21450 用戶給指定的好友發(fā)送信息。(

8、私聊) PAGEREF _Toc21450 27 HYPERLINK l _Toc234 6.4.3指定好友接受到好友信息。(私聊的信息) PAGEREF _Toc234 27 HYPERLINK l _Toc14837 6.4.5好友回復(fù)我的信息 PAGEREF _Toc14837 28 HYPERLINK l _Toc28100 6.5群聊 PAGEREF _Toc28100 28 HYPERLINK l _Toc5364 6.5.1發(fā)送群消息 PAGEREF _Toc5364 28 HYPERLINK l _Toc31037 6.5.2好友響應(yīng)并接受群聊信息 PAGEREF _Toc31

9、037 29 HYPERLINK l _Toc6596 PAGEREF _Toc6596 29 HYPERLINK l _Toc32569 7. 小結(jié) PAGEREF _Toc32569 30 HYPERLINK l _Toc11310 8.參考文獻 PAGEREF _Toc11310 311.前言隨著互聯(lián)網(wǎng)的快速發(fā)展,網(wǎng)絡(luò)聊天工具已經(jīng)作為一種重要的信息交流工具,受到越來越多的網(wǎng)民的青睞。目前,出現(xiàn)了很多非常不錯的聊天工具,其中應(yīng)用比較廣泛的有Netmeeting、騰訊QQ、MSN-Messager等等。該系統(tǒng)開發(fā)主要包括一個網(wǎng)絡(luò)聊天服務(wù)器程序和一個網(wǎng)絡(luò)聊天客戶程序兩個方面。前者通過Socke

10、t套接字建立服務(wù)器,服務(wù)器能讀取、轉(zhuǎn)發(fā)客戶端發(fā)來信息,并能刷新用戶列表。后者通過與服務(wù)器建立連接,來進行客戶端與客戶端的信息交流。其中用到了局域網(wǎng)通信機制的原理,通過直接繼承Thread類來建立多線程。開發(fā)中利用了計算機網(wǎng)絡(luò)編程的基本理論知識,如TCP/IP協(xié)議、客戶端/服務(wù)器端模式(Client/Server模式)、網(wǎng)絡(luò)編程的設(shè)計方法等。在網(wǎng)絡(luò)編程中對信息的讀取、發(fā)送,是利用流來實現(xiàn)信息的交換,其中介紹了對實現(xiàn)一個系統(tǒng)的信息流的分析,包含了一些基本的軟件工程的方法。經(jīng)過分析這些情況,該局域網(wǎng)聊天工具采用Eclipse為基本開發(fā)環(huán)境和java語言進行編寫,首先可在短時間建立系統(tǒng)應(yīng)用原型,然后,

11、對初始原型系統(tǒng)進行不斷修正和改進,直到形成可行系統(tǒng)本文通過java的Socket實現(xiàn)了一個基于局域網(wǎng)和網(wǎng)絡(luò)的聊天室的程序的開發(fā)基于java的C/S模式網(wǎng)絡(luò)聊天室的設(shè)計與實現(xiàn)。C/S(Client/Server)結(jié)構(gòu),即大家熟知的客戶機和服務(wù)器結(jié)構(gòu)。它是軟件系統(tǒng)體系結(jié)構(gòu),通過它可以充分利用兩端硬件環(huán)境的優(yōu)勢,將任務(wù)合理分配到Client端和Server端來實現(xiàn),降低了系統(tǒng)的通訊開銷。目前大多數(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)用都可以進行同樣的業(yè)務(wù)處理,應(yīng)用不同的模塊共享邏輯組件;因此

12、,部的和外部的用戶都可以訪問新的和現(xiàn)有的應(yīng)用系統(tǒng),通過現(xiàn)有應(yīng)用系統(tǒng)中的邏輯可以擴展出新的應(yīng)用系統(tǒng)。這也就是目前應(yīng)用系統(tǒng)的發(fā)展方向。關(guān)鍵詞:聊天客戶端信息服務(wù)器端 Java C/S聊天系統(tǒng)2.需求分析2.1系統(tǒng)的功能需求2.1.1實現(xiàn)私聊(一對一):在登陸的情況下選擇你要聊天的好友,進行信息的傳送,實現(xiàn)彼此的聊天,這也是本系統(tǒng)最基本的功能。2.1.2群聊(一對多):可以實現(xiàn)一對多人的聊天。2.1.3大文件傳輸:在能夠聊天的基礎(chǔ)上,實現(xiàn)通訊的多元化,進行文件的傳輸。是通訊雙方可以選擇傳送對方想獲得的資料。2.1.4點歌2.1.5分組管理2.1.6個人信息管理2.1.7用戶管理2.1.8視頻通話2.

13、2非功能需求:2.2.1界面友好:界面易操作性,對經(jīng)典的聊天程序的界面進行了學(xué)習(xí)和借鑒,模仿他們的界面和常用的操作。2.2.2網(wǎng)絡(luò)安全加密解密為了提高傳輸?shù)陌踩裕M行加密操作。及時在網(wǎng)絡(luò)上被別人了竊聽消息,也不能得到原始信息,防止個人重要信息和隱私信息被盜。2.3用例分析2.3.1參與者本系統(tǒng)顯而易見的兩個參與者:用戶和管理員。2.3.2用例分析從上面的需求里進行抽象和提取關(guān)鍵信息,在確定系統(tǒng)邊界的情況下,選擇最基本的用例,然后對用例進行描述和細(xì)化。使其能完全的描述系統(tǒng)的功能性需求。2.3.3系統(tǒng)的用例圖通過對參與者和用例的分析,確定他們的關(guān)系(包括參與者和參與者的關(guān)系,參與者和用例的關(guān)系,

14、用例之間的關(guān)系。)其中用例之間的關(guān)系是分析中的重點,如圖私聊和群聊都有socket聊天的模塊,所以可以確定的是包含關(guān)系。管理個人信息,包含了分組管理和用戶信息管理,其中分組管理和用戶信息管理,是個人信息管理的子集,所以應(yīng)該是泛化關(guān)系。在文件傳輸?shù)臅r候,可能會產(chǎn)生信息的丟失,導(dǎo)致信息不完整,接收方不能完整收到發(fā)送方的消息,所以導(dǎo)致發(fā)送方重發(fā)信息。所以這是擴展關(guān)系,因為只有在傳輸文件失敗的時候,才能啟用重傳文件的模塊。用戶所參與的模塊首先應(yīng)該登錄,在登錄系統(tǒng)后,可以私聊和群聊來交流信息。用戶可以管理自己的信息進行修改自己的信息和管理自己的分組。為了豐富系統(tǒng)的功能我,我們還特意實現(xiàn)了點歌功,和傳輸文

15、件吸引用戶的眼光。3.總體設(shè)計3.1TCP服務(wù)器設(shè)置在TCP/IP協(xié)議族中,有兩個互不相同的傳輸協(xié)議:TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)。TCP為兩臺主機提供高可靠性的數(shù)據(jù)通信。它所做的工作包括把應(yīng)用程序交給它的數(shù)據(jù)分成合適的小塊交給下面的網(wǎng)絡(luò)層,確認(rèn)接收到的分組,設(shè)置發(fā)送最后確認(rèn)分組的超時時鐘等。由于運輸層提供了高可靠性的端到端的通信,因此應(yīng)用層可以忽略所有這些細(xì)節(jié)。而另一方面,UDP則為應(yīng)用層提供一種非常簡單的服務(wù)。它只是把稱作數(shù)據(jù)報的分組從一臺主機發(fā)到另一臺主機,但并不保證該數(shù)據(jù)報能到達另一端。任何必需的可靠性必須由應(yīng)用層來提供。Bind()Socket()Readfrom

16、()等待客戶請求處理服務(wù)請求Sendto()Close()Socket()Bind()Sendto()Readfrom()Close() 服務(wù)請求 服務(wù)應(yīng)答服務(wù)器客戶機 服務(wù)器和客戶機通訊流程3.2分析類圖(系統(tǒng)整齊的分析類圖)沒有類是單獨存在的,通常和別的類協(xié)作,創(chuàng)造比單獨工作更大的語義。因此,除了捕獲系統(tǒng)的詞匯以外,還要將注意力集中到這些類是如何在一起工作的。使用類圖來表達這種協(xié)作。確定你建模的機制。機制代表了部分你建模的系統(tǒng)的一些功能和行為,這些功能和行為是一組類、接口和其他事物相互作用的結(jié)果。對于每個機制,確定類、接口和其他的參與這個協(xié)作的協(xié)作。同時確定這些事物之間的關(guān)系。 用場景來預(yù)

17、排這些事物,沿著這條路你將發(fā)現(xiàn)模型中忽略的部分和定義錯誤的部分。確定用這些事物的容來填充它們。對于類,開始于獲得一個責(zé)任(類的職責(zé)),然后,將它轉(zhuǎn)化為具體的屬性和方法。3.3順序圖3.2.1用戶私聊順序圖用戶在進入系統(tǒng)前首先要輸入彼此通訊的端口號,由于客戶機和服務(wù)器都是本機所以不需要尋找IP地址,然后輸入用戶名新建一個用戶,由于沒有保存歷史記錄功能,所以每次進入系統(tǒng)前都需要新建一個用戶。然后輸入用戶名和密碼,在確認(rèn)用戶和密碼。登陸成功,選擇在線可以聊天的好友,輸入信息然后發(fā)送,達到和好友的交流。3.2.2用戶傳送文件序列圖3.3協(xié)作圖3.3.1用戶私聊協(xié)作圖強調(diào)的是發(fā)送和接收消息的對象之間的組

18、織結(jié)構(gòu)。一個協(xié)作圖顯示了一系列的對象和在這些對象之間的聯(lián)系以及對象間發(fā)送和接收的消息。對象通常是命名或匿名的類的實例,也可以代表其他事物的實例。3.3.2用戶傳送文件協(xié)作圖用戶在登錄系統(tǒng)后,進入登陸界面,在界面的好友框里,選擇要傳送文件的好友,點擊傳送文件的按鈕,會彈出選擇文件的對話框,在對話框里查找你所在的文件系統(tǒng)中你要傳送的文件。然后點擊傳送。4.詳細(xì)設(shè)計4.1客戶端設(shè)計一個網(wǎng)絡(luò)聊天室的運行,首先是要有一個完整穩(wěn)定的服務(wù)器端,并且擁有很多個服務(wù)器端??头艘哂袑崿F(xiàn)用戶注冊和用戶登陸,在登陸成功后,要顯示出公聊界面,實現(xiàn)聊天功能并且能夠發(fā)送表情和保存聊天容和顯示聊天記錄等功能,在新用戶上線

19、和用戶下線時要更新每個客戶端在線用戶列表名,并且可以和在線的用戶實現(xiàn)一對一的私聊功能。在服務(wù)器端可以實現(xiàn)不斷的監(jiān)聽客服的連接,并且根據(jù)客戶端發(fā)送過來的不同信息如注冊信息,登錄信息,公聊信息,私聊信息,退出信息等,服務(wù)器端要做出不同的響應(yīng),并且要實現(xiàn)數(shù)據(jù)庫的操作,如根據(jù)用戶注冊的信息保存數(shù)據(jù)庫中,根據(jù)登錄時發(fā)送來的用戶名和密碼檢測是否合法用戶等。經(jīng)為每一個連接著的客戶端建立了一個線程,這個線程好比一根線一直等待客戶端說話,而信息發(fā)送中心就相當(dāng)于一個總臺,一旦有人打進來,就通過線把信息傳完成了服務(wù)器端的第一個的任務(wù),則第二個任務(wù)也就不難解決了。上面已送到總臺,再由總臺根據(jù)需要將這個信息發(fā)送給接收群

20、。這樣就意味著,服務(wù)器每接受一條信息,就要調(diào)用一次信息發(fā)送中心的方法,并將這條信息發(fā)送到所有客戶端(或者特定的*個*幾個客戶端)。電腦每做的一次動作,一個步驟,都是按照以經(jīng)用計算機語言編好的程序來執(zhí)行的,程序是計算機要執(zhí)行的指令的集合,而程序全部都是用我們所掌握的語言來編寫的。所以人們要控制計算機一定要通過計算機語言向計算機發(fā)出命令。偵聽服務(wù)器發(fā)送的連接請求,有請求就接收發(fā)來的信息,并通過短信貓發(fā)出去單的說,服務(wù)器端是為客戶端服務(wù)的,服務(wù)的容諸如向客戶端提供資源,保存客戶端數(shù)據(jù)等等.客戶端可以是任意的一臺電腦,只要它和服務(wù)器端存在連接,并且得到了服務(wù)器端的授權(quán),就可以使用服務(wù)器端的服務(wù).象現(xiàn)在

21、就可以理解為百度的是服務(wù)器端,我們現(xiàn)在使用的電腦就是客戶端.我們可以使用它的服務(wù).4.2服務(wù)端設(shè)計由于客戶端需要同時能夠接收信息以及發(fā)送信息,所以也必須利用多個線程來實現(xiàn)。主線程用于接收用戶輸入的容并將之發(fā)送到服務(wù)器端,而一個后臺線程將一直接收來自服務(wù)器端的信息,并將之返回給客戶端的用戶。客戶端(Client)或稱為用戶端,是指與服務(wù)器相對應(yīng),為客戶提供本地服務(wù)的程序。除了一些只在本地運行的應(yīng)用程序之外,一般安裝在普通的客戶機上,需要與服務(wù)端互相配合運行。因特網(wǎng)發(fā)展以后,較常用的用戶端包括了如萬維網(wǎng)使用的網(wǎng)頁瀏覽器,收寄電子時的電子客戶端,以及即時通訊的客戶端軟件等。對于這一類應(yīng)用程序,需要網(wǎng)

22、絡(luò)中有相應(yīng)的服務(wù)器和服務(wù)程序來提供相應(yīng)的服務(wù),如數(shù)據(jù)庫服務(wù),電子服務(wù)等等,這樣在客戶機和服務(wù)器端,需要建立特定的通信連接,來保證應(yīng)用程序的正常運行。不過客戶端及伺服端的關(guān)系不見得一定建立在兩臺分開的機器上,同一臺機器中也有這種主從關(guān)系的存在。提供服務(wù)的伺服端及接受服務(wù)的客戶端也有可能都在同一臺機器上,例如我們在提供網(wǎng)頁的服務(wù)器上執(zhí)行瀏覽器瀏覽本機所提供的網(wǎng)頁,這樣在同一臺機器上就同時扮演伺服端及客戶端。4.3多線程設(shè)計為了能實現(xiàn)一對多的通話聊天也就是說間接的多對多的聊天的功能,所以必須在客戶端配置和服務(wù)端配置的時候。實現(xiàn)多線程的功能。實現(xiàn)程序的并發(fā)。以及可以減少創(chuàng)建進程是CPU的資源浪費。和服

23、務(wù)區(qū)負(fù)荷太重。多線程在客戶端可以實現(xiàn),用戶進行群聊,以及接受多個好友的響應(yīng)信息。在服務(wù)端可以減少創(chuàng)建進程的開銷。在一個程序中,這些獨立運行的程序片斷叫作線程”(Thread),利用它編程的概念就叫作多線程處理”。多線程處理一個常見的例子就是用戶界面。利用線程,用戶可按下一個按鈕,然后程序會立即作出響應(yīng),而不是讓用戶等待程序完成了當(dāng)前任務(wù)以后才開始響應(yīng)。使用線程可以把占據(jù)時間長的程序中的任務(wù)放到后臺去處理用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發(fā)*些事件的處理,可以彈出一個進度條來顯示處理的進度。程序的運行速度可能加快,在一些等待的任務(wù)實現(xiàn)上如用戶輸入、文件讀寫和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線

24、程就比較有用了。在這種情況下可以釋放一些珍貴的資源如存占用等等。但是如果有大量的線程,會影響性能,因為操作系統(tǒng)需要在它們之間切換。更多的線程需要更多的存空間。線程可能會給程序帶來更多bug”,因此要小心使用。線程的中止需要考慮其對程序運行的影響。通常塊模型數(shù)據(jù)是在多個線程間共享的,需要防止線程死鎖情況的發(fā)生。5.代碼實現(xiàn)5.1服務(wù)端設(shè)計 publicclassServerFramee*tends JFrame private JPanel contentPane;private JTe*tField t*tPort;private JLabel lblState;private JTe*tAr

25、ea t*tAllUsers;/ 集合:用來保存所有登錄的用戶privateList allLoginUser = null;publicstaticvoid main(String args) EventQueue.invokeLater(new Runnable() publicvoid run() try ServerFrame frame = new ServerFrame();/ 禁止用戶更改窗體的大小frame.setResizable(false);/ 距中frame.setLocationRelativeTo(null);frame.setVisible(true); catc

26、h (E*ception e) e.printStackTrace(););public ServerFrame() allLoginUser = new ArrayList();initponet();publicList getAllLoginUser() returnallLoginUser;publicvoid setAllLoginUser(List allLoginUser) this.allLoginUser = allLoginUser;privatevoid initponet() setDefaultCloseOperation(JFrame.E*IT_ON_CLOSE);

27、setBounds(100, 100, 449, 506);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5);setContentPane(contentPane);contentPane.setLayout(null);JPanel panel = new JPanel();panel.setBorder(new TitledBorder(UIManager.getBorder(TitledBorder.border),u670Du52A1u5668u4FE1u606F, TitledBo

28、rder.LEADING,TitledBorder.TOP, null, new Color(0, 70, 213);panel.setBounds(10, 10, 421, 143);contentPane.add(panel);panel.setLayout(null);JLabel label = new JLabel(u670Du52A1u5668u72B6u6001uFF1A);label.setBounds(48, 38, 81, 23);panel.add(label);lblState = new JLabel(New label);lblState.setBounds(161

29、, 42, 110, 15);panel.add(lblState);JLabel label_1 = new JLabel(u670Du52A1u5668u7AEFu53E3uFF1A);label_1.setBounds(48, 87, 81, 15);panel.add(label_1);t*tPort = new JTe*tField();t*tPort.setBounds(161, 84, 110, 21);panel.add(t*tPort);t*tPort.setColumns(10);utton btnStart = new utton(u542Fu52A8u670Du52A1

30、u5668);btnStart.addActionListener(new ActionListener() publicvoid actionPerformed(ActionEvent e) try startServer(e); catch (IOE*ception e1) / TODO Auto-generated catch blocke1.printStackTrace(););btnStart.setBounds(289, 83, 93, 23);panel.add(btnStart);JPanel panel_1 = new JPanel();panel_1.setBorder(

31、new TitledBorder(null,u5DF2u7ECFu767Bu5F55u7684u7528u6237,TitledBorder.LEADING, TitledBorder.TOP, null, null);panel_1.setBounds(20, 163, 411, 299);contentPane.add(panel_1);panel_1.setLayout(new BorderLayout(0, 0);t*tAllUsers = new JTe*tArea();panel_1.add(t*tAllUsers, BorderLayout.CENTER);publicvoid

32、updateGui() this.t*tAllUsers.setTe*t(null);for (int i = 0; i this.allLoginUser.size(); i+) this.t*tAllUsers.append(allLoginUser.get(i).getUserName();this.t*tAllUsers.append(n);protectedvoid startServer(ActionEvent e) throws IOE*ception / 驗證:是否為空的驗證if (mValidate.isEmpty(t*tPort.getTe*t() JOptionPane.

33、showMessageDialog(null, 端口號不能空);return;/ 端口必須是數(shù)字if (!mValidate.isDigit(t*tPort.getTe*t() JOptionPane.showMessageDialog(null, 端口號必須是數(shù)字);return;/ 1024之上/ 建立一個監(jiān)聽socketint port = Integer.parseInt(t*tPort.getTe*t();ServerSocket serverSocket = new ServerSocket(port);ServerListerenThread serverListeren = n

34、ewServerListerenThread(serverSocket, this);this.lblState.setOpaque(true);this.lblState.setForeground(Color.red);this.t*tPort.setEnabled(false);/ 禁用5.2客戶端設(shè)計publicclassClientLogine*tends JFrame private JPanel contentPane;private JTe*tField t*tLoginUser;private JTe*tField t*tAddress;private JTe*tField

35、t*tPort;private Socket socket;/ 登錄用戶信息private UserInfo loginUser = null;public UserInfo getLoginUser() returnloginUser;publicvoid setLoginUser(UserInfo loginUser) this.loginUser = loginUser;public Socket getSocket() returnsocket;publicvoid setSocket(Socket socket) this.socket = socket;private Server

36、Socket serverSocket;publicstaticvoid main(String args) EventQueue.invokeLater(new Runnable() publicvoid run() try ClientLogin frame = new ClientLogin();frame.setAlwaysOnTop(true);frame.setResizable(false);frame.setVisible(true); catch (E*ception e) e.printStackTrace(););public ClientLogin() initpone

37、t();privatevoid initponet() setDefaultCloseOperation(JFrame.E*IT_ON_CLOSE);setBounds(100, 100, 397, 298);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5);setContentPane(contentPane);contentPane.setLayout(null);JPanel panel = new JPanel();panel.setBorder(new TitledBorder(n

38、ull, u7528u6237u767Bu5F55,TitledBorder.LEADING, TitledBorder.TOP, null, null);panel.setBounds(10, 10, 369, 244);contentPane.add(panel);panel.setLayout(null);JLabel label = new JLabel(u7528u6237u540DuFF1A);label.setBounds(37, 36, 54, 15);panel.add(label);t*tLoginUser = new JTe*tField();t*tLoginUser.s

39、etBounds(145, 33, 140, 21);panel.add(t*tLoginUser);t*tLoginUser.setColumns(10);JLabel label_1 = new JLabel(u670Du52A1u5668u5730u5740uFF1A);label_1.setBounds(37, 80, 98, 15);panel.add(label_1);t*tAddress = new JTe*tField();t*tAddress.setTe*t(localhost);t*tAddress.setBounds(145, 77, 140, 21);panel.add

40、(t*tAddress);t*tAddress.setColumns(10);JLabel label_2 = new JLabel(u7AEFu53E3u53F7uFF1A);label_2.setBounds(37, 120, 54, 15);panel.add(label_2);t*tPort = new JTe*tField();t*tPort.setTe*t(5555);t*tPort.setBounds(145, 117, 140, 21);panel.add(t*tPort);t*tPort.setColumns(10);utton btnLogin = new utton(u7

41、67Bu5F55);btnLogin.addActionListener(new ActionListener() publicvoid actionPerformed(ActionEvent e) try login(e); catch (UnknownHostE*ception e1) / TODO Auto-generated catch blocke1.printStackTrace(); catch (IOE*ception e2) / TODO Auto-generated catch blocke2.printStackTrace(); catch (ClassNotFoundE

42、*ception e3) / TODO Auto-generated catch blocke3.printStackTrace(););btnLogin.setBounds(69, 164, 93, 23);panel.add(btnLogin);utton btnReset = new utton(u91CDu7F6E);btnReset.setBounds(192, 164, 93, 23);panel.add(btnReset);protectedvoid login(ActionEvent e) throws IOE*ception,ClassNotFoundE*ception /

43、驗證/ 得到GUI界面上的數(shù)據(jù)String userName = this.t*tLoginUser.getTe*t();String serverAddress = this.t*tAddress.getTe*t();int serverPort = Integer.parseInt(this.t*tPort.getTe*t();NormalClass.serverAddress = serverAddress;NormalClass.sererPort = serverPort;/ 創(chuàng)建一個登錄用戶String clientIP = NormalClass.splitIp(InetAddr

44、ess.getLocalHost().toString();int clientPort = NormalClass.randomPort();loginUser = new UserInfo(userName, null, clientIP, clientPort);loginUser.setImageInde*(int) (Math.random() * 10);/ 向服務(wù)器建立一個連接: 請求Socket socket = new Socket(serverAddress, serverPort);/ 發(fā)送數(shù)據(jù):構(gòu)建一個數(shù)據(jù)包DataPacket dataPacket = new Dat

45、aPacket(Imands.LOGIN, loginUser,null, new Date(), null);OutputStream out = socket.getOutputStream();ObjectOutputStream objOut = new ObjectOutputStream(out);objOut.writeObject(dataPacket);/ 等待服務(wù)器的響應(yīng)InputStream in = socket.getInputStream();ObjectInputStream objIn = new ObjectInputStream(in);dataPacket

46、 = (DataPacket) objIn.readObject();if (dataPacket.getmand().equals(Imands.LOGIN_SUCCESS) ClientChat chat = new ClientChat(this);chat.setTitle(this.loginUser.getUserName() + 登錄了);chat.setVisible(true);this.setVisible(false);objIn.close();objOut.close();socket.close();5.3多線程5.3.1服務(wù)端多線程public ServerCha

47、tThread(Socket socket, ServerFrame frame) this.socket = socket;this.frame = frame;this.start();publicvoid run() / 接收用戶傳過來的數(shù)據(jù)包try inputStream = this.socket.getInputStream();objIn = new ObjectInputStream(inputStream);DataPacket dataPacket = (DataPacket) this.objIn.readObject();/ 用戶要干 什么?String mand =

48、dataPacket.getmand();if (mand.equals(Imands.LOGIN) / 表示用戶要登錄UserInfo loginUser = dataPacket.getFromUserInfo();/ 身份驗證 (略)保存用戶的唯一性/ 保存登錄的用戶this.frame.getAllLoginUser().add(loginUser);/ 更新用戶的最新信息this.frame.updateGui();/ 發(fā)送一個信息過去dataPacket.setmand(Imands.LOGIN_SUCCESS);dataPacket.setFromUserInfo(null);d

49、ataPacket.setToUserInfo(loginUser);this.outPutStream = this.socket.getOutputStream();this.objOut = new ObjectOutputStream(this.outPutStream);this.objOut.writeObject(dataPacket);/ 向每個登錄的用戶發(fā)送最新的登錄用戶的集合sendAllUserInfo(); elseif (mand.equals(Imands.CLOSE_CLIENT_WINDOW) / 用戶要關(guān)閉了UserInfo unLoginUser = dat

50、aPacket.getFromUserInfo();this.frame.getAllLoginUser().remove(unLoginUser);this.frame.updateGui();/ 給客戶dataPacket.setmand(Imands.CLOSE_CLIENT_WINDOW_SUCCESS);this.outPutStream = this.socket.getOutputStream();this.objOut = new ObjectOutputStream(this.outPutStream);this.objOut.writeObject(dataPacket);

51、/ 把最新的信息告訴客戶sendAllUserInfo(); catch (IOE*ception e) / TODO Auto-generated catch blocke.printStackTrace(); catch (ClassNotFoundE*ception e) / TODO Auto-generated catch blocke.printStackTrace(); finally try this.objIn.close();this.socket.close(); catch (IOE*ception e) / TODO Auto-generated catch bloc

52、ke.printStackTrace();privatevoid sendAllUserInfo() for (int i = 0; i this.frame.getAllLoginUser().size(); i+) UserInfo user = this.frame.getAllLoginUser().get(i);OutputStream out = null;ObjectOutputStream objO = null;/ 和每個用戶都建立連接try Socket socket = new Socket(user.getClientAddress(), user.getClientP

53、ort();DataPacket dataPacket = new DataPacket(Imands.USER_LIST,null, user, new Date(), this.frame.getAllLoginUser();out = socket.getOutputStream();objO = new ObjectOutputStream(out);objO.writeObject(dataPacket); catch (UnknownHostE*ception e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOE*ception e) / TODO Auto-

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論