基于java的判斷DTU超時(shí)功能的研究與設(shè)計(jì)設(shè)計(jì)7853600_第1頁(yè)
基于java的判斷DTU超時(shí)功能的研究與設(shè)計(jì)設(shè)計(jì)7853600_第2頁(yè)
基于java的判斷DTU超時(shí)功能的研究與設(shè)計(jì)設(shè)計(jì)7853600_第3頁(yè)
基于java的判斷DTU超時(shí)功能的研究與設(shè)計(jì)設(shè)計(jì)7853600_第4頁(yè)
基于java的判斷DTU超時(shí)功能的研究與設(shè)計(jì)設(shè)計(jì)7853600_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、安安 徽徽 農(nóng)農(nóng) 業(yè)業(yè) 大大 學(xué)學(xué)畢畢 業(yè)業(yè) 論論 文(設(shè)計(jì))文(設(shè)計(jì))論文題目論文題目 基于基于 java 的判斷的判斷 dtu 超時(shí)功能的研究與設(shè)計(jì)超時(shí)功能的研究與設(shè)計(jì) 安徽農(nóng)業(yè)大學(xué)學(xué)士學(xué)位論文(設(shè)計(jì))開題報(bào)告安徽農(nóng)業(yè)大學(xué)學(xué)士學(xué)位論文(設(shè)計(jì))開題報(bào)告課題名稱基于 java 的農(nóng)業(yè)物聯(lián)網(wǎng)中間件的判斷dtu 超時(shí)功能的研究和設(shè)計(jì)課題來(lái)源導(dǎo)師指定學(xué)生姓名專業(yè)通信工程學(xué)號(hào)指導(dǎo)教師姓名職稱副教授研究?jī)?nèi)容1研究分析 dtu 超時(shí)功能的作用。2對(duì) dtu 超時(shí)功能的應(yīng)用原理進(jìn)行分析:1)dsc 啟動(dòng)定時(shí)器輪詢并獲取用戶最后一次與 dsc 通訊的時(shí)間。2)獲取當(dāng)前時(shí)間并與最后一次登錄時(shí)間比較,取其差值。3

2、)該值超過(guò)事先定值則斷開用戶 dtu 與 dsc 數(shù)據(jù)中心的連接。3對(duì)以上工作過(guò)程的需要進(jìn)行編程并進(jìn)行模擬測(cè)試。研究計(jì)劃3 月初3 月中 調(diào)研、查資料。3 月中4 月初 研究并分析超時(shí)功能的作用及其應(yīng)用原理。4 月中5 月初 構(gòu)建系統(tǒng)框架,編程。5 月初5 月中 對(duì)系統(tǒng)進(jìn)行調(diào)試、運(yùn)行并修改。5 月中 撰寫畢業(yè)設(shè)計(jì)論文。特色與創(chuàng)新系統(tǒng)穩(wěn)定,抗干擾能力強(qiáng)應(yīng)用該功能可以節(jié)省不必要的流量花費(fèi)指導(dǎo)教師意見教研室意見學(xué)院意見2基于基于 javajava 的的農(nóng)業(yè)物聯(lián)網(wǎng)中間件農(nóng)業(yè)物聯(lián)網(wǎng)中間件的研究的研究判斷判斷 dtudtu 超時(shí)功能的研究和設(shè)計(jì)超時(shí)功能的研究和設(shè)計(jì)學(xué)生:詹步康 指導(dǎo)教師:張武(安徽農(nóng)業(yè)大學(xué)

3、 信息與計(jì)算機(jī)學(xué)院 合肥 230036)摘要:摘要:本課程設(shè)計(jì)運(yùn)用了所學(xué)的java語(yǔ)言基礎(chǔ)知識(shí),面向?qū)ο蟪绦蛟O(shè)計(jì)的基本思想、方法與技術(shù),網(wǎng)絡(luò)通信編程技術(shù)等開發(fā)了簡(jiǎn)單應(yīng)用功能-基于java的農(nóng)業(yè)物聯(lián)網(wǎng)中間件的判斷dtu超時(shí)功能。詳細(xì)地介紹了本課程設(shè)計(jì)運(yùn)用了所學(xué)的java語(yǔ)言基礎(chǔ)知識(shí),面向?qū)ο蟪绦蛟O(shè)計(jì)的基本思想、方法與技術(shù),網(wǎng)絡(luò)通信編程技術(shù)等開發(fā)了簡(jiǎn)單應(yīng)用功能-基于java的農(nóng)業(yè)物聯(lián)網(wǎng)中間件的判斷dtu超時(shí)功能。詳細(xì)地介紹了基于java的農(nóng)業(yè)物聯(lián)網(wǎng)中間件的判斷dtu超時(shí)功能的設(shè)計(jì)方法,給出了該功能的java程序設(shè)計(jì),該程序可直接用作服務(wù)器端程序,接受并處理數(shù)據(jù)。服務(wù)器端數(shù)據(jù)中心與客戶端dtu通過(guò)s

4、ocket建立連接,利用輸入輸出流透明傳送數(shù)據(jù)。服務(wù)器端程序主要包括節(jié)點(diǎn)類、工作線程類(接受并處理數(shù)據(jù)所用)、輪詢類等,以及用于存儲(chǔ)節(jié)點(diǎn)的哈希表、同步鎖和支持多客戶端的線程;客戶端程序主要有計(jì)時(shí)器類(每隔一定時(shí)間向服務(wù)器端發(fā)送一數(shù)據(jù))。關(guān)鍵詞:關(guān)鍵詞:dtu;超時(shí);輪詢java-based research of internet of things of agriculture middlewareresearch and design of judgment of dtu timeout function student: zhan bu kang teachers: zhang wu(s

5、chool of information & computer, anhui agricultural university, hefei, 230036)abstract:things of agriculture based on the java middleware dtu timeout automatically break function. to use what they have learned this course design are introduced in detail the basic knowledge of java language, the basi

6、c idea of object-oriented program design, method and technology, developed a simple application functions such as network communication programming technology, internet of things of agriculture based on the java middleware dtu timeout automatically break function. agricultural iot were introduced in

