第一篇:計算機(jī)網(wǎng)絡(luò)課設(shè)點(diǎn)對點(diǎn)聊天
《計算機(jī)網(wǎng)絡(luò)》課程設(shè)計說明書
(點(diǎn)對點(diǎn)聊天程序)
學(xué)
院:
計算機(jī)與信息科學(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就可以進(jìn)行通訊,這樣開發(fā)局域網(wǎng)通訊程序就有了必要性。本文提出了局域網(wǎng)通訊軟件的需求,并詳細(xì)對網(wǎng)絡(luò)協(xié)議TCP/IP協(xié)議族進(jìn)行了介紹和研究,如TCP,UDP,廣播,IP等相關(guān)的技術(shù)。并對網(wǎng)絡(luò)通訊原理進(jìn)行了說明,采用了Client/Server模型, 程序基于TCP協(xié)議,通過socket接口來實(shí)現(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)過測試,程序能夠有效達(dá)到基本的預(yù)期要求
關(guān)鍵詞 課程設(shè)計;計算機(jī);TCP/IP協(xié)議;服務(wù)器/客戶端;JAVA;
引言
近年來,隨著全球信息化進(jìn)程的不斷發(fā)展,網(wǎng)絡(luò)也在飛速發(fā)展。出于高效、快速地處理各種事務(wù)的目的,越來越多的企業(yè)在其內(nèi)部使用局域網(wǎng)來進(jìn)行工作。在內(nèi)部局域網(wǎng)的幫助下,企業(yè)得以簡化信息流程,提高信息交換的速度,從而提高工作效率。然而,隨著企業(yè)規(guī)模的擴(kuò)大,業(yè)務(wù)量的增加,在局域網(wǎng)上運(yùn)行的應(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è)運(yùn)行的成本方面考慮,無論是單純地提升網(wǎng)絡(luò)帶寬或增加服務(wù)器的吞吐能力都不能從根本上解決局域網(wǎng)資源緊張的問題,對舊有局域網(wǎng)的大規(guī)模硬件改造反而會增加企業(yè)的負(fù)擔(dān)。
基于Socket的局域網(wǎng)通信軟件可以為企業(yè)原有的局域網(wǎng)提供一種良好,安全,快速的通信機(jī)制。它的實(shí)現(xiàn)無需對企業(yè)原有的局域網(wǎng)硬件進(jìn)行任何改動,具有實(shí)現(xiàn)成本低廉的優(yōu)點(diǎn),它的使用能有效地降低局域網(wǎng)通信負(fù)荷,提高局域網(wǎng)的使用效率,可以很好地解決企業(yè)內(nèi)部局域網(wǎng)的各種通信需求。
基于Socket的局域網(wǎng)聊天工具是此類局域網(wǎng)通信軟件的具體實(shí)例之一,它很好地詮釋了Socket通信的原理,并且在企業(yè)內(nèi)部通信、教學(xué)、討論等應(yīng)用中都具有一定的實(shí)用價值。它具有信息收發(fā)速度快,保密性好,占用網(wǎng)絡(luò)帶寬資源低,占用服務(wù)器吞吐能力低,易于編程實(shí)現(xiàn)等優(yōu)點(diǎn)。
基于Socket的局域網(wǎng)通信軟件應(yīng)用范圍廣闊,不但可以處理傳統(tǒng)的通信需求,而且也能擴(kuò)展以適應(yīng)新型的網(wǎng)絡(luò)應(yīng)用,如網(wǎng)絡(luò)教育,數(shù)據(jù)影音傳輸?shù)?,擁有廣泛的應(yīng)用前景。
目錄
1設(shè)計原理基礎(chǔ).........................................................2 1.1 TCP/IP簡介....................................................2 1.1.1 TCP/IP概念..................................................2 1.1.2 TCP:傳輸控制協(xié)議............................................3 1.1.3 TCP連接建立與終止...........................................3 1.2 IP:網(wǎng)際協(xié)議...................................................4 1.3 UDP:用戶數(shù)據(jù)報協(xié)議............................................5 1.4 Socket網(wǎng)絡(luò)編程原理............................................6 2設(shè)計方法及思路.......................................................7 2.1 思路...........................................................7 2.2編程方法.......................................................7 3系統(tǒng)需求分析與概要設(shè)計..............................................10 3.1功能需求分析..................................................10 3.4運(yùn)行需求分析..................................................11 4.程序源碼...........................................................12 4.1接收消息......................................................12 4.2監(jiān)聽..........................................................14 4.3發(fā)送消息......................................................15 4.5運(yùn)行結(jié)果......................................................19 4.5.1 發(fā)送消息................................................19 4.5.2 接收消息................................................19 4.5.3 群發(fā)....................................................20 4.5.4 退出系統(tǒng)................................................21 5出現(xiàn)問題及解決方法..................................................23 6 課程設(shè)計的總結(jié)體會.................................................25 6.1總結(jié)..........................................................25 6.2展望..........................................................26 參考文獻(xiàn).............................................................27 致 謝...............................................................28
1設(shè)計原理基礎(chǔ)
1.1 TCP/IP簡介
1.1.1 TCP/IP概念
首先網(wǎng)絡(luò)協(xié)議一般是通過分不同的level進(jìn)行開發(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機(jī)自身的網(wǎng)絡(luò)接口卡和本
機(jī)操作系統(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ò)相連的兩臺主機(jī)的應(yīng)用程序間提供end-to-end的通信。在TCP/IP協(xié)議族中,有兩個主要的且互不相同的傳輸協(xié)議:TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)。其中,TCP是提供高可靠性的數(shù)據(jù)通信。它可以通過三次握手,超時設(shè)置等機(jī)制來有效地保證了數(shù)據(jù)傳輸?shù)目煽啃?。而另外一個協(xié)議,UDP則為應(yīng)用層提供一種相對要簡單些的服務(wù)。它的工作只是把數(shù)據(jù)分組從發(fā)送方傳輸?shù)浇邮辗剑菙?shù)據(jù)分組能否成功達(dá)到接收方它不會給予保證。如果需要可靠性就必須得通過其他層來完成。4)應(yīng)用層,主要同于上層的應(yīng)用程序進(jìn)行的操作。
1.1.2 TCP:傳輸控制協(xié)議
TCP提供的是一種有保障的服務(wù)。確保了傳輸?shù)目煽啃?,運(yùn)用TCP協(xié)議的主機(jī)在交換數(shù)據(jù)之前必須首先建立一個連接。TCP主要是利用下面的步驟來確保其服務(wù)的:
1)首先在應(yīng)用程序產(chǎn)生TCP報文時會進(jìn)行大小控制,根據(jù)算法決定的發(fā)送的數(shù)據(jù)塊
大小。然后再進(jìn)行發(fā)送。
2)當(dāng)主機(jī)利用發(fā)出一個數(shù)據(jù)段之后,它會啟動一個定時機(jī)制,如果在規(guī)定的時間內(nèi)接收不到確認(rèn)數(shù)據(jù),發(fā)送方就會重發(fā)。
3)TCP的一端收到另一端發(fā)送來的數(shù)據(jù)時,它將發(fā)送一個確認(rèn)。
4)TCP還有頭部檢測。工作是檢測數(shù)據(jù)在傳輸過程中是否發(fā)生改變。如果存在改變,那么TCP將丟棄這個報文段并且不會發(fā)送收到這個報文段的確認(rèn)。
5)IP數(shù)據(jù)報的順次在傳輸過程中可能會發(fā)生改變,所以TCP將對收到的數(shù)據(jù)進(jìn)行重新排序,將收到的數(shù)據(jù)重新排列以后再交給應(yīng)用層處理。6)TCP的接收端會丟棄重復(fù)的數(shù)據(jù)。
7)TCP還提供控制傳輸數(shù)據(jù)大小的機(jī)制。如利用滑動窗口機(jī)制來控制發(fā)送和接收數(shù) 據(jù)的大小。
1.1.3 TCP連接建立與終止
建立連接(如圖2):
1)一方首先發(fā)送一個連接申請。
2)接收方發(fā)回包含服務(wù)器的初始序號的應(yīng)答。同時,也發(fā)送一個收到客戶方報文的一個確認(rèn)。
3)發(fā)送申請方接收到接收方的確認(rèn)序號,建立連接。這個過程就是建立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ù)報形式來進(jìn)行發(fā)送傳輸。而且IP提供無連接、不可靠的數(shù)據(jù)報傳送服務(wù):
1)IP協(xié)議不能保證IP數(shù)據(jù)報能成功地傳輸?shù)浇邮辗?。如果發(fā)生某種錯誤時,如某個路由器暫時處于阻塞狀態(tài),IP也有一個簡單的錯誤處理算法:丟棄數(shù)據(jù),再通過發(fā)送一個特定的消息報給發(fā)送端,發(fā)送端接收到之后再進(jìn)行處理。2)IP在發(fā)送數(shù)據(jù)報之后就不在關(guān)心次數(shù)據(jù)報的狀態(tài)信息。每個數(shù)據(jù)報的處理是相互獨(dú)立的。
IP地址分類如下圖所示:
圖三IP地址分類
1.3 UDP:用戶數(shù)據(jù)報協(xié)議
UDP是一個面向數(shù)據(jù)報的傳輸層協(xié)議:進(jìn)程的每個輸出都會被封裝成一個UDP數(shù)據(jù)報,并組裝成一份待發(fā)送的IP數(shù)據(jù)報。
UDP不提供可靠性:其會把應(yīng)用程序傳給IP層的數(shù)據(jù)發(fā)送出去,它們能否達(dá)到目的地協(xié)議并不能保證。應(yīng)用程序必須關(guān)心IP數(shù)據(jù)報的長度。如果它超過網(wǎng)絡(luò)的MTU,那么就需要對IP數(shù)據(jù)報進(jìn)行分片。
1.4 Socket網(wǎng)絡(luò)編程原理
通常套接口分類:原始socket,流式socket和數(shù)據(jù)報socket.流式socket確保無差錯無重復(fù)的順序的數(shù)據(jù)傳送.數(shù)據(jù)報socket定義了一種無連接的服務(wù),傳輸數(shù)據(jù)時相互獨(dú)立,無序的,也不確保可靠性.原始socket主要用于其他的網(wǎng)絡(luò)協(xié)議實(shí)現(xiàn)的測試等。
無連接設(shè)計時,服務(wù)器方通常都是在等待客戶機(jī)發(fā)來信息,一有信息到來就開始進(jìn)行處理,不需要先進(jìn)行連接。其程序的流程可以用圖四表示。
圖四
2設(shè)計方法及思路
2.1 思路
客戶端與服務(wù)器建立連接,連接是通過申請的套接字實(shí)現(xiàn)的,客戶打開一個套接字并把它約束在一個端口上如果成功就相當(dāng)于建立一個虛擬文件以后就可以在虛擬文件上寫數(shù)據(jù)并通過網(wǎng)絡(luò)向外傳送,完成連接后就可以通信了??蛻魴C(jī)向服務(wù)器發(fā)送請求,打開一個連接后,客戶機(jī)把請求消息送到服務(wù)器的停留端口上,完成提出請求操作。服務(wù)器在處理完客戶的請求之后,要向客戶機(jī)發(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ù)實(shí)現(xiàn)將服務(wù)器綁定到一個已知的名字上的功能。接下來要將服務(wù)器套接字設(shè)置為監(jiān)聽狀態(tài),這是通過listen()函數(shù)完成的。在監(jiān)聽狀態(tài)下,如果客戶端向服務(wù)器發(fā)起連接請求,服務(wù)器通過調(diào)用accept()函數(shù)來接受該連接請求。服務(wù)器與客戶端完成連接后,就可以進(jìn)行數(shù)據(jù)通信了。對于客戶端來說,首先調(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ù)進(jìn)入監(jiān)聽狀態(tài)。
(3)在監(jiān)聽的過程中,如果有用戶發(fā)出了請求,則服務(wù)器會產(chǎn)生一個新的連接
Socket來處理用戶的請求,而原來的Socket仍然會進(jìn)行監(jiān)聽操作。
(4)當(dāng)完成通信后,服務(wù)器關(guān)閉與客戶端的Socket連接。2.在客戶端應(yīng)用程序中的網(wǎng)絡(luò)通信的步驟如下:
(1)建立一個客戶端的Socket。
(2)從命令行中得到服務(wù)器的名字,并進(jìn)行查詢以得到服務(wù)器的IP地址;
(3)從命令行中得到服務(wù)器所提供的端口號,以便進(jìn)行下一步的操作;
(4)發(fā)送連接請求到服務(wù)器,并等待服務(wù)器的回饋信息。
(5)連接成功后,與服務(wù)器進(jìn)行數(shù)據(jù)的交互。
(6)數(shù)據(jù)處理完畢后,關(guān)閉自身的Socket連接,釋放進(jìn)行連接所分配的資源,客戶端的程序運(yùn)行完畢。
圖五
其主要工作流程為: 服務(wù)器方首先創(chuàng)建一個socket,再調(diào)用綁定函數(shù)將該socket和本地網(wǎng)絡(luò)地址綁定,然后調(diào)用監(jiān)聽函數(shù)對socket進(jìn)行偵聽同時也規(guī)定其處理大小,之后就調(diào)用接收函數(shù)來接收連接。
客戶端在建立套接口后就可調(diào)用連接函數(shù)和申請和服務(wù)器建立連接.在服務(wù)器接收申請后建立連接,然后客戶機(jī)和服務(wù)器之間就可以發(fā)送和接收數(shù)據(jù).最后,待數(shù)據(jù)傳送結(jié)束后,關(guān)閉socket.2.3.3C/S模型介紹。
C/S模型一般是基于連接的來交換信息的.它通常是由兩部分組成:1)Server 服務(wù)器方一般都是在等待客戶方的申請,建立connect后再進(jìn)行通信。2)Client 客戶方會給一個已知的服務(wù)器方發(fā)送一個connect申請,當(dāng)服務(wù)器端接收請求之后connect成功。
3系統(tǒng)需求分析與概要設(shè)計
3.1功能需求分析
(1)用戶端之間的信息發(fā)送,本程序需要實(shí)現(xiàn)的最基本的功能。用戶在界面上可以將自己需要發(fā)送的信息填入相應(yīng)的對話框中,點(diǎn)擊發(fā)送按鈕后,可以將信息正常的發(fā)送給相應(yīng)的其它用戶,這個過程中的客戶端與客戶端之間使用點(diǎn)對點(diǎn)發(fā)送信息,預(yù)計利用TCP/IP協(xié)議中的UDP協(xié)議,在本程序中共需要3個端口,此功能預(yù)計使用3號端口。
(2)在線用戶主機(jī)IP列表的維護(hù)。在用戶發(fā)送信息之前,需要選擇相應(yīng)的目的地端IP,這也就需要客戶端擁有在線用戶主機(jī)的IP地址,這個在線主機(jī)列表的維護(hù)是需要客戶端定時自動向服務(wù)器端發(fā)送信息,服務(wù)器端收集并維護(hù)在線用戶列表,再發(fā)送回客戶端。需要在客戶端和服務(wù)器端都使用定時器來完成此功能。此功能預(yù)計使用1、2號端口。
(3)在C/S模式中,服務(wù)器與客戶端是相互依賴的。在客戶端啟用以后,需要查看服務(wù)器端是否在線,服務(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ā)送給客戶端時,對信息列表進(jìn)行格式化,便于客戶端提取信息。
(3)客戶端向服務(wù)器端發(fā)送的確認(rèn)在線信息。包括客戶端剛剛啟動時的初始化信息和在使用過程中的確認(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ā)時,能夠清晰的理解整個系統(tǒng)的設(shè)計思路和實(shí)現(xiàn)細(xì)節(jié)。(4)模塊化設(shè)計此軟件的功能,不同的模塊實(shí)現(xiàn)不同的功能,使得軟件易于以后的維護(hù)與擴(kuò)展,在以后可以更好的完善本軟件的功能,更方便于在工作中的應(yīng)用。
3.4運(yùn)行需求分析
(1)用戶界面
程序較小,啟動速度快??稍诰W(wǎng)絡(luò)中使用,有注冊功能,需進(jìn)行用戶登錄。啟動后的應(yīng)用界面要清爽,設(shè)計要簡單明了,要具有較高的易用性。
(2)故障處理
在遇到可預(yù)知的故障與情況時,能提示用戶并自動退出;在遇到不可預(yù)知的故障時能安全退出。
4.程序源碼
4.1接收消息
Display display = Display.getDefault();
@Override
publicvoid run(){
text.append(tr.inetAddress+“對我 Display.getDefault().asyncExec(new Runnable(){
@Override
publicvoid notifyResult(Object obj){ tr=(TalkResult)obj;t=new Thread(new Task(new MyNotify(){ createContents();說:rn”+tr.content+“rn”+new Date()+“rn”);
if(button_1.getSelection()==true){
String ip=tr.inetAddress.getHostAddress();String content=UUID.randomUUID().toString();byte[] bs=content.getBytes();//將要發(fā)送的內(nèi)容轉(zhuǎn)
//將hashset中的數(shù)據(jù)顯示到table中去 table.removeAll();
for(InetAddress a:hashSet){
}
TableItem ti=new TableItem(table, SWT.NONE);ti.setText(new
//TODO:將這個地址存到集合中(不允許重復(fù)),hashset hashSet.add(tr.inetAddress);text.append(“========”);String[]{ a.getHostAddress()});成字節(jié)數(shù)組
}
}
}
intlength=bs.length;//要發(fā)送的內(nèi)容的字節(jié)數(shù)組的長DatagramPacket dp=null;try {
InetSocketAddress addr=new
dp=new DatagramPacket(bs, length,addr);ds=new DatagramSocket(7890);ds.send(dp);度
InetSocketAddress(ip,Task.receivePort);
} catch(Exception e){
}
e.printStackTrace();ds.close();}finally{ });}));t.setDaemon(true);t.start();
Thread t2=new Thread(new ReceiveEixtMsgTask(new MyNotify(){
@Override
publicvoid notifyResult(Object obj){
TalkResult tr=(TalkResult)obj;InetAddress ia=tr.inetAddress;hashSet.remove(ia);
Display.getDefault().syncExec(new Runnable(){
@Override
publicvoid run(){
}
table.removeAll();
for(InetAddress 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(){
//退出
button_2.addSelectionListener(new SelectionAdapter(){
@Override
publicvoid widgetSelected(SelectionEvent e){
MessageBox mb=new MessageBox(shell,SWT.OK|SWT.CANCEL);mb.setMessage(“是否退出?”);intr=mb.open();if(r==32){
@Override
publicvoid widgetSelected(SelectionEvent e){
} TableItem[] tis=table.getSelection();if(tis==null || tis.length<=0){ } TableItem ti=tis[0];String ip=ti.getText();text_2.setText(ip);return;});//32/
}
} intmyport=Integer.parseInt(text_3.getText());byte[] bs=“bye”.getBytes();intlength=bs.length;for(InetAddress a:hashSet){
} System.exit(0);
String ip=a.getHostAddress();DatagramSocket ds=null;try {
InetSocketAddress addr=new
dp=new DatagramPacket(bs, length,addr);ds=new DatagramSocket(myport);ds.send(dp);InetSocketAddress(ip,ITalks3.EXITPORT);
} catch(Exception el){
}
el.printStackTrace();ds.close();}finally{ });
4.3發(fā)送消息
//發(fā)送
btnNewButton.addSelectionListener(new SelectionAdapter(){
@Override
publicvoid widgetSelected(SelectionEvent 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ù),三個參: 最后一個參數(shù)//UDP中的每一個包都必須指明要發(fā)送的地址 try { 表示另外一臺機(jī)器的地址和端口
} privateintreceivePort=10002;//接收用端口 privatebyte[] buf;//接收用的字節(jié)數(shù)組 private DatagramPacket dp;//Packet
}
}
}
InetSocketAddress addr=new
DatagramPacket dp=new DatagramPacket(bs, ds=new DatagramSocket(myPort);//使用本機(jī)上的哪一個端口發(fā)送 ds.send(dp);
e1.printStackTrace();ds.close();InetSocketAddress(ip,receivePort);length,addr);
String ip=text_2.getText();//對方ip
//DatagramPacket的構(gòu)造方法參數(shù),三個參: 最后一個參數(shù)表示//UDP中的每一個包都必須指明要發(fā)送的地址 try { }else{
}
}
InetSocketAddress addr=new
DatagramPacket dp=new DatagramPacket(bs, ds=new DatagramSocket(myPort);//使用本機(jī)上的哪一個端口發(fā)送 ds.send(dp);
e1.printStackTrace();ds.close();InetSocketAddress(ip,receivePort);length,addr);
} catch(Exception e1){ } finally{ 另外一臺機(jī)器的地址和端口
} catch(Exception e1){ } finally{ });
private DatagramSocket ds;//Socket
private HashSet
publicvoid run(){
//int port=Integer.parseInt(text_1.getText());buf= newbyte[1024];//字節(jié)數(shù)組,用來緩存數(shù)據(jù)
dp=new DatagramPacket(buf, buf.length);//構(gòu)建一個數(shù)據(jù)包對象 try { ds=new DatagramSocket(receivePort);//構(gòu)建一個數(shù)據(jù)包Socket,占用UDP的9999端口,進(jìn)行接收
while(true){ ds.receive(dp);//用這個9999端口來接收數(shù)據(jù),存在dp數(shù)據(jù)包對象的System.out.println(new buf緩存空間
String(buf,0,dp.getLength()));//將字節(jié)數(shù)組轉(zhuǎn)成字符串輸出
@Override
publicvoid run(){
String s=new String(buf, 0, Display.getDefault().asyncExec(new Runnable(){ dp.getLength());//dp.getLength()接收的實(shí)際長度
InetAddress address=dp.getAddress();
text.append(address+“對我說:rn”+s+“rn”+new
Date()+“rn”);
//將hashset中的數(shù)據(jù)顯示到table中去 table.removeAll();
for(InetAddress a:hashSet){
TableItem ti=new TableItem(table, SWT.NONE);ti.setText(new
//TODO:將這個地址存到集合中(不允許重復(fù)),hashset hashSet.add(address);
text.append(“========”);String[]{ a.getHostAddress()});
}
}
} } e.printStackTrace();} catch(Exception e){
}
} });
4.5運(yùn)行結(jié)果
4.5.1 發(fā)送消息
測試中本機(jī)ip為192.168.14.134,對方ip為 192.168.14.134,本機(jī)向?qū)Ψ桨l(fā)送:“這是測試” 對方接收到消息,并且將本機(jī)ip加入到在線列表用戶中
4.5.2 接收消息
測試中本機(jī)ip為192.168.14.134,對方ip為 192.168.14.134,對方向本機(jī)發(fā)送:“hello”,本機(jī)收到消息,并將對方加入到了在線列表中
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ù)器端和客戶端連通。課程設(shè)計的總結(jié)體會
6.1總結(jié)
課程設(shè)計終于完成了。在這段不長的時間里,我感觸很深,也學(xué)到很多東西。我對winsock雙機(jī)通信有了更深的了解和認(rèn)識,其原理和功能也加深了理解。TCP協(xié)議我們以前也學(xué)過相關(guān)知識,經(jīng)過這次設(shè)計,相關(guān)的知識得到進(jìn)一步鞏固,運(yùn)用也變得更加熟練。我學(xué)習(xí)和了解了有關(guān)JAVA中的相關(guān)知識和應(yīng)用,JAVA開發(fā)環(huán)境也更加熟悉。通過這次課程設(shè)計,我不僅學(xué)習(xí)到了新的知識,也對以前學(xué)過的相關(guān)的知識有了更深入的理解和掌握。不僅加強(qiáng)了我的理論知識的學(xué)習(xí),也增強(qiáng)了我的動手能力,對知識的理解不再局限于表明,理解更加透徹,也更鞏固。
以前的學(xué)習(xí)都是單一方面的知識,這次通過課程設(shè)計,將這三個方面的知識綜合起來,顯然難度是加大了。開始的時候我也感覺似乎無從下手。但在網(wǎng)上查找了相關(guān)資料,并且請教了一些同學(xué)后,有了一些頭緒,并著手開始設(shè)計和實(shí)踐。
我們組這次做的課題的目的就是通過套接字在客戶端和服務(wù)器之間建立連接,這個連接是以TCP協(xié)議傳輸。在建立連接之后實(shí)現(xiàn)客戶端與服務(wù)器之間的通信,從而設(shè)計相關(guān)函數(shù)的調(diào)用和對套接字的應(yīng)用。
1、客戶連接(Client connections)由客戶啟動,并將本地客戶套接字與遠(yuǎn)程服務(wù)器套接字相連.客戶套接字必須說明它們想連接的服務(wù)器.需要提供服務(wù)器的主機(jī)名或IP地址及其端口號.2、監(jiān)聽連接(Listening Connections)是等待客戶的被動服務(wù)器套接字連接.一旦客戶發(fā)出了新的請求,服務(wù)器就會為該特殊連接生成新的套接字,然后返回監(jiān)聽狀態(tài).監(jiān)聽服務(wù)器套接字必須說明代表其提供服務(wù)的端口嗎(事實(shí)上,客戶正是通過該端口進(jìn)行連接的).3、服務(wù)器連接是由服務(wù)器激活的連接,負(fù)責(zé)接受來自客戶的請求.這些不同的連接種類只對建立客戶與服務(wù)器之間的連接具有重要性.一旦連接建立完畢.連接的雙方都可以自由發(fā)出請求并彼此發(fā)送數(shù)據(jù).這里面涉及什么是套接字,什么是流式套接字,為什么用流式套接字等問題。用套接字中的相關(guān)函數(shù)來完成通信過程,它的存在是為了區(qū)別不同應(yīng)用程序進(jìn)程間的網(wǎng)絡(luò)通信和連接。流套接字用于提供面向連接、可靠的數(shù)據(jù)傳輸服務(wù),又因?yàn)樵摲?wù)將保證數(shù)據(jù)能夠?qū)崿F(xiàn)無差錯、無重復(fù)發(fā)送,并按順序接收,所以用了流式套接字。
6.2展望
通過設(shè)計實(shí)現(xiàn)和測試的數(shù)據(jù)表明,本文研究的局域網(wǎng)即時通信方法能有效地完成局域網(wǎng)之間的通信,但隨著技術(shù)的發(fā)展,系統(tǒng)中還存在許多不足的地方,有待進(jìn)一步改進(jìn)和完善。同時,即時通信技術(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é)議,這個方向一直是重點(diǎn)的研究方向。
2)安全性是一個非常重要的方向,無論是互聯(lián)網(wǎng)還是局域網(wǎng)環(huán)境,安全性始終是一個重要的因素,其中包括一些有效的安全算法等,也是最值得關(guān)注的方向。
3)如何提高信息的效率,對于網(wǎng)絡(luò)通信而言,效率一直是一個重點(diǎn),怎么樣能把網(wǎng)絡(luò)的利用率做到最優(yōu),怎樣把信息安全有效的傳遞,在傳遞過程中如何保證信息不會丟失,錯誤等
參考文獻(xiàn)
[1]謝希仁.計算機(jī)網(wǎng)絡(luò).第4版.電子工業(yè)出版社.2006年
[2](美)W.RichardStevens.TCP/IP協(xié)議詳解卷一.人民郵電出版社.2009年
[3]施煒李錚秦潁編著.WindowsSockets規(guī)范及應(yīng)用-Windows網(wǎng)絡(luò)編程接口.2002年
[4]廣播地址_百度百科.http://baike.baidu.com/view/473043.html?wtp=tt [5]張文趙子銘楊天路魏小康著.P2P網(wǎng)絡(luò)技術(shù)原理與C++開發(fā)案例.人民郵電出版社.2008年8月
[6]NetworProgrammingforMicrosoftWindows,SecondEditioneBook.PUBLISHEDBYMicrosoftPress.2002 [7](美)(JamesF.Kurose)庫羅斯,陳鳴譯.計算機(jī)網(wǎng)絡(luò)自頂向下方法第四版.機(jī)械工業(yè)出版社.2008年
[8]CharlesPetzold著.windows程序設(shè)計(第5版).北京大學(xué)出版社.2009年 [9]羅軍舟等編著.《TCP/IP協(xié)議及網(wǎng)絡(luò)編程技術(shù)》.清華大學(xué)出版社.2004年 [10]葉樹華著.網(wǎng)絡(luò)編程實(shí)用教程(第2版).人民郵電出版社.2010年
[11]林濤著.計算機(jī)網(wǎng)絡(luò)應(yīng)用編程技術(shù).人民郵電出版社.2006年[12]http://zh.wikipedia.org/,維基百科 [13]MSDNLibrary–October2001 [14]李凌著.Winsock2網(wǎng)絡(luò)編程實(shí)用教程.清華大學(xué)出版社.2003年 [15]黃帆.多人聊天程序的一種設(shè)計與實(shí)現(xiàn).中國水運(yùn)(學(xué)術(shù)版).2006 [16]冀振燕著.UML系統(tǒng)分析設(shè)計與應(yīng)用案例[M].人民郵電出版社.2003年 [17]黃永峰等著.IP網(wǎng)絡(luò)多媒體通信技術(shù).人民郵電出版社.2003年 [18](美)JEANNAMATTHEWS著.李毅超曹躍王鈺等譯.《計算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)教程》(《COMPUTERNETWORKS:INTERNETPROTOCOLSINACTION》).人民郵電出版社.2006.1 [19](美)DouglasE.Comer林瑤等.《用TCP/IP進(jìn)行網(wǎng)際互聯(lián)第一卷:原理、協(xié)議與結(jié)構(gòu)》.電子工業(yè)出版社.2001年5月
[20]AlexanderHeu?ner.ModelExtractionforSockets-basedDistributedPrograms.hal-00425099.version1-20Oct2009 [21]DavidA.Bryan.STANDARDS-BASEDP2PCOMMUNICATIONSSYSTEMS.BruceB.Lowekamp,advisor,DepartmentofComputerScience,CollegeofWilliamandMary [22]TCP三次握手.http://baike.baidu.com/view/1003841.htm
致 謝
真誠感謝老師在我們課程設(shè)計階段給予我們的指導(dǎo)與幫助以及專業(yè)課的教授,在老師的指導(dǎo)下使我對網(wǎng)絡(luò)專業(yè)知識有了更深的認(rèn)識,并且您嚴(yán)肅的科學(xué)態(tài)度,嚴(yán)謹(jǐn)?shù)闹螌W(xué)精神,精益求精的工作作風(fēng),深深地感染和激勵著我,這些使我受益匪淺,并將成為我終身獻(xiàn)身科學(xué)和獻(xiàn)身事業(yè)的動力。在此向您致以誠摯的謝意與敬意。
第二篇:計算機(jī)網(wǎng)絡(luò)課設(shè)
計算機(jī)網(wǎng)絡(luò)應(yīng)用課程設(shè)計
報告
系(院):
計算機(jī)科學(xué)學(xué)院 專業(yè)班級: 計科11511 姓
名: 鐘燦均 學(xué)
號: 201503687 指導(dǎo)教師: 余紹文 設(shè)計時間: 2017.6.12-2017.6.23 設(shè)計地點(diǎn): 12教1樓機(jī)房
一、課程設(shè)計目的和意義
計算機(jī)網(wǎng)絡(luò)課程設(shè)計的目的,是為了讓我們更深入地掌握計算機(jī)網(wǎng)絡(luò)的核心內(nèi)容,實(shí)現(xiàn)理論與實(shí)踐相結(jié)合。讓學(xué)生用具體的實(shí)踐成果,體現(xiàn)對理論知識的掌握程度。有利于學(xué)生提高計算機(jī)網(wǎng)絡(luò)的實(shí)踐能力,加深對計算機(jī)網(wǎng)絡(luò)理論知識的理解。其基本目的是:
1. 培養(yǎng)學(xué)生理論聯(lián)系實(shí)際的設(shè)計思想,訓(xùn)練綜合運(yùn)用所學(xué)的基礎(chǔ)理論知識,結(jié)合生產(chǎn)實(shí)際分析和解決網(wǎng)絡(luò)應(yīng)用中問題的能力,從而使基礎(chǔ)理論知識得到鞏固和加深。2. 學(xué)習(xí)掌握網(wǎng)絡(luò)應(yīng)用工程的一般設(shè)計過程和方法。
二、設(shè)計題目和要求
1.編寫程序,實(shí)現(xiàn)系統(tǒng)的基本功能;
2.要有用戶界面:要求至少采用文本菜單界面;鼓勵采用圖形菜單界面; 3.寫課程設(shè)計報告,內(nèi)容包括: ? 封面(參見附錄I)
? 需求分析:以無歧義的陳述說明程序設(shè)計的任務(wù),強(qiáng)調(diào)的是程序要做什么?給出功能模塊圖和流程圖。同時明確規(guī)定:輸入的形式和輸出值的范圍;輸出的形式;程序所能夠達(dá)到的功能;測試數(shù)據(jù),包括正確的輸入及其輸出結(jié)果和含有錯誤的輸入及其輸出結(jié)果。? 概要設(shè)計:包括程序設(shè)計組成框圖,程序中使用的存儲結(jié)構(gòu)設(shè)計說明(如果指定存儲結(jié)構(gòu)請寫出該存儲結(jié)構(gòu)的定義)。
? 詳細(xì)設(shè)計:包括模塊功能說明(如函數(shù)功能、入口及出口參數(shù)說明,函數(shù)調(diào)用關(guān)系描述等),每個模塊的算法設(shè)計說明(可以是描述算法的流程圖)。其中源程序要按照寫程序的規(guī)則來編寫,結(jié)構(gòu)清晰,重點(diǎn)函數(shù)的重點(diǎn)變量,重點(diǎn)功能部分要加上清晰的程序注釋。? 運(yùn)行結(jié)果:包括典型的界面、輸入和輸出數(shù)據(jù)等;
? 總結(jié):包括課程設(shè)計中遇到的問題,解決問題的過程及體會、收獲、對課程設(shè)計的認(rèn)識與思考等。
? 附錄:包括主要程序清單,要有適當(dāng)?shù)淖⑨?,使程序容易閱讀。? 開發(fā)環(huán)境:windows 10
? 開發(fā)工具: vs2008
題目3:基于UDP協(xié)議的簡易聊天機(jī)器人
設(shè)計目標(biāo):
1.了解Socket通信的原理,在此基礎(chǔ)上編寫一個聊天程序; 2.理解upd原理;課程設(shè)計系統(tǒng)組成及模塊功能: 此課程設(shè)計實(shí)現(xiàn)了基于UDP的客戶/服務(wù)器通信程序,需要實(shí)現(xiàn)以下一些基本功能: 1.客戶端連接聊天機(jī)器人服務(wù)器;
2.消息發(fā)送:客戶端發(fā)送消息給機(jī)器人服務(wù)器。
3.消息接收:客戶端接收到機(jī)器人服務(wù)器發(fā)送給他的消息。4.可以有多個客戶端同時連接
5.智能回復(fù)功能:根據(jù)用戶發(fā)送的消息內(nèi)容,稍微有點(diǎn)智能回復(fù)。
運(yùn)行效果:
服務(wù)器端和客戶端截圖
三、設(shè)計內(nèi)容
1、UDP傳送數(shù)據(jù)前并不與對方建立連接,即UDP是無連接的,在傳輸數(shù)據(jù)前,發(fā)送方和接收方相互交換信息使雙方同步。
2、UDP不對收到的數(shù)據(jù)進(jìn)行排序,在UDP報文的首部中并沒有關(guān)于數(shù)據(jù)順序的信息(如TCP所采用的序號),而且報文不一定按順序到達(dá)的,所以接收端無從排起。
3、UDP對接收到的數(shù)據(jù)報不發(fā)送確認(rèn)信號,發(fā)送端不知道數(shù)據(jù)是否被正確接收,也不會重發(fā)數(shù)據(jù)。
4、UDP傳送數(shù)據(jù)較TCP快速,系統(tǒng)開銷也少。
5、由于缺乏擁塞控制(congestion control),需要基于網(wǎng)絡(luò)的機(jī)制來減小因失控和高速UDP流量負(fù)荷而導(dǎo)致的擁塞崩潰效應(yīng)。換句話說,因?yàn)閁DP發(fā)送者不能夠檢測擁塞,所以像使用包隊(duì)列和丟棄技術(shù)的路由器這樣的網(wǎng)絡(luò)基本設(shè)備往往就成為降低UDP過大通信量的有效工具。數(shù)據(jù)報擁塞控制協(xié)議(DCCP)設(shè)計成通過在諸如流媒體類型的高速率UDP流中增加主機(jī)擁塞控制來減小這個潛在的問題。
從以上UDP協(xié)議特點(diǎn)可知,UDP提供的是無連接的、不可靠的數(shù)據(jù)傳送方式,是一種盡力而為的數(shù)據(jù)交付服務(wù)。
1.服務(wù)端
1.2.3.4.5.加載協(xié)議棧; 創(chuàng)建套接字;
將套接字綁定到一個本地地址和端口bind; 等待接收數(shù)據(jù)recvfrom;關(guān)閉套接字;
2.客戶端
1.2.3.4.加載協(xié)議棧;
創(chuàng)建套接字socket;
向服務(wù)器發(fā)送數(shù)據(jù)sendto;關(guān)閉套接字; 3.相關(guān)代碼顯示:(客戶端)
int main(int argc, char* argv[]){
system(“@color 0e”);WORD socketVersion = MAKEWORD(2, 2);WSADATA wsaData;if(WSAStartup(socketVersion, &wsaData)!= 0){ } sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(8888);sin.sin_addr.S_un.S_addr = inet_addr(m);int len = sizeof(sin);return 0;以上代碼為相關(guān)版本信息及熱啟動的一些操作;;
結(jié)構(gòu)體端口號及相關(guān)地址信息以及轉(zhuǎn)化函數(shù),將輸入的信息轉(zhuǎn)化為計算機(jī)可識別的二進(jìn)制代碼,進(jìn)行相關(guān)構(gòu)造
char * sendData = new char[255];cout << “主人:”;cin >> sendData;while(strcmp(sendData, “#”)!= 0){
sendto(sclient, sendData, strlen(sendData), 0,(sockaddr *)&sin, len);char recvData[255];int ret = recvfrom(sclient, recvData, 255, 0,(sockaddr *)&sin, &len);if(ret > 0){
} recvData[ret] = 0x00;cout << “機(jī)器人:”;printf(recvData);4.相關(guān)代碼展示:(服務(wù)端)
SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if(serSocket == INVALID_SOCKET){
} printf(“socket error!”);return 0;3
if(bind(serSocket,(sockaddr *)&serAddr, sizeof(serAddr))== SOCKET_ERROR){
} sockaddr_in remoteAddr;int nAddrLen = sizeof(remoteAddr);char * sendData = new char[255];char recvData[255];while(true){
int ret = recvfrom(serSocket, recvData, 255, 0,(sockaddr *)&remoteAddr, //printf(recvData);if(ret > 0){
} struct Ro { char recv[255];char send[255];recvData[ret] = 0x00;printf(“接受到一個連接:%s rn”, inet_ntoa(remoteAddr.sin_addr));cout << “主人:”;printf(recvData);printf(“bind error!”);closesocket(serSocket);return 0;以上為對套接字的綁定及判斷綁定是否成功,以及對于相關(guān)信息的初始化
&nAddrLen);}Ro;FILE *fp;fp = fopen(“G:機(jī)器人問答機(jī)制.txt”, “r”);while(!feof(fp)){
} fscanf(fp, “%s %s”, Ro.recv, Ro.send);if(strcmp(recvData, Ro.recv)== 0){
} else { } strcpy(sendData, Ro.send);break;strcpy(sendData, “對不起,我不知道”);4
fclose(fp);cout << endl;cout << “機(jī)器人:” << sendData << endl;sendto(serSocket, sendData, strlen(sendData), 0,(sockaddr *)&remoteAddr, nAddrLen);
四、設(shè)計成果以及心得 1.成果
2.心得
通過對課設(shè)的相關(guān)的操作,加強(qiáng)了對于相關(guān)知識的理解,對于知識的應(yīng)用也得以加強(qiáng),在課設(shè)過程中,聊天機(jī)器人制作較為有趣,對于TCP與UDP的通信方式有了進(jìn)一步的理解和加強(qiáng),對于socket編程的相關(guān)基礎(chǔ)也得以進(jìn)一步的理解和學(xué)習(xí)。在今后的學(xué)習(xí)過程中希望可以將所學(xué)知識應(yīng)用于實(shí)際,學(xué)以致用。而且對于課設(shè)中存在的問題和不足,以及通過老師的講解,對一些算法加以分析和改進(jìn),從而不斷完善課設(shè)內(nèi)容,對內(nèi)容的理解得以加深。
指導(dǎo)老師意見:
成績:
教師簽名: 2017年6月23日
第三篇:C1 CRC12計算機(jī)網(wǎng)絡(luò)課設(shè)
計算機(jī)通信網(wǎng)絡(luò)課程設(shè)計
C1 CRC-12 校驗(yàn)通信軟件設(shè)計
所在學(xué)院: 信息科學(xué)與工程學(xué)院
專業(yè)班級: 通信工程
學(xué)生姓名:
學(xué)生學(xué)號:
指導(dǎo)教師: 時 間: 2015年9月20
引言:
循環(huán)冗余碼 CRC 檢驗(yàn)技術(shù)廣泛應(yīng)用于測控及通信領(lǐng)域,CRC計算可以靠專用的硬件來實(shí)現(xiàn),但是對于低成本的微控制器系統(tǒng),在沒有硬件支持下實(shí)現(xiàn)CRC檢驗(yàn),關(guān)鍵的問題就是如何通過軟件來完成CRC計算,也就是CRC算法的問題。CRC碼是數(shù)據(jù)通信領(lǐng)域中最常用的一種差錯檢驗(yàn)碼,其特征是信息字段和校驗(yàn)字段的長度可以任意選定。
實(shí)驗(yàn)設(shè)計要求:
C1.CRC-12 校驗(yàn)通信軟件設(shè)計
環(huán)境要求:Windows/XP/7;C;信息交換內(nèi)容為鍵盤輸入的字符串;通信傳輸通過共享文件實(shí)現(xiàn)
編碼要求:用模2 除法計算CRC 碼,生成多項(xiàng)式為CRC-12
功能要求:能在兩臺計算機(jī)機(jī)上運(yùn)行程序,一臺產(chǎn)生CRC 碼,另一臺校驗(yàn)。
課程設(shè)計目標(biāo):
用C語言設(shè)計課程程序,完成用模2出發(fā)計算CRC碼的CRC校驗(yàn)軟件設(shè)計,1.掌握CRC碼的計算方法;
2.掌握用C語言計算CRC碼的算法;
3.熟練并掌握C語言在通信網(wǎng)絡(luò)中的編程實(shí)現(xiàn)方式及功能。
CRC 簡介
CRC 校驗(yàn)的基本思想是利用線性編碼理論,在發(fā)送端根據(jù)要傳送的 k 位二進(jìn)制碼序 列,以一定的規(guī)則產(chǎn)生一個校驗(yàn)用的監(jiān)督碼(既 CRC 碼)r 位,并附在信息后邊,構(gòu)成 一個新的二進(jìn)制碼序列數(shù)共(k+r)位,最后發(fā)送出去。在接收端,則根據(jù)信息碼和 CRC 碼之間所遵循的規(guī)則進(jìn)行檢驗(yàn),以確定傳送中是否出錯。
12位的 CRC 碼產(chǎn)生的規(guī)則是先將要發(fā)送的二進(jìn)制序列數(shù)左移 12 位(既乘以2)后,再除以一個多項(xiàng)式,最后所得到的余數(shù)既是 CRC 碼,如式(2-1)式所示,其中 B(X)表示 n 位的二進(jìn)制序列數(shù),G(X)為多項(xiàng)式,Q(X)為整數(shù),R(X)是余數(shù)(既 CRC 碼)。
12B(x)?212R(x)(2-1)?Q(x)?G(x)G(x)求CRC碼所采用模 2 加減運(yùn)算法則,既是不帶進(jìn)位和借位的按位加減,這種加減運(yùn)算實(shí)際上就是邏輯上的異或運(yùn)算,加法和減法等價,乘法和除法運(yùn)算與普通代數(shù)式的乘除法運(yùn)算是一樣,符合同樣的規(guī)律。生成CRC碼的多項(xiàng)式如下,CRC-12 則產(chǎn)生的是 12 位的CRC碼。CRC-12:G(x)?x?x?x?x?x?1
接收方將接收到的二進(jìn)制序列數(shù)(包括信息碼和 CRC 碼)除以多項(xiàng)式,如果余數(shù)為0,則說明傳輸中無錯誤發(fā)生,否則說明傳輸有誤,關(guān)于其原理這里不再多述。用軟件計算 CRC 碼時,接收方可以將接收到的信息碼求 CRC 碼,比較結(jié)果和接收到的 CRC 碼是否相同。
CRC原理:
CRC碼為循環(huán)冗余校驗(yàn)碼,基本表示方式為(n,k),其中n為數(shù)據(jù)位數(shù),k為校驗(yàn)碼位數(shù)。CRC碼校驗(yàn)的基本思想是利用線性編碼理論,在發(fā)送端根據(jù)要傳送的(n,k)位二進(jìn)制碼序列,121132以一定的規(guī)則產(chǎn)生一個校驗(yàn)用的監(jiān)督碼(既CRC碼)r位,并附在信息后邊,構(gòu)成一個新的二進(jìn)制碼序列數(shù)共(k+r)位,最后發(fā)送出去。在接收端,則根據(jù)信息碼和CRC碼之間所遵循的規(guī)則進(jìn)行檢驗(yàn),以確定傳送中是否出錯。采用CRC校驗(yàn)時,發(fā)送方和接收方用同一個生成多項(xiàng)式g(x),并且g(x)的首位和最后一位的系數(shù)必須為1。CRC的處理方法是:發(fā)送方以g(x)去除t(x),得到余數(shù)作為CRC校驗(yàn)碼。校驗(yàn)時,以計算的校正結(jié)果是否為0為據(jù),判斷數(shù)據(jù)幀是否出錯。CRC校驗(yàn)可以100%地檢測出所有奇數(shù)個隨機(jī)錯誤和長度小于等于k(k為g(x)的階數(shù))的突發(fā)錯誤。所以CRC的生成多項(xiàng)式的階數(shù)越高,那么誤判的概率就越小。
程序流程圖:
CRC-12校驗(yàn)方法:
多項(xiàng)式是0x180D,有13位,crc12本來是12位,16進(jìn)制的0x80D前面補(bǔ)了個1,所以就是13位的。然后我們的信息是一串字符,每個字符8個位二進(jìn)制,假如我們有3個字符,總共有24位。所以我們的運(yùn)算就是先獲取前面13位,這里的前13位二進(jìn)制是指第一位是1的13位二進(jìn)制。這個前13位和0x180D異或后,得到了一個異或結(jié)果,這個結(jié)果除去前面的0,應(yīng)該是小于13位的。這時是不夠13位的,所以我們可以在繼續(xù)往后加二進(jìn)制,假如3個字符,那么總共有24位進(jìn)制,我們還有14到24位這些還沒有加。
直到最后所有位都已經(jīng)處理好了,得到的結(jié)果就是crc碼。
文件共享: 將計算的數(shù)據(jù)存入共享的文件夾中,所以我們必須要先建立一個codecode的文件夾,并設(shè)為共享,將要共享的數(shù)據(jù)存在code.txt文件里。
fp_crc=fopen(“D:codecodecode.txt”,“w”);
//打開文件夾 fprintf(fp_crc,“%d ”,len+2);
//存入數(shù)據(jù)+crc的長度 for(int i=0;i fprintf(fp_crc,“%c”,ch[i]); //存入字符串 } fprintf(fp_crc,“%c”,(crcnum>>4)); //先去12位crc碼的前8位 fprintf(fp_crc,“%c”,(crcnum<<4)&0xF0);//再取crc碼的后4位,然后剩下的補(bǔ)0,使其夠8位fclose(fp_crc); //最后存入文檔中 另一臺計算機(jī)從計算機(jī)中的共享文件夾讀取數(shù)據(jù),讀出后數(shù)據(jù)進(jìn)行CRC-12校驗(yàn),若讀出數(shù)據(jù)對生成多項(xiàng)式取余,若余數(shù)為0,則信息傳輸正確,否則信息傳輸錯誤。 fp_code=fopen(“Pc14codecodecode.txt”,“r”);//共享計算機(jī)組名為Pc14的codecode文件夾 fscanf(fp_code,“%d”,&len);//讀取長度 fscanf(fp_code,“%c”,&bb);//讀取長度后一個空格 for(int i=0;i fscanf(fp_code,“%c”,&data_t[i]);//按照長度讀取每一個字節(jié) fclose(fp_code); int ju=crc12(data_t,len); //crc12校驗(yàn),返回 程序清單: 發(fā)送端: #include /*buf輸入的信息,len信息長度*/ int crc12(uchar buf[],int len){ int wcrc;int i,iq;uchar ir;wcrc=0;///crc碼 iq=0;//buf字符串下標(biāo),從0到len-1,初始化為0 ir=0;//初始化為0,0到7的變換,while(iq