欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      計算機(jī)網(wǎng)絡(luò)課設(shè)點(diǎn)對點(diǎn)聊天

      時間:2019-05-14 02:09:17下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《計算機(jī)網(wǎng)絡(luò)課設(shè)點(diǎn)對點(diǎn)聊天》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《計算機(jī)網(wǎng)絡(luò)課設(shè)點(diǎn)對點(diǎn)聊天》。

      第一篇:計算機(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 HashSethashSet=new HashSet();@Override

      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 #include typedef unsigned int uint;typedef unsigned char uchar;

      /*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>ir)){ wcrc|=0x01;} if(wcrc>=0x1000)//這里就是判斷哪個最高位是1的13位進(jìn)制數(shù)滿不滿足,滿足就異或0x180D { wcrc^=0x180D;} wcrc<<=1;ir++;if(8==ir){ ir=0;iq++;} } //對后面添加12個0做處理,for(i=0;i<12;i++){ if(wcrc>=0x1000){ wcrc^=0x180D;} wcrc<<=1;} wcrc>>=1;//因?yàn)橐贫嗔艘淮危赃@里移回來 return wcrc;//最后返回的就是crc12碼 } /*獲取字符串長度的函數(shù)*/ int ucharstrlen(uchar buf[]){ int i=0;while(buf[i]!='