7、 detail based on the java middleware dtu timeout automatically disconnect function design method, gives the function of the java program design, the program can be directly used as a server-side application, receive and process the data. the client and server-side data center dtu via a socket connec

8、tion is established, using the transparent transmission of data input and output flow. server-side programs including the node class, working thread class (used) accept and process data, polling, and hash tables used to store the nodes, synchronization locks and support multiple threads of the clien

9、t; client program mainly include the timer class (sending a data at regular intervals to the server).keywords:dtu;timeout ;polling3目錄目錄1 引言引言.32.課題的總體目標(biāo)與主要研究?jī)?nèi)容課題的總體目標(biāo)與主要研究?jī)?nèi)容.42.1 課題的總體目標(biāo)42.2 研究的主要內(nèi)容42.2.1 下面就本課題所做的工作的主要內(nèi)容42.2.2 本論文的章節(jié)安排43 總體設(shè)計(jì)總體設(shè)計(jì).43.1 需求分析與設(shè)計(jì)思想:43.1.1 對(duì)判斷dtu超時(shí)功能的需求分析43.1.2 對(duì)判斷dtu超時(shí)

10、功能的設(shè)計(jì)思想43.2 設(shè)計(jì)時(shí)用到的重要的技術(shù)或數(shù)據(jù)結(jié)構(gòu)53.2.1同步鎖53.2.2哈希表73.2.3線程84 程序的詳細(xì)設(shè)計(jì)程序的詳細(xì)設(shè)計(jì).104.1 程序流程圖104.2 數(shù)據(jù)字典114.2.1 主類server114.2.2啟動(dòng)服務(wù)器startserver 124.2.3節(jié)點(diǎn)類node134.2.4工作線程workthread 144.2.5 輪詢類lookup154.2.6客戶端類client164.2.7工作計(jì)時(shí)器類mytask165 結(jié)論:結(jié)論:.17主要參考文獻(xiàn)主要參考文獻(xiàn).17致謝致謝.18附錄附錄 1:.18附錄附錄 2.312.1 運(yùn)行結(jié)果及界面3142.1.1啟動(dòng)服務(wù)器

11、前:312.1.2啟動(dòng)服務(wù)器但不啟動(dòng)客戶端:322.1.3啟動(dòng)服務(wù)器并啟動(dòng)多個(gè)客戶端:332.1.4 啟動(dòng)服務(wù)器并啟動(dòng)多個(gè)客戶端最后關(guān)閉全部客戶端:341 引言引言隨著經(jīng)濟(jì)社會(huì)的不斷發(fā)展和進(jìn)步,無(wú)線通信技術(shù)在人們生活中已變得愈發(fā)重要,受到廣泛運(yùn)用。應(yīng)用了無(wú)線通信技術(shù)的 gprs dtu 遍布了人類生活各個(gè)領(lǐng)域,被廣泛應(yīng)用于電力、水利、市政、交通、金融、環(huán)境監(jiān)測(cè)、農(nóng)業(yè)等行業(yè)領(lǐng)域。盡管應(yīng)用的行業(yè)不同,但應(yīng)用的原理是相同的,大都是 dtu 和行業(yè)設(shè)備相連,然后和后臺(tái)建立無(wú)線的通信連接。在農(nóng)業(yè)監(jiān)測(cè)系統(tǒng)中,常常需要對(duì)眾多農(nóng)業(yè)園的 co2 濃度,光照強(qiáng)度,土壤酸堿度等進(jìn)行實(shí)時(shí)監(jiān)測(cè),大部分監(jiān)測(cè)數(shù)據(jù)需要實(shí)時(shí)發(fā)

12、送到管理中心的后端服務(wù)器進(jìn)行處理。由于監(jiān)測(cè)點(diǎn)分散,分布范圍廣,而且大多設(shè)置在環(huán)境較惡劣的地區(qū),通過(guò)電話線傳送數(shù)據(jù)往往事倍功半。通過(guò) gprs 無(wú)線網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)傳輸,大大提高水文部門的工作效率,成為農(nóng)場(chǎng)主、農(nóng)業(yè)部門選擇的通信手段之一。dtu 內(nèi)嵌了 tcp/ip 協(xié)議棧,具有 socket 通訊功能,并提供透明數(shù)據(jù)傳輸通道,用戶只需設(shè)置一些參數(shù)就可實(shí)現(xiàn)將嵌入式系統(tǒng)直接與 internet 相連,實(shí)現(xiàn)網(wǎng)絡(luò)的互連互通。dtu 的主要功能是把遠(yuǎn)端設(shè)備的數(shù)據(jù)通過(guò)無(wú)線的方式傳送到數(shù)據(jù)中心,在傳送數(shù)據(jù)之前,dtu 需要與服務(wù)器端數(shù)據(jù)中心建立無(wú)線連接。服務(wù)器端監(jiān)控中心的 socket 端口監(jiān)聽程序負(fù)責(zé)監(jiān)聽采集

13、終端的連接請(qǐng)求,當(dāng)監(jiān)聽到連接請(qǐng)求后,建立通信鏈路,原來(lái)負(fù)責(zé)監(jiān)聽socket 仍進(jìn)行監(jiān)聽,通信鏈路建立后就可任意交換數(shù)據(jù)了。當(dāng) dtu 長(zhǎng)時(shí)間沒(méi)有發(fā)送數(shù)據(jù)到數(shù)據(jù)中心時(shí),那么數(shù)據(jù)中心就認(rèn)為該 dtu 已掉線并斷開與該 dtu 的連接。判斷 dtu 超時(shí)功能是 dtu 眾多功能之一,作用就是幫助數(shù)據(jù)中心及時(shí)發(fā)現(xiàn)那些不傳送數(shù)據(jù)卻仍然連接占用大量資源的 dtu,以便讓有限的內(nèi)存資源得到最大化利用。5圖 1 dtu 及其使用示例2.課題的總體目標(biāo)與主要研究?jī)?nèi)容課題的總體目標(biāo)與主要研究?jī)?nèi)容2.1 課題的總體目標(biāo)課題的總體目標(biāo)本課題的目標(biāo)是,實(shí)現(xiàn)個(gè)判斷 dtu 超時(shí)的功能,使用這個(gè)功能可以使服務(wù)器很大程度上提

