![計算機網(wǎng)絡(luò)課設(shè)點對點聊天[蒼松教學(xué)]_第1頁](http://file1.renrendoc.com/fileroot_temp2/2021-2/1/4364f01c-0fa8-4ab3-b144-9ed02e8d1ae5/4364f01c-0fa8-4ab3-b144-9ed02e8d1ae51.gif)
![計算機網(wǎng)絡(luò)課設(shè)點對點聊天[蒼松教學(xué)]_第2頁](http://file1.renrendoc.com/fileroot_temp2/2021-2/1/4364f01c-0fa8-4ab3-b144-9ed02e8d1ae5/4364f01c-0fa8-4ab3-b144-9ed02e8d1ae52.gif)
![計算機網(wǎng)絡(luò)課設(shè)點對點聊天[蒼松教學(xué)]_第3頁](http://file1.renrendoc.com/fileroot_temp2/2021-2/1/4364f01c-0fa8-4ab3-b144-9ed02e8d1ae5/4364f01c-0fa8-4ab3-b144-9ed02e8d1ae53.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、計算機網(wǎng)絡(luò)課程設(shè)計說明書(點對點聊天程序)學(xué) 院: 計算機與信息科學(xué)學(xué)院 學(xué)生姓名: 專 業(yè):軟件工程班 級:1401班完成時間:2016年12月 摘 要目前即時通訊軟件在平時的生活中有著十分廣泛的應(yīng)用,但是對絕大部分的軟件來說,都必須得應(yīng)用在互聯(lián)網(wǎng)上,必須在一個Internel環(huán)境下才能使用。有的時候單位內(nèi)部的員工,同學(xué),可能沒有互聯(lián)網(wǎng)環(huán)境或者其他的原因希望不用上Internet就可以進行通訊,這樣開發(fā)局域網(wǎng)通訊程序就有了必要性。本文提出了局域網(wǎng)通訊軟件的需求,并詳細(xì)對網(wǎng)絡(luò)協(xié)議TCP/IP協(xié)議族進行了介紹和研究,如TCP,UDP,廣播,IP等相關(guān)的技術(shù)。并對網(wǎng)絡(luò)通訊原理進行了說明,采用了Cl
2、ient/Server模型, 程序基于TCP協(xié)議,通過socket接口來實現(xiàn)局域網(wǎng)內(nèi)的即時通信工功能即聊天的功能。服務(wù)器端的一個端口用來監(jiān)聽對服務(wù)的請求,另外有一個臨時端口用來給客戶端發(fā)送數(shù)據(jù),當(dāng)客戶端向該地址提出連接請求時,服務(wù)器端會對它的請求做出相應(yīng)的反應(yīng)。該軟件采用多線程技術(shù)支持多用戶操作,能夠幫助企業(yè)在局域網(wǎng)內(nèi)搭建起自己的聊天系統(tǒng)。避免了必須的經(jīng)過互聯(lián)網(wǎng)的過程。經(jīng)過測試,程序能夠有效達到基本的預(yù)期要求關(guān)鍵詞 課程設(shè)計;計算機;TCP/IP協(xié)議;服務(wù)器/客戶端;JAVA;教育專業(yè)b引言近年來,隨著全球信息化進程的不斷發(fā)展,網(wǎng)絡(luò)也在飛速發(fā)展。出于高效、快速地處理各種事務(wù)的目的,越來越多的企
3、業(yè)在其內(nèi)部使用局域網(wǎng)來進行工作。在內(nèi)部局域網(wǎng)的幫助下,企業(yè)得以簡化信息流程,提高信息交換的速度,從而提高工作效率。然而,隨著企業(yè)規(guī)模的擴大,業(yè)務(wù)量的增加,在局域網(wǎng)上運行的應(yīng)用越來越多,如知識庫、網(wǎng)絡(luò)會議、數(shù)據(jù)庫應(yīng)用和數(shù)據(jù)的同步與備份等,這些應(yīng)用對局域網(wǎng)的信息吞吐、處理能力的要求也越來越高。這些在企業(yè)內(nèi)部原有局域網(wǎng)設(shè)計之初未曾考慮到的新情況的出現(xiàn)使得局域網(wǎng)不堪重負(fù),容易發(fā)生信息阻塞,此時,局域網(wǎng)不但不能提高生產(chǎn)效率,反而成為企業(yè)發(fā)展的瓶頸。了解決上述矛盾,人們提出了許多方法。提升網(wǎng)絡(luò)帶寬及增加服務(wù)器的吞吐能力是解決此矛盾的一種方法。然而,從企業(yè)運行的成本方面考慮,無論是單純地提升網(wǎng)絡(luò)帶寬或增加服
4、務(wù)器的吞吐能力都不能從根本上解決局域網(wǎng)資源緊張的問題,對舊有局域網(wǎng)的大規(guī)模硬件改造反而會增加企業(yè)的負(fù)擔(dān)。基于Socket的局域網(wǎng)通信軟件可以為企業(yè)原有的局域網(wǎng)提供一種良好,安全,快速的通信機制。它的實現(xiàn)無需對企業(yè)原有的局域網(wǎng)硬件進行任何改動,具有實現(xiàn)成本低廉的優(yōu)點,它的使用能有效地降低局域網(wǎng)通信負(fù)荷,提高局域網(wǎng)的使用效率,可以很好地解決企業(yè)內(nèi)部局域網(wǎng)的各種通信需求?;赟ocket的局域網(wǎng)聊天工具是此類局域網(wǎng)通信軟件的具體實例之一,它很好地詮釋了Socket通信的原理,并且在企業(yè)內(nèi)部通信、教學(xué)、討論等應(yīng)用中都具有一定的實用價值。它具有信息收發(fā)速度快,保密性好,占用網(wǎng)絡(luò)帶寬資源低,占用服務(wù)器吞吐
5、能力低,易于編程實現(xiàn)等優(yōu)點?;赟ocket的局域網(wǎng)通信軟件應(yīng)用范圍廣闊,不但可以處理傳統(tǒng)的通信需求,而且也能擴展以適應(yīng)新型的網(wǎng)絡(luò)應(yīng)用,如網(wǎng)絡(luò)教育,數(shù)據(jù)影音傳輸?shù)?,擁有廣泛的應(yīng)用前景。目錄1設(shè)計原理基礎(chǔ)21.1 TCP/IP簡介21.1.1 TCP/IP概念21.1.2 TCP:傳輸控制協(xié)議31.1.3 TCP連接建立與終止31.2 IP:網(wǎng)際協(xié)議41.3 UDP:用戶數(shù)據(jù)報協(xié)議51.4 Socket網(wǎng)絡(luò)編程原理62設(shè)計方法及思路72.1 思路72.2編程方法73系統(tǒng)需求分析與概要設(shè)計93.1功能需求分析93.4運行需求分析104.程序源碼104.1接收消息104.2監(jiān)聽134.3發(fā)送消息14
6、4.5運行結(jié)果174.5.1 發(fā)送消息174.5.2 接收消息174.5.3 群發(fā)184.5.4 退出系統(tǒng)195出現(xiàn)問題及解決方法196 課程設(shè)計的總結(jié)體會206.1總結(jié)206.2展望21參考文獻22致謝231設(shè)計原理基礎(chǔ)1.1 TCP/IP簡介1.1.1 TCP/IP概念首先網(wǎng)絡(luò)協(xié)議一般是通過分不同的level進行開發(fā)的,每一層都有自己的通信功能。對于某一個協(xié)議族,比如TCP/IP,是一組不同層次上的多個協(xié)議的組合。TCP/IP通常被認(rèn)為是一個四層協(xié)議系統(tǒng),如圖所示。圖1 TCP/IP結(jié)構(gòu)如圖所示,每個level都有不同工作:1)鏈路層,也稱為數(shù)據(jù)鏈路層或網(wǎng)絡(luò)接口層,通常包括PC機自身的網(wǎng)絡(luò)
7、接口卡和本機操作系統(tǒng)中的設(shè)備驅(qū)動程序,用來處理相關(guān)的物理接口。2)網(wǎng)絡(luò)層,也被稱為互聯(lián)網(wǎng)層,通常用于處理網(wǎng)絡(luò)活動中的分組活動,例如分組的選路。在協(xié)議族中,如圖所示,網(wǎng)絡(luò)層協(xié)議主要包括了3個重要的協(xié)議。3)傳輸層,其目的主要是為通過網(wǎng)絡(luò)相連的兩臺主機的應(yīng)用程序間提供end-to-end的通信。在TCP/IP協(xié)議族中,有兩個主要的且互不相同的傳輸協(xié)議:TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)。其中,TCP是提供高可靠性的數(shù)據(jù)通信。它可以通過三次握手,超時設(shè)置等機制來有效地保證了數(shù)據(jù)傳輸?shù)目煽啃浴6硗庖粋€協(xié)議,UDP則為應(yīng)用層提供一種相對要簡單些的服務(wù)。它的工作只是把數(shù)據(jù)分組從發(fā)送方傳輸?shù)?/p>
8、接收方,但是數(shù)據(jù)分組能否成功達到接收方它不會給予保證。如果需要可靠性就必須得通過其他層來完成。4)應(yīng)用層,主要同于上層的應(yīng)用程序進行的操作。1.1.2 TCP:傳輸控制協(xié)議TCP提供的是一種有保障的服務(wù)。確保了傳輸?shù)目煽啃裕\用TCP協(xié)議的主機在交換數(shù)據(jù)之前必須首先建立一個連接。TCP主要是利用下面的步驟來確保其服務(wù)的:1)首先在應(yīng)用程序產(chǎn)生TCP報文時會進行大小控制,根據(jù)算法決定的發(fā)送的數(shù)據(jù)塊大小。然后再進行發(fā)送。2)當(dāng)主機利用發(fā)出一個數(shù)據(jù)段之后,它會啟動一個定時機制,如果在規(guī)定的時間內(nèi)接收不到確認(rèn)數(shù)據(jù),發(fā)送方就會重發(fā)。3)TCP的一端收到另一端發(fā)送來的數(shù)據(jù)時,它將發(fā)送一個確認(rèn)。4)TCP還
9、有頭部檢測。工作是檢測數(shù)據(jù)在傳輸過程中是否發(fā)生改變。如果存在改變,那么TCP將丟棄這個報文段并且不會發(fā)送收到這個報文段的確認(rèn)。5)IP數(shù)據(jù)報的順次在傳輸過程中可能會發(fā)生改變,所以TCP將對收到的數(shù)據(jù)進行重新排序,將收到的數(shù)據(jù)重新排列以后再交給應(yīng)用層處理。6)TCP的接收端會丟棄重復(fù)的數(shù)據(jù)。7)TCP還提供控制傳輸數(shù)據(jù)大小的機制。如利用滑動窗口機制來控制發(fā)送和接收數(shù)據(jù)的大小。1.1.3 TCP連接建立與終止建立連接(如圖2):1)一方首先發(fā)送一個連接申請。2)接收方發(fā)回包含服務(wù)器的初始序號的應(yīng)答。同時,也發(fā)送一個收到客戶方報文的一個確認(rèn)。3)發(fā)送申請方接收到接收方的確認(rèn)序號,建立連接。這個過程就
10、是建立TCP連接的“三次握手”過程。連接終止(如圖2):1)提出終止的一方首先發(fā)送了一個終止連接的申請。2)當(dāng)接收方收到這個請求,會發(fā)送一個確認(rèn),再發(fā)送文件終止標(biāo)志。3)然后這個接收方程序結(jié)束連接,此時也會發(fā)送一個結(jié)束標(biāo)志和確認(rèn)。圖二三次握手與四次揮手1.2 IP:網(wǎng)際協(xié)議IP協(xié)議是TCP/IP協(xié)議族中最為重要的協(xié)議。所有的其他協(xié)議產(chǎn)生的數(shù)據(jù)都需要以IP數(shù)據(jù)報形式來進行發(fā)送傳輸。而且IP提供無連接、不可靠的數(shù)據(jù)報傳送服務(wù):1)IP協(xié)議不能保證IP數(shù)據(jù)報能成功地傳輸?shù)浇邮辗健H绻l(fā)生某種錯誤時,如某個路由器暫時處于阻塞狀態(tài),IP也有一個簡單的錯誤處理算法:丟棄數(shù)據(jù),再通過發(fā)送一個特定的消息報給發(fā)
11、送端,發(fā)送端接收到之后再進行處理。2)IP在發(fā)送數(shù)據(jù)報之后就不在關(guān)心次數(shù)據(jù)報的狀態(tài)信息。每個數(shù)據(jù)報的處理是相互獨立的。IP地址分類如下圖所示:圖三IP地址分類1.3 UDP:用戶數(shù)據(jù)報協(xié)議UDP是一個面向數(shù)據(jù)報的傳輸層協(xié)議:進程的每個輸出都會被封裝成一個UDP數(shù)據(jù)報,并組裝成一份待發(fā)送的IP數(shù)據(jù)報。UDP不提供可靠性:其會把應(yīng)用程序傳給IP層的數(shù)據(jù)發(fā)送出去,它們能否達到目的地協(xié)議并不能保證。應(yīng)用程序必須關(guān)心IP數(shù)據(jù)報的長度。如果它超過網(wǎng)絡(luò)的MTU,那么就需要對IP數(shù)據(jù)報進行分片。1.4 Socket網(wǎng)絡(luò)編程原理通常套接口分類:原始socket,流式socket和數(shù)據(jù)報socket.流式sock
12、et確保無差錯無重復(fù)的順序的數(shù)據(jù)傳送.數(shù)據(jù)報socket定義了一種無連接的服務(wù),傳輸數(shù)據(jù)時相互獨立,無序的,也不確??煽啃?原始socket主要用于其他的網(wǎng)絡(luò)協(xié)議實現(xiàn)的測試等。無連接設(shè)計時,服務(wù)器方通常都是在等待客戶機發(fā)來信息,一有信息到來就開始進行處理,不需要先進行連接。其程序的流程可以用圖四表示。圖四2設(shè)計方法及思路2.1 思路客戶端與服務(wù)器建立連接,連接是通過申請的套接字實現(xiàn)的,客戶打開一個套接字并把它約束在一個端口上如果成功就相當(dāng)于建立一個虛擬文件以后就可以在虛擬文件上寫數(shù)據(jù)并通過網(wǎng)絡(luò)向外傳送,完成連接后就可以通信了??蛻魴C向服務(wù)器發(fā)送請求,打開一個連接后,客戶機把請求消息送到服務(wù)器的
13、停留端口上,完成提出請求操作。服務(wù)器在處理完客戶的請求之后,要向客戶機發(fā)送響應(yīng)消息??蛻敉ㄟ^關(guān)閉套接字來結(jié)束TCP/IP對話。當(dāng)使用TCP/IP協(xié)議發(fā)送客戶服務(wù)器服務(wù)程序時,服務(wù)器需要等待任意數(shù)量客戶端的連接,以便為他們提供服務(wù)。客戶端連接服務(wù)器時,必須先知道服務(wù)器的名稱。在TCP/IP中,就是服務(wù)器的IP地址和端口號。bind()函數(shù)實現(xiàn)將服務(wù)器綁定到一個已知的名字上的功能。接下來要將服務(wù)器套接字設(shè)置為監(jiān)聽狀態(tài),這是通過listen()函數(shù)完成的。在監(jiān)聽狀態(tài)下,如果客戶端向服務(wù)器發(fā)起連接請求,服務(wù)器通過調(diào)用accept()函數(shù)來接受該連接請求。服務(wù)器與客戶端完成連接后,就可以進行數(shù)據(jù)通信了。
14、 對于客戶端來說,首先調(diào)用connect()函數(shù)向服務(wù)器發(fā)出連接請求。如果服務(wù)器接受了該請求接下來就可以與服務(wù)器通信了。2.2編程方法WinSocket通信的步驟:1.在服務(wù)器端的應(yīng)用程序中的網(wǎng)絡(luò)通信的步驟如下:(1)建立服務(wù)器端的Socket,開始偵聽整個網(wǎng)絡(luò)中的連接請求。(2)當(dāng)檢測到來自客戶端的連接請求時,向客戶端發(fā)送收到連接請求的信息,并建立與客戶端之間的連接,再繼續(xù)進入監(jiān)聽狀態(tài)。(3)在監(jiān)聽的過程中,如果有用戶發(fā)出了請求,則服務(wù)器會產(chǎn)生一個新的連接Socket來處理用戶的請求,而原來的Socket仍然會進行監(jiān)聽操作。(4) 當(dāng)完成通信后,服務(wù)器關(guān)閉與客戶端的Socket連接。2.在客
15、戶端應(yīng)用程序中的網(wǎng)絡(luò)通信的步驟如下:(1)建立一個客戶端的Socket。(2)從命令行中得到服務(wù)器的名字,并進行查詢以得到服務(wù)器的IP地址;(3)從命令行中得到服務(wù)器所提供的端口號,以便進行下一步的操作;(4)發(fā)送連接請求到服務(wù)器,并等待服務(wù)器的回饋信息。(5)連接成功后,與服務(wù)器進行數(shù)據(jù)的交互。(6)數(shù)據(jù)處理完畢后,關(guān)閉自身的Socket連接,釋放進行連接所分配的資源,客戶端的程序運行完畢。圖五其主要工作流程為:服務(wù)器方首先創(chuàng)建一個socket,再調(diào)用綁定函數(shù)將該socket和本地網(wǎng)絡(luò)地址綁定,然后調(diào)用監(jiān)聽函數(shù)對socket進行偵聽同時也規(guī)定其處理大小,之后就調(diào)用接收函數(shù)來接收連接??蛻舳嗽?/p>
16、建立套接口后就可調(diào)用連接函數(shù)和申請和服務(wù)器建立連接.在服務(wù)器接收申請后建立連接,然后客戶機和服務(wù)器之間就可以發(fā)送和接收數(shù)據(jù).最后,待數(shù)據(jù)傳送結(jié)束后,關(guān)閉socket.2.3.3C/S模型介紹。C/S模型一般是基于連接的來交換信息的.它通常是由兩部分組成:1)Server服務(wù)器方一般都是在等待客戶方的申請,建立connect后再進行通信。2)Client客戶方會給一個已知的服務(wù)器方發(fā)送一個connect申請,當(dāng)服務(wù)器端接收請求之后connect成功。3系統(tǒng)需求分析與概要設(shè)計3.1功能需求分析(1)用戶端之間的信息發(fā)送,本程序需要實現(xiàn)的最基本的功能。用戶在界面上可以將自己需要發(fā)送的信息填入相應(yīng)的對
17、話框中,點擊發(fā)送按鈕后,可以將信息正常的發(fā)送給相應(yīng)的其它用戶,這個過程中的客戶端與客戶端之間使用點對點發(fā)送信息,預(yù)計利用TCP/IP協(xié)議中的UDP協(xié)議,在本程序中共需要3個端口,此功能預(yù)計使用3號端口。(2)在線用戶主機IP列表的維護。在用戶發(fā)送信息之前,需要選擇相應(yīng)的目的地端IP,這也就需要客戶端擁有在線用戶主機的IP地址,這個在線主機列表的維護是需要客戶端定時自動向服務(wù)器端發(fā)送信息,服務(wù)器端收集并維護在線用戶列表,再發(fā)送回客戶端。需要在客戶端和服務(wù)器端都使用定時器來完成此功能。此功能預(yù)計使用1、2號端口。(3)在C/S模式中,服務(wù)器與客戶端是相互依賴的。在客戶端啟用以后,需要查看服務(wù)器端是
18、否在線,服務(wù)器在線才能正常使用客戶端,如果服務(wù)器不在線,則在檢測一定次數(shù)以后自動退出客戶端程序。在使用過程中,客戶端在指定時間內(nèi)未向服務(wù)器端發(fā)送信息的,服務(wù)器認(rèn)為客戶端下線;客戶端在一定時間內(nèi)未收到服務(wù)器端信息的,認(rèn)為服務(wù)器已經(jīng)下線,則提示用戶并建議退出,在用戶一定時間后沒有退出的則自動關(guān)閉客戶端程序。3.2 數(shù)據(jù)需求分析(1)客戶端之間聊天信息。在控件上顯示時格式化,更易于用戶的查看自己發(fā)送或接收到的信息。(2)在線用戶聊天信息。服務(wù)器端存放在適當(dāng)?shù)目臻g中,在發(fā)送給客戶端時,對信息列表進行格式化,便于客戶端提取信息。(3)客戶端向服務(wù)器端發(fā)送的確認(rèn)在線信息。包括客戶端剛剛啟動時的初始化信息和
19、在使用過程中的確認(rèn)在線信息。(4)其它程序內(nèi)部可能需要設(shè)計的數(shù)據(jù)結(jié)構(gòu)體3.3性能需求分析(1)可靠性高,能在由于系統(tǒng)問題或其它原因產(chǎn)生錯誤后,作出相對應(yīng)處理,比如網(wǎng)絡(luò)初始化失敗、服務(wù)器不在線等,可以提示用戶安全退出本程序,在出現(xiàn)不可知的錯誤以后,可以盡量安全的退出程序。在程序的設(shè)計過程中,要求能盡可能多的設(shè)想到用戶使用過程中可能發(fā)生的事件,并能在判斷事件后做出相應(yīng)的處理,使程序具有較高的容錯性能。(2)宜操作性,程序簡單易懂,容易上手使用。設(shè)計界面是,簡化界面的復(fù)雜性,模擬QQ等現(xiàn)有即時通訊工具的界面,使用戶能很容易看懂并使用。(3)開發(fā)文檔易理解,保證以后自己二次開發(fā)或他人接手開發(fā)時,能夠清
20、晰的理解整個系統(tǒng)的設(shè)計思路和實現(xiàn)細(xì)節(jié)。(4)模塊化設(shè)計此軟件的功能,不同的模塊實現(xiàn)不同的功能,使得軟件易于以后的維護與擴展,在以后可以更好的完善本軟件的功能,更方便于在工作中的應(yīng)用。3.4運行需求分析(1) 用戶界面程序較小,啟動速度快??稍诰W(wǎng)絡(luò)中使用,有注冊功能,需進行用戶登錄。啟動后的應(yīng)用界面要清爽,設(shè)計要簡單明了,要具有較高的易用性。(2)故障處理在遇到可預(yù)知的故障與情況時,能提示用戶并自動退出;在遇到不可預(yù)知的故障時能安全退出。4.程序源碼4.1接收消息Display display = Display.getDefault();createContents();t=new Threa
21、d(new Task(new MyNotify()Overridepublicvoid notifyResult(Object obj) tr=(TalkResult) obj;Display.getDefault().asyncExec(new Runnable() Overridepublicvoid run() text.append(tr.inetAddress+對我說:rn+tr.content+rn+new Date()+rn);text.append(=);/TODO:將這個地址存到集合中(不允許重復(fù)), hashsethashSet.add(tr.inetAddress);/將
22、hashset中的數(shù)據(jù)顯示到table中去table.removeAll();for( InetAddress a:hashSet)TableItem ti=new TableItem(table, SWT.NONE);ti.setText(new String a.getHostAddress();if( button_1.getSelection()=true)String ip=tr.inetAddress.getHostAddress();String content=UUID.randomUUID().toString();byte bs=content.getBytes();/將要
23、發(fā)送的內(nèi)容轉(zhuǎn)成字節(jié)數(shù)組intlength=bs.length ;/要發(fā)送的內(nèi)容的字節(jié)數(shù)組的長度DatagramPacket dp=null;try InetSocketAddress addr=new InetSocketAddress( ip,Task.receivePort);dp=new DatagramPacket(bs, length,addr);ds=new DatagramSocket(7890);ds.send(dp); catch ( Exception e) e.printStackTrace();finallyds.close();););t.setDaemon(true
24、);t.start();Thread t2=new Thread( new ReceiveEixtMsgTask( new MyNotify() Overridepublicvoid notifyResult(Object obj) TalkResult tr=(TalkResult) obj;InetAddress ia=tr.inetAddress;hashSet.remove( ia);Display.getDefault().syncExec(new Runnable() Overridepublicvoid run() table.removeAll();for( InetAddre
25、ss a:hashSet)TableItem ti=new TableItem(table, SWT.NONE);ti.setText(new String a.getHostAddress();););t2.setDaemon(true);t2.start();shell.open();shell.layout();while (!shell.isDisposed() if (!display.readAndDispatch() display.sleep();4.2監(jiān)聽/選擇ip 發(fā)送消息table.addSelectionListener(new SelectionAdapter() O
26、verridepublicvoid widgetSelected(SelectionEvent e) TableItem tis=table.getSelection();if( tis=null | tis.length=0)return;TableItem ti=tis0;String ip=ti.getText();text_2.setText(ip););/退出button_2.addSelectionListener(new SelectionAdapter() Overridepublicvoid widgetSelected(SelectionEvent e) MessageBo
27、x mb=new MessageBox(shell,SWT.OK|SWT.CANCEL); /32/mb.setMessage(是否退出?);intr=mb.open();if( r=32)intmyport=Integer.parseInt( text_3.getText();byte bs=bye.getBytes();intlength=bs.length;for( InetAddress a:hashSet)String ip=a.getHostAddress();DatagramSocket ds=null;try InetSocketAddress addr=new InetSoc
28、ketAddress( ip,ITalks3.EXITPORT);dp=new DatagramPacket(bs, length,addr);ds=new DatagramSocket(myport);ds.send(dp); catch ( Exception el) el.printStackTrace();finallyds.close();System.exit(0););4.3發(fā)送消息/發(fā)送btnNewButton.addSelectionListener(new SelectionAdapter() Overridepublicvoid widgetSelected(Select
29、ionEvent e) String s=text_1.getText();/內(nèi)容intmyPort=Integer.parseInt(text_3.getText();/發(fā)送端口DatagramSocket ds=null;byte bs=s.getBytes();/將要發(fā)送的內(nèi)容轉(zhuǎn)成字節(jié)數(shù)組intlength=bs.length ;/要發(fā)送的內(nèi)容的字節(jié)數(shù)組的長度if(button.getSelection()=true)for( InetAddress a:hashSet)String ip=a.getHostAddress();/DatagramPacket的構(gòu)造方法參數(shù),三個參: 最后
30、一個參數(shù)表示另外一臺機器的地址和端口/UDP中的每一個包都必須指明要發(fā)送的地址try InetSocketAddress addr=new InetSocketAddress( ip,receivePort);DatagramPacket dp=new DatagramPacket(bs, length,addr);ds=new DatagramSocket(myPort);/使用本機上的哪一個端口發(fā)送ds.send(dp); catch (Exception e1) e1.printStackTrace(); finallyds.close();elseString ip=text_2.ge
31、tText();/對方ip/DatagramPacket的構(gòu)造方法參數(shù),三個參: 最后一個參數(shù)表示另外一臺機器的地址和端口/UDP中的每一個包都必須指明要發(fā)送的地址try InetSocketAddress addr=new InetSocketAddress( ip,receivePort);DatagramPacket dp=new DatagramPacket(bs, length,addr);ds=new DatagramSocket(myPort);/使用本機上的哪一個端口發(fā)送ds.send(dp); catch (Exception e1) e1.printStackTrace()
32、; finallyds.close(););privateintreceivePort=10002;/接收用端口privatebyte buf;/接收用的字節(jié)數(shù)組private DatagramPacket dp;/Packetprivate DatagramSocket ds;/Socketprivate HashSethashSet=new HashSet();Overridepublicvoid run() /int port=Integer.parseInt(text_1.getText();buf= newbyte1024;/字節(jié)數(shù)組,用來緩存數(shù)據(jù)dp=new DatagramPac
33、ket(buf, buf.length);/構(gòu)建一個數(shù)據(jù)包對象try ds=new DatagramSocket(receivePort);/構(gòu)建一個數(shù)據(jù)包Socket,占用UDP的9999端口,進行接收while(true)ds.receive(dp);/用這個9999端口來接收數(shù)據(jù),存在dp數(shù)據(jù)包對象的buf緩存空間System.out.println( new String(buf,0,dp.getLength();/將字節(jié)數(shù)組轉(zhuǎn)成字符串輸出Display.getDefault().asyncExec(new Runnable() Overridepublicvoid run() Str
34、ing s=new String(buf, 0, dp.getLength();/dp.getLength()接收的實際長度InetAddress address=dp.getAddress();text.append(address+對我說:rn+s+rn+new Date()+rn);text.append(=);/TODO:將這個地址存到集合中(不允許重復(fù)), hashsethashSet.add(address);/將hashset中的數(shù)據(jù)顯示到table中去table.removeAll();for( InetAddress a:hashSet)TableItem ti=new Ta
35、bleItem(table, SWT.NONE);ti.setText(new String a.getHostAddress();); catch (Exception e) e.printStackTrace(); 4.5運行結(jié)果4.5.1 發(fā)送消息測試中本機ip為192.168.14.134,對方ip為 192.168.14.134,本機向?qū)Ψ桨l(fā)送:“這是測試”對方接收到消息,并且將本機ip加入到在線列表用戶中4.5.2 接收消息測試中本機ip為192.168.14.134,對方ip為 192.168.14.134,對方向本機發(fā)送:“hello”,本機收到消息,并將對方加入到了在線列表中
36、4.5.3 群發(fā)選中群發(fā),然后發(fā)送消息,顯示再列表中的用戶將都會收到相同的消息4.5.4 退出系統(tǒng)按退出按鈕,用戶將消失在在線用戶列表中5出現(xiàn)問題及解決方法1、 在建立Socket連接時,兩端的端口號必須設(shè)為一致,否則無法建立連接。 2、 建立好連接之后,必須按照給定的格式輸入通信信息,即m+輸入的信息內(nèi)容,否則,將會出現(xiàn)“no this command”的提示。 3、 如果一個使用某端口的程序沒有關(guān)閉,另一個程序就不能使用這個端口。 4、 必須先連接服務(wù)器端,再連接客戶端,否則,不能預(yù)期將服務(wù)器端和客戶端連通。6 課程設(shè)計的總結(jié)體會6.1總結(jié)課程設(shè)計終于完成了。在這段不長的時間里,我感觸很深
37、,也學(xué)到很多東西。我對winsock雙機通信有了更深的了解和認(rèn)識,其原理和功能也加深了理解。TCP協(xié)議我們以前也學(xué)過相關(guān)知識,經(jīng)過這次設(shè)計,相關(guān)的知識得到進一步鞏固,運用也變得更加熟練。我學(xué)習(xí)和了解了有關(guān)JAVA中的相關(guān)知識和應(yīng)用,JAVA開發(fā)環(huán)境也更加熟悉。通過這次課程設(shè)計,我不僅學(xué)習(xí)到了新的知識,也對以前學(xué)過的相關(guān)的知識有了更深入的理解和掌握。不僅加強了我的理論知識的學(xué)習(xí),也增強了我的動手能力,對知識的理解不再局限于表明,理解更加透徹,也更鞏固。以前的學(xué)習(xí)都是單一方面的知識,這次通過課程設(shè)計,將這三個方面的知識綜合起來,顯然難度是加大了。開始的時候我也感覺似乎無從下手。但在網(wǎng)上查找了相關(guān)資
38、料,并且請教了一些同學(xué)后,有了一些頭緒,并著手開始設(shè)計和實踐。我們組這次做的課題的目的就是通過套接字在客戶端和服務(wù)器之間建立連接,這個連接是以TCP協(xié)議傳輸。在建立連接之后實現(xiàn)客戶端與服務(wù)器之間的通信,從而設(shè)計相關(guān)函數(shù)的調(diào)用和對套接字的應(yīng)用。1、客戶連接(Clientconnections)由客戶啟動,并將本地客戶套接字與遠(yuǎn)程服務(wù)器套接字相連.客戶套接字必須說明它們想連接的服務(wù)器.需要提供服務(wù)器的主機名或IP地址及其端口號.2、監(jiān)聽連接(ListeningConnections)是等待客戶的被動服務(wù)器套接字連接.一旦客戶發(fā)出了新的請求,服務(wù)器就會為該特殊連接生成新的套接字,然后返回監(jiān)聽狀態(tài).監(jiān)
39、聽服務(wù)器套接字必須說明代表其提供服務(wù)的端口嗎(事實上,客戶正是通過該端口進行連接的).3、服務(wù)器連接是由服務(wù)器激活的連接,負(fù)責(zé)接受來自客戶的請求.這些不同的連接種類只對建立客戶與服務(wù)器之間的連接具有重要性.一旦連接建立完畢.連接的雙方都可以自由發(fā)出請求并彼此發(fā)送數(shù)據(jù).這里面涉及什么是套接字,什么是流式套接字,為什么用流式套接字等問題。用套接字中的相關(guān)函數(shù)來完成通信過程,它的存在是為了區(qū)別不同應(yīng)用程序進程間的網(wǎng)絡(luò)通信和連接。流套接字用于提供面向連接、可靠的數(shù)據(jù)傳輸服務(wù),又因為該服務(wù)將保證數(shù)據(jù)能夠?qū)崿F(xiàn)無差錯、無重復(fù)發(fā)送,并按順序接收,所以用了流式套接字。6.2展望通過設(shè)計實現(xiàn)和測試的數(shù)據(jù)表明,本文研究的局域網(wǎng)即時通信方法能有效地完成局域網(wǎng)之間的通信,但隨著技術(shù)的發(fā)展,系統(tǒng)中還存在許多不足的地方,有待進一步改進和完善。同時,即時通信技術(shù)也在不斷的提高,這迫切的需要新的技術(shù)和方法。在今后的研究過程中,還要注意以下幾個方面的工作:1)對網(wǎng)絡(luò)通信技術(shù)的研究。正如我們所知道的,網(wǎng)絡(luò)通信技術(shù)在建立在網(wǎng)絡(luò)通信協(xié)議的基礎(chǔ)上的。尤其是對TCP/IP協(xié)議族的研究,或者將來會出現(xiàn)更加有效安全的網(wǎng)絡(luò)協(xié)議,這個方向一直
溫馨提示
- 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
提交評論