14、高自己管理內(nèi)存資源的能力。此功能應(yīng)用于服務(wù)器后臺(tái)上,能比較理想得保證通訊連接的時(shí)效性,避免了那些空占其位,不盡其守的 dtu。2.2 研究的主要內(nèi)容研究的主要內(nèi)容 2.2.1 下面就本課題所做的工作的主要內(nèi)容 1) 就具體的 dtu 設(shè)備進(jìn)行調(diào)研,找出其工作原理,以何種方式發(fā)送數(shù)據(jù)等等。2) 編寫服務(wù)器端接受數(shù)據(jù)的程序,能夠從字節(jié)流里讀取數(shù)據(jù)。3) 編寫服務(wù)器端輪詢程序,能夠每隔一段時(shí)間檢查一次各客戶端是否掉線。 2.2.2 本論文的章節(jié)安排 第 2 章,提出了課題的總體目標(biāo)與主要研究?jī)?nèi)容;第 3 章,對(duì)判斷 dtu 超時(shí)功能的總體設(shè)計(jì),對(duì)設(shè)計(jì)有個(gè)宏觀把握;第 4 章,對(duì)判斷 dtu 超時(shí)功能

15、的具體設(shè)計(jì),詳細(xì)介紹了設(shè)計(jì)過(guò)程。第 5 章,針對(duì)本文的工作進(jìn)行了總結(jié)以及提出不足之處。63 總體設(shè)計(jì)總體設(shè)計(jì)3.1 需求分析與設(shè)計(jì)思想:需求分析與設(shè)計(jì)思想:3.1.1 對(duì)判斷 dtu 超時(shí)功能的需求分析在互聯(lián)網(wǎng)日益發(fā)展的今天,dtu 的使用也越來(lái)越廣泛,為各行業(yè)之間的信息、產(chǎn)業(yè)融合提供了幫助??赏\(yùn)用 dtu 的過(guò)程中難免會(huì)遇到令人不快的情況使得 dtu 無(wú)法正常向服務(wù)器發(fā)送數(shù)據(jù),這些情況常見有:突然斷電、dtu 本身電路故障、信號(hào)太弱、等等。服務(wù)器與眾多 dtu 通訊時(shí),可能某一 dtu 故障而無(wú)法向服務(wù)器發(fā)送數(shù)據(jù),此時(shí)服務(wù)器還在默默等待該 dtu 傳送的信息。大家都知道服務(wù)器根本接受不到

16、該 dtu 發(fā)來(lái)的數(shù)據(jù),但是此時(shí)服務(wù)器還與該dtu 連接著,占著服務(wù)器寶貴的內(nèi)存資源雙方卻不能正常通訊,顯然這浪費(fèi)資源,要是眾多 dtu 都是這樣尸位素餐的話,總有某一刻服務(wù)器也被“卡死了” 。所以為了消除這種隱患,迫切需要一種功能能夠準(zhǔn)確查出那些尸位素餐的 dtu,然后把它們“踢下線”以釋放資源。3.1.2 對(duì)判斷 dtu 超時(shí)功能的設(shè)計(jì)思想 啟動(dòng)服務(wù)器,打開了輪詢程序并啟動(dòng)了監(jiān)聽程序,等候客戶端的連接。若有客戶端發(fā)來(lái)連接請(qǐng)求時(shí),服務(wù)器就專門為這個(gè)客戶端啟動(dòng)一個(gè)線程來(lái)接受并處理該客戶端發(fā)來(lái)的數(shù)據(jù);另外服務(wù)器會(huì)創(chuàng)建個(gè)節(jié)點(diǎn)來(lái)代表該客戶端,并將該節(jié)點(diǎn)存在哈希表中。節(jié)點(diǎn)里封裝有客戶端的 ip 地址、

17、連接端口號(hào)、向服務(wù)器發(fā)送的數(shù)據(jù)、該節(jié)點(diǎn)在哈希表中存放的位置(即:鍵值)以及最后一次與服務(wù)器通訊時(shí)的時(shí)間(客戶端向服務(wù)器發(fā)送一次數(shù)據(jù),該時(shí)間即更新一次) 。 輪詢程序啟動(dòng)以后,會(huì)每隔一段時(shí)間輪詢一次哈希表,對(duì)里面存儲(chǔ)的客戶端節(jié)點(diǎn)中的時(shí)間進(jìn)行檢查,若其大于指定值則默認(rèn)該客戶端節(jié)點(diǎn)已故障,將與其斷開連接。3.2 設(shè)計(jì)時(shí)用到的重要的技術(shù)或數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)時(shí)用到的重要的技術(shù)或數(shù)據(jù)結(jié)構(gòu)3.2.1 同步鎖當(dāng)我們用多線程訪問(wèn)或修改同一共享資源時(shí),可能會(huì)引起線程間的沖突,因此引入線程同步機(jī)制,來(lái)讓先到的線程率先訪問(wèn)或修改該共享資源而在這一線程對(duì)共享資源的訪問(wèn)或修改還沒(méi)有結(jié)束之前,任何要訪問(wèn)或修改該共享資源的線程都必

18、須等待,這樣就很好得解決了線程間的并發(fā)問(wèn)題。 本設(shè)計(jì)中輪詢機(jī)制的代碼在訪問(wèn)或刪除哈希表中的客戶端節(jié)點(diǎn)時(shí),必須考慮到此時(shí)可能有新的客戶端向服務(wù)器端發(fā)出連接請(qǐng)求但是輪詢尚未結(jié)束不能將新來(lái)的節(jié)點(diǎn)插入哈希表,所以要將輪詢代碼與向哈希表插入節(jié)點(diǎn)的代碼同步起來(lái)。同步分為 同步方法 和 同步塊 兩種方式。3.2.1.1 synchronized 加在方法上, (同步方法,鎖定類實(shí)例)java 代碼7public class demo1 public synchronized void m1() /. public void m2() /. synchronized(this) /. /. 這兩種寫法的效果是

19、一樣的,鎖定的都是類實(shí)例。如果有兩個(gè) 類實(shí)例: de1 = new demo1(),de2 = new demo1(),另外有兩個(gè)線程: thread1,thread2,都調(diào)用了de1 對(duì)象,那么,在同一時(shí)間,如果 thread1 調(diào)用了 de1.m1(),則 thread2 在該時(shí)間內(nèi)不能訪問(wèn) de1.m1() 和 de1.m2(); 因?yàn)?thread1 把 de1 這個(gè)對(duì)象的鎖使用了,所以無(wú)法分給其它線程使用。但是,如果 thread1 調(diào)用 de1.m1(), thread2 調(diào)用 de2.m1(), 則可以同時(shí)進(jìn)行,因?yàn)樗鼈冋{(diào)用的是不同的 demo1 類對(duì)象實(shí)例。3.2.1.1 sy

20、nchronized 加在變量上, (同步塊,鎖定類實(shí)例)java 代碼public class demo2 object a = new object(); object b = new object(); public void m1() /. synchronized(a) /. /. public void m2() /. synchronized(b) /. /. 8 這種情況下,是實(shí)現(xiàn)代碼塊鎖定,鎖定的對(duì)象是變量 a 或 b; (注意:a 、b 都是非 static 的)如果有一個(gè) 類實(shí)例: do = new demo2(),另外有兩個(gè)線程:thread1,thread2,都調(diào)用了

21、 do 對(duì)象,那么,在同一時(shí)間,如果 thread1 調(diào)用了do.m1(),則 thread2 在該時(shí)間內(nèi)可以訪問(wèn) do.m2();但不能訪問(wèn) do.m1() 的同步塊, 因?yàn)?a 被 thread1 鎖定了。若此代碼里 a、b 變量用 static 修飾,其鎖定的對(duì)象都是類 demo2,而不是類的實(shí)例,即在多線程中,其共享的資源是屬于類的,而不是屬于類對(duì)象的。在這種情況下,如果 thread1 訪問(wèn)了這 2 個(gè)方法中的任何一個(gè), 在同一時(shí)間內(nèi)其它任何線程都不能訪問(wèn) 這 2 個(gè)方法。3.2.2 哈希表 3.2.2.1 哈希表的定義及其構(gòu)造方法哈希表是一種重要的存儲(chǔ)方式,也是一種常見的檢索方法,

22、是基于哈希表的 map 接口的實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用 null 值和 null 鍵。除了非同步和允許使用 null 之外,hashmap 類與 hashtable 大致相同。其基本思想是將關(guān)系碼的值作為自變量,通過(guò)一定的函數(shù)關(guān)系計(jì)算出對(duì)應(yīng)的函數(shù)值,把這個(gè)數(shù)值解釋為結(jié)點(diǎn)的存儲(chǔ)地址,將結(jié)點(diǎn)存入計(jì)算得到存儲(chǔ)地址所對(duì)應(yīng)的存儲(chǔ)單元。檢索時(shí)采用檢索關(guān)鍵碼的方法尋找對(duì)應(yīng)的節(jié)點(diǎn)?,F(xiàn)在哈希表有一套完整的算法來(lái)進(jìn)行插入、刪除和解決沖突。在 java 中哈希表用于存儲(chǔ)對(duì)象,實(shí)現(xiàn)快速檢索。java.util.hashmapjava.util.hashmap提供了若干種方法讓用戶很方便地使用哈希

23、表,而不需要考慮其真正如何工作的。哈希表類中提供了三種構(gòu)造方法,分別是:public hashmap ()public hashmap (int initialcapacity)public hashmap (int initialcapacity,float loadfactor)public hashmap(map m)參數(shù) initialcapacity 是 hashmap 的初始容量,它的值應(yīng)大于 0。loadfactor 又稱裝載因子,是一個(gè) 0.0 到 0.1 之間的 float 型的浮點(diǎn)數(shù)。它是一個(gè)百分比,表明了哈希表何時(shí)需要擴(kuò)充,例如,有一哈希表,容量為 100,而裝載因子為

24、0.9,那么當(dāng)哈希表 90%的9容量已被使用時(shí),此哈希表會(huì)自動(dòng)擴(kuò)充成一個(gè)更大的哈希表。如果用戶不賦這些參數(shù),系統(tǒng)會(huì)自動(dòng)進(jìn)行處理,而不需要用戶操心。3.2.2.2 hashmap 提供了基本的插入、檢索等方法。插入public v put(k key,v value)在此映射中關(guān)聯(lián)指定值與指定鍵。如果該映射以前包含了一個(gè)該鍵的映射關(guān)系,則舊值被替換。檢索public boolean containsvalue(object value)如果此映射將一個(gè)或多個(gè)鍵映射到指定值,則返回 true。 public set keyset()返回此映射中所包含的鍵的 set 視圖。該 set 受映射的支持,

25、所以對(duì)映射的更改將反映在該 set 中,反之亦然。如果在對(duì) set 進(jìn)行迭代的同時(shí)修改了映射(通過(guò)迭代器自己的 remove 操作除外),則迭代結(jié)果是不確定的。該 set 支持元素的移除,通過(guò) iterator.remove、set.remove、removeall、retainall 和 clear 操作可從該映射中移除相應(yīng)的映射關(guān)系。它不支持 add 或 addall 操作。 public collection values()返回此映射所包含的值的 collection 視圖。該 collection 受映射的支持,所以對(duì)映射的更改將反映在該 collection 中,反之亦然。如果在對(duì)

26、 collection 進(jìn)行迭代的同時(shí)修改了映射(通過(guò)迭代器自己的 remove 操作除外),則迭代結(jié)果是不確定的。該collection 支持元素的移除,通過(guò) iterator.remove、collection.remove、removeall、retainall 和 clear 操作可從該映射中移除相應(yīng)的映射關(guān)系。它不支持 add 或 addall 操作。 public setmap.entry entryset()返回此映射所包含的映射關(guān)系的 set 視圖。 該 set 受映射支持,所以對(duì)映射的更改將反映在此 set 中,反之亦然。如果在對(duì) set 進(jìn)行迭代的同時(shí)修改了映射(通過(guò)迭代器

27、自己的 remove 操作,或者通過(guò)在該迭代器返回的映射項(xiàng)上執(zhí)行 setvalue 操作除外),則迭代結(jié)果是不確定的。該 set 支持元素的移除,通過(guò) iterator.remove、set.remove、removeall、retainall 和 clear 操作可從該映射中移除相應(yīng)的映射關(guān)系。它不支持 add 或 addall 操作。 10刪除public v remove(object key)從此映射中移除指定鍵的映射關(guān)系(如果存在)。 public void clear()從此映射中移除所有映射關(guān)系。此調(diào)用返回后,映射將為空。3.2.3 線程3.2.3.1 線程的設(shè)計(jì)在 java 中

28、,創(chuàng)建線程的方法有兩種:一種是通過(guò)創(chuàng)建 thread 類的子類來(lái)實(shí)現(xiàn);另一種是通過(guò)實(shí)現(xiàn) runnable 接口的類來(lái)實(shí)現(xiàn)。這兩種創(chuàng)建線程方法并沒(méi)有本質(zhì)上的區(qū)別,但是由于 java 不允許多重繼承,所以當(dāng)一個(gè)類要繼承另一個(gè)非 thread 類而實(shí)現(xiàn)多線程的話,只能通過(guò)實(shí)現(xiàn) runnable 接口的方式來(lái)實(shí)現(xiàn)。3.2.3.2 通過(guò) thread 類實(shí)現(xiàn) 定義一個(gè)線程類,他繼承類 thread 并重寫其中的 run()方法。這時(shí)在初始化這個(gè)類的實(shí)例時(shí),目標(biāo)對(duì)象 target 可以為 null,表示這個(gè)實(shí)例本身具有線程體。由于 java 只支持單繼承,用這種方法定義的類不能再繼承其他類。1thread

29、 類定義的用來(lái)幫助管理線程的方法主要包括以下內(nèi)容 : void run()方法:線程的入口點(diǎn),運(yùn)行線程中的代碼。 void start()方法:通過(guò)調(diào)用運(yùn)行方法來(lái)啟動(dòng)線程,使之由出生狀態(tài)轉(zhuǎn)入就緒狀態(tài)。void sleep(long milis):在一段時(shí)間內(nèi)掛起線程,令線程睡眠,在此期間,線程不消耗 cpu 資源;以毫秒為單位。 void interrupt():中斷線程。 boolean isalive():判定線程是否仍在在運(yùn)行,出于活動(dòng)狀態(tài)。 void stname(string threadname):改變線程的名字。 string getname():獲取由 setname()方法實(shí)

30、質(zhì)的線程名字的字符串。11 yield():將 cpu 控制權(quán)主動(dòng)移交到下一個(gè)可運(yùn)行的線程。 setpriority(int p):設(shè)置線程優(yōu)先級(jí)。 getpriority():獲得線程優(yōu)先級(jí)。 join():等待一個(gè)線程終止。3.2.3.3 實(shí)現(xiàn) runnable 接口創(chuàng)建線程的最簡(jiǎn)單的方法就是創(chuàng)建一個(gè)實(shí)現(xiàn) runnable 接口的類。然后根據(jù)工作需要重新設(shè)計(jì)線程的 run 方法;再建立該類的對(duì)象。runnable 抽象了一個(gè)執(zhí)行代碼單元。你可以通過(guò)實(shí)現(xiàn) runnable 接口的方法創(chuàng)建每一個(gè)對(duì)象的線程。為實(shí)現(xiàn) runnable 接口,一個(gè)類僅需實(shí)現(xiàn)一個(gè) run()的簡(jiǎn)單方法。3.2.3.4

31、 線程的生命周期 每個(gè)線程的生命周期一共包括 5 種狀態(tài):出生,就緒,運(yùn)行,阻塞和死亡。線程從出生到死亡的過(guò)程稱為線程的生命周期。通過(guò)特定的操作可以進(jìn)行狀態(tài)間的轉(zhuǎn)換。3.2.3.5 出生當(dāng)用關(guān)鍵字 new 和 thread 類或其子類建立了一個(gè)線程對(duì)象后,該線程就處于出生狀態(tài)。 thread 線程名=new thread() ;處于新建狀態(tài)的線程只是一個(gè)空閑的線程對(duì)象,系統(tǒng)并沒(méi)有為他分配資源。在調(diào)用start 方法之前,線程就一直處于出生狀態(tài)。3.2.3.6 就緒在調(diào)用了 start 方法之后,線程就進(jìn)入就緒狀態(tài),即被加入到處于就緒狀態(tài)的線程序列中,在等待 cpu 時(shí)間片。線程名.start(

32、) ;3.2.3.7 運(yùn)行 當(dāng)處于線程序列中的線程獲得 cpu 時(shí)間片的時(shí)候,該線程就會(huì)自動(dòng)調(diào)用其 run方法,進(jìn)入運(yùn)行狀態(tài)。124 程序的詳細(xì)設(shè)計(jì)程序的詳細(xì)設(shè)計(jì)4.1 程序流程圖程序流程圖判斷 dtu 超時(shí)功能程序共有 8 個(gè) java 源文件。重要之間的關(guān)系如下圖; 圖 2 類之間的關(guān)系server.java該文件是 java application 程序,負(fù)責(zé)創(chuàng)建程序的主窗口。該類含有 init 方法,程序從該類開始執(zhí)行。startserver.java該文件生成的類負(fù)責(zé)將服務(wù)器端套接字綁定端口號(hào)和 ip 地址,啟動(dòng)服務(wù)器,建立監(jiān)聽系統(tǒng)。當(dāng)有客戶端發(fā)來(lái)連接請(qǐng)求時(shí)即建立連接,然后啟動(dòng)工作線

33、程。node.java該文件生成的類的對(duì)象代表一個(gè)客戶端節(jié)點(diǎn),節(jié)點(diǎn)里存儲(chǔ)著客戶端發(fā)向服務(wù)器端的信息、客戶端最后一次與服務(wù)器端通訊的時(shí)間、客戶端的 ip 地址和端口號(hào)、客戶端套接字以及該節(jié)點(diǎn)在哈希表中所對(duì)應(yīng)的鍵值。workthread.java該文件生成的類負(fù)責(zé)創(chuàng)建工作線程。接受并處理客戶端發(fā)向服務(wù)器端的數(shù)據(jù)。每接受一次數(shù)據(jù),都要根據(jù)該數(shù)據(jù)對(duì)這個(gè)工作線程對(duì)應(yīng)的客戶端節(jié)點(diǎn)里的信息進(jìn)行更新。lookup.java該文件生成的類負(fù)責(zé)對(duì)哈希表 1 中各客戶端節(jié)點(diǎn)最后一次與服務(wù)器端通訊的時(shí)間進(jìn)行檢查。 使用迭代器遍歷哈希表 1,查出超時(shí)的客戶端節(jié)點(diǎn)便將其鍵值放入哈希表 2, 等輪詢一周結(jié)束,用迭代器遍歷哈

34、希表 2 將哈希表 1 中超時(shí)的客戶端節(jié)點(diǎn)踢下線并將其從哈希 表 1 中刪除。13client.java(測(cè)試類)該文件生成的類負(fù)責(zé)向服務(wù)器端發(fā)送數(shù)據(jù)。首先在其主函數(shù)中通過(guò)構(gòu)造函數(shù)socket(inetaddress address, int port)綁定服務(wù)器端的地址和端口號(hào),然后啟動(dòng)定時(shí)器。mytask.java(測(cè)試類)該文件主要負(fù)責(zé)創(chuàng)建一個(gè)定時(shí)器,每隔一定時(shí)間向服務(wù)器端發(fā)送數(shù)據(jù)。4.2 數(shù)據(jù)字典數(shù)據(jù)字典4.2.1 主類 server4.2.1.1 成員變量(見表 1)表 1 server 類的主要成員變量(屬性)變量名變量名變量類型變量類型可見性可見性成員變量描述成員變量描述tate

35、xtarea文本區(qū)域lb1label標(biāo)簽lb2label標(biāo)簽tf1textfield文本框tf2textfield文本框btnbutton按鈕4.2.1.2 方法(見表 2)表 2 server 類的主要方法名稱名稱功能功能返回值返回值備注備注server創(chuàng)建程序主窗口構(gòu)造方法actionperformed處理 actionevent 事件接口方法init程序開始運(yùn)行applet 程序從此處開始運(yùn)行4.2.2 啟動(dòng)服務(wù)器 startserver4.2.2.1 成員變量(見表 3)14表 3 startserver 類的主要成員變量變量名變量名變量類型變量類型可見性可見性成員變量描述成員變量描述

36、hmhashmap哈希表num_threadint當(dāng)前工作線程數(shù)ssserversocket服務(wù)器套接字addrinetaddress服務(wù)器 ip 地址的 inetaddress對(duì)象ipstringip 地址字符串形式portint端口號(hào)4.2.2.2 方法(見表 4)表 4 startserver 類主要方法名稱名稱功能功能返回值返回值備注備注startserver初始化 ip 地址和端口號(hào)構(gòu)造方法run線程的主部;建立服務(wù)器端的監(jiān)聽機(jī)制,收到連接請(qǐng)求即建立連接并啟動(dòng)工作線程線程的 run()bind_port使服務(wù)器端綁定固定的ip 地址和監(jiān)聽端口號(hào)4.2.3 節(jié)點(diǎn)類 node4.2.3.

37、1 成員變量(見表 5)表 5 node 類的主要成員變量變量名變量名變量類型變量類型可見性可見性成員變量描成員變量描述述datastring記錄客戶端向服務(wù)器端發(fā)的數(shù)據(jù)timelong收到最后一條信息時(shí)的時(shí)刻15ipstring客戶端的 ip地址portint客戶端的端口號(hào)socketsocket客戶端套接字keychar節(jié)點(diǎn)存入哈希表時(shí)的鍵值4.2.3.2 方法 (見表 6)表 6 node 類的主要方法名稱名稱功能功能返回值返回值備注備注node創(chuàng)建客戶端節(jié)點(diǎn)構(gòu)造方法getip獲取節(jié)點(diǎn)內(nèi)存儲(chǔ)的客戶端ip 地址ip 是string 類型setip設(shè)置 ip 地址值getport獲取節(jié)點(diǎn)內(nèi)存

38、儲(chǔ)的客戶端端口號(hào)setport設(shè)置客戶端端口號(hào)gettime獲取節(jié)點(diǎn)內(nèi)存儲(chǔ)的服務(wù)器與客戶端最后一次通訊的時(shí)間settime更新某節(jié)點(diǎn)內(nèi)存儲(chǔ)的服務(wù)器與客戶端最后一次通訊的時(shí)刻getdata獲取節(jié)點(diǎn)內(nèi)存儲(chǔ)的客戶端發(fā)來(lái)的信息setdata更新節(jié)點(diǎn)內(nèi)存儲(chǔ)的客戶端發(fā)來(lái)的信息getsocket獲取節(jié)點(diǎn)內(nèi)存儲(chǔ)的客戶端套setsocket更新節(jié)點(diǎn)內(nèi)存儲(chǔ)的客戶端套接字getkey獲取哈希表內(nèi)存儲(chǔ)的該節(jié)點(diǎn)對(duì)應(yīng)的鍵值4.2.4 工作線程 workthread 4.2.4.1 成員變量(見表 7)16表 7 workthread 類的主要成員變量變量名變量名變量類型變量類型可見性可見性成員變量描述成員變量描述chch

39、ar客戶端發(fā)的心跳包的字符串信息的第九位字符datastring客戶端發(fā)來(lái)的信息bbyte服務(wù)器端從輸入流讀取數(shù)據(jù)放入字節(jié)數(shù)組 b 中flagboolean用于標(biāo)記是否同一個(gè)客戶端向服務(wù)器端發(fā)信息nodenodenode 類的實(shí)例,即客戶端節(jié)點(diǎn)socketsocket客戶端套接字hashlockobject同步鎖4.2.4.2 方法(見表 8)表 8 workthread 類的主要方法名稱名稱功能功能返回值返回值備注備注workthread初始化客戶端套接字 socket構(gòu)造方法run工作線程主部,接受并處理客戶端發(fā)向服務(wù)器端的信息4.2.5 輪詢類 lookup 4.2.5.1 成員變量(見

40、表 9)表 9 lookup 類的主要成員變量變量名變量名變量類型變量類型可見性可見性成員變量描述成員變量描述now_datelong開始輪詢時(shí)的時(shí)間last_datelong客戶端最后一次與服務(wù)器端通訊時(shí)的時(shí)間nodenode輪詢期間,代表所檢查時(shí)間的當(dāng)前節(jié)點(diǎn)17node2node輪詢后,代表所檢查出超時(shí)的節(jié)點(diǎn)hm2hashmap存儲(chǔ)輪詢期間檢查出超時(shí)的節(jié)點(diǎn)ititerator哈希表 1 的迭代器it2iterator哈希表 2 的迭代器 4.2.5.2 方法(見表 10)表 10 lookup 類的主要方法名稱名稱功能功能返回值返回值備注備注run線程的 run 方法chaxun輪詢哈希表

41、檢查是否有超時(shí)的客戶端節(jié)點(diǎn)delete把超時(shí)的客戶端踢下線并從哈希表中刪除4.2.6 客戶端類 client 4.2.6.1 成員變量(見表 11)表 11 client 類的主要成員變量變量名變量名變量類型變量類型成員變量描述成員變量描述socketsocket客戶端套接字4.2.6.2 方法(見表 12) 表 12 client 類的主要方法名稱名稱功能功能返回值返回值備注備注 main將套接字綁定服務(wù)器端的 ip 地址和端口號(hào)184.2.7 工作計(jì)時(shí)器類 mytask 4.2.7.1 成員變量(見表 13)表 13 mytask 類的主要成員變量變量名變量名變量類型變量類型可見性可見性變

42、量描述變量描述datastring客戶端要發(fā)送的信息socketsocket客戶端套接字outdataoutputstream輸出流 4.2.7.2 方法(見表 14)表 14 mytask 類的主要方法名稱名稱功能功能返回值返回值備注備注mytask初始化 socket構(gòu)造方法run向輸出流寫數(shù)據(jù)closesocket關(guān)閉輸出流和套接字釋放資源 接口方法5 結(jié)論:結(jié)論:本文對(duì) gprs 判斷 dtu 超時(shí)功能的開發(fā)過(guò)程進(jìn)行了詳細(xì)的分析說(shuō)明。本文遵循了“從當(dāng)前應(yīng)用的存在的問(wèn)題提出開發(fā)需求形成系統(tǒng)架構(gòu)具體功能實(shí)現(xiàn)”的流程來(lái)實(shí)現(xiàn)功能,此功能已經(jīng)通過(guò)實(shí)際測(cè)試,運(yùn)行良好,并得到應(yīng)用。本課題的創(chuàng)新點(diǎn):判

43、斷 gprs 判斷 dtu 超時(shí)功能的設(shè)計(jì),能夠使服務(wù)器更好得管理自己的內(nèi)存資源,并提高了通信穩(wěn)定性,具有很高的實(shí)用價(jià)值和經(jīng)濟(jì)價(jià)值。文章中采用哈希表存儲(chǔ) dtu 節(jié)點(diǎn),大大提高了服務(wù)器管理各 dtu 及自己資源的效率,并使用了同步鎖,在這多線程程序中很好得避免多條線程同時(shí)訪問(wèn)或修改哈希表等共享資源而產(chǎn)生的沖突。19本設(shè)計(jì)的不足:由于無(wú)法明確 dtu 的生產(chǎn)廠家所設(shè)計(jì)使用通信協(xié)議,故無(wú)法獲取dtu 在與 dsc 建立連接后發(fā)來(lái)的注冊(cè)包,因此服務(wù)器不好對(duì)各個(gè)與之建立連接的 dtu 做標(biāo)識(shí)。無(wú)奈之下,通過(guò)設(shè)置 dtu 的心跳包內(nèi)容,使之包含其對(duì)應(yīng)的 dtu 的身份信息,從而讓服務(wù)器提取并作為發(fā)送該心

44、跳包的 dtu 的身份標(biāo)識(shí)。主要參考文獻(xiàn)主要參考文獻(xiàn)1 印旻,王行言.java 語(yǔ)言與面向?qū)ο蟪绦蛟O(shè)計(jì)(第二版).北京:清華大學(xué)出版社,2007,11.2 黃曉東.java 課程設(shè)計(jì)案例精編m.北京:中國(guó)水利水電出版社,2004,5.3 陸遲.java 語(yǔ)言程序設(shè)計(jì)(第一版) m.北京:電子工業(yè)出版社,20024 張廣彬.java 課程設(shè)計(jì)案例精編(第二版) m.北京:清華大學(xué)出版社,2007致謝致謝隨著本科生活的臨近尾聲,五個(gè)月的畢業(yè)設(shè)計(jì)也將結(jié)束,我也順利的完成設(shè)計(jì)gprs 判斷 dtu 超時(shí)的功能。在開發(fā)設(shè)計(jì)的過(guò)程中,指導(dǎo)老師張武本著認(rèn)真負(fù)責(zé)的態(tài)度、以嚴(yán)謹(jǐn)求真的作風(fēng)來(lái)要求我們每一位學(xué)生,從

45、選題到研發(fā)到實(shí)現(xiàn),指導(dǎo)老師給予了我正確的指導(dǎo)和極大的幫助,使得我在設(shè)計(jì)當(dāng)中少走了很多彎路。還有學(xué)長(zhǎng)-胡鴻超,在編程設(shè)計(jì)過(guò)程,給予了我極大的幫助,從理論知識(shí)到實(shí)際操作都給我很大的支持,讓我從剛開始接到課題時(shí)一無(wú)所知到現(xiàn)在成功完成畢業(yè)設(shè)計(jì),我感到非常欣慰!在順利完成畢業(yè)設(shè)計(jì)的同時(shí)更讓我學(xué)到了許多知識(shí),對(duì)原有的理論知識(shí)能夠很好的與實(shí)際結(jié)合起來(lái)運(yùn)用,也大大的提高了我的編程能力,這使得我對(duì)以后的工作充滿了信心。 在此我由衷的向我的指導(dǎo)老師、學(xué)長(zhǎng)還有那些一起走過(guò)來(lái)的同學(xué)朋友們?cè)俅蔚卣f(shuō)一聲謝謝!今后我會(huì)以此次的畢業(yè)設(shè)計(jì)為起點(diǎn)邁向更遠(yuǎn)的未來(lái)。附錄附錄 1:node.javanode.javaimport .s

46、ocket;public class node private string data;20 private long time; private string ip; private int port; private socket socket; private char key; node() /構(gòu)造函數(shù) node(int port) this.port=port; public string getip() /處理 ip 地址 return ip; public void setip(string ip) this.ip = ip; public int getport() /處理端口

47、號(hào) return port; public void setport(int port) this.port=port; public long gettime() /處理時(shí)間 return time; public void settime(long time) this.time=time; public string getdata() /處理數(shù)據(jù) return data; public void setdata(string data) this.data=data; 21 public void setsocket(socket socket) /處理 socket 接口 this.

48、socket=socket; public socket getsocket() return socket; public char getkey() /處理鍵值 return key; public void setkey(char key) this.key = key; server.javaserver.javaimport java.applet.applet;import java.awt.button;import java.awt.color;import java.awt.flowlayout;import java.awt.label;import java.awt.te

49、xtarea;import java.awt.textfield;import java.awt.event.actionevent;import java.awt.event.actionlistener;import java.awt.event.focusevent;import java.awt.event.focuslistener;public class server extends appletstatic textarea ta;label lb1,lb2;textfield tf1,tf2;button btn;public void init()ta = new text

50、area(25,45);lb1=new label(請(qǐng)輸入 ip 地址:);22lb2=new label(請(qǐng)輸入端口號(hào):);tf1= new textfield(0.0.0.0,25);tf2 = new textfield(0,20);btn=new button(啟動(dòng));add(lb1);add(tf1);add(lb2);add(tf2);add(btn);add(ta);setlayout(new flowlayout();resize(400,500);setbackground(color.yellow);tf1.addfocuslistener(new handlefocus(

51、);tf2.addfocuslistener(new handlefocus();btn.addactionlistener(new handleact();class handleact implements actionlistenerstring ipp=null;int portt = 0;public void actionperformed(actionevent e)ipp=tf1.gettext();portt=integer.parseint(tf2.gettext();new thread(new startserver(ipp,portt).start();lookup

52、lk=new lookup();lk.start();23class handlefocus implements focuslistenerstring str;public void focusgained(focusevent e) public void focuslost(focusevent e) if(e.getsource()=tf1)str=tf1.gettext();if(str.equals(0.0.0.0)|str.length()7)tf1.requestfocus();tf1.settext(0.0.0.0 );elsestr=tf2.gettext();if(in

53、teger.parseint(str)=0)tf2.requestfocus();tf2.settext(0);startserver.javastartserver.javaimport java.io.ioexception;import .inetaddress;import .inetsocketaddress;import .serversocket;import .socket;import java.util.hashmap;class startserver implements runnable static hashmap hm = new hashmap(); 24 st

54、atic int num_thread = 0;/ 當(dāng)前的連接數(shù)(工作線程數(shù)) private serversocket ss; private static inetaddress addr; string ip; int port; startserver(string ip,int port)this.ip=ip;this.port=port; public void run() try addr =inetaddress.getbyname(ip) ; catch(exception e) e.printstacktrace(); ss = bind_port(port);/ 綁定端口

55、和 ip 地址 if (ss = null) server.ta.append(創(chuàng)建 serversocket 失??!n); return; while (true) socket socket = null; try socket = ss.accept(); workthread h=new workthread(socket); thread workthread = new thread(h); workthread.start(); catch (ioexception e) e.printstacktrace(); 25 /* * 創(chuàng)建一個(gè) serversocket 來(lái)偵聽用戶心跳

56、包請(qǐng)求 * */ public serversocket bind_port(int port) serversocket serversocket = null; try serversocket = new serversocket(); if (!serversocket.getreuseaddress() serversocket.setreuseaddress(true); serversocket.bind(new inetsocketaddress(addr, port); server.ta.append(啟動(dòng)服務(wù)器。 。 。 。 。 。 。n); server.ta.appe

57、nd(“開始在 + serversocket.getlocalsocketaddress()+ 上偵聽用戶的心跳包請(qǐng)求!n); catch (ioexception e) server.ta.append(端口 + port + 已經(jīng)被占用!n); if (serversocket != null) if (!serversocket.isclosed() try serversocket.close(); catch (ioexception e1) e1.printstacktrace(); return serversocket; 26workthread.javaworkthread.

58、javaimport java.io.datainputstream;import java.io.ioexception;import .socket;import java.sql.connection;import java.sql.drivermanager;import java.sql.sqlexception;import java.sql.statement;import java.text.simpledateformat;import java.util.date;class workthread implements runnable char ch; string da

59、ta; /string u1,u2,address; byte b; boolean flag=true; datainputstream in; node node = new node(); private socket socket; static object hashlock = new object();/鎖 /* * 構(gòu)造函數(shù),從調(diào)用者那里取得 socket * */ public workthread(socket socket) this.socket = socket; public void run() try server.ta.append(n 用戶已連接:+ soc

60、ket.getinetaddress() + : + socket.getport()+n);27 in = new datainputstream(socket.getinputstream(); while (true) b=new byte30; in.read(b); data = new string(b); if(flag) ch=data.charat(9); if(startserver.hm.containskey(ch) startserver.hm.remove(ch); node.setkey(ch); synchronized (hashlock) startserv

溫馨提示

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

評(píng)論

0/150

提交評(píng)論