基于java的判斷DTU超時(shí)功能的研究與設(shè)計(jì)設(shè)計(jì)_第1頁(yè)
基于java的判斷DTU超時(shí)功能的研究與設(shè)計(jì)設(shè)計(jì)_第2頁(yè)
基于java的判斷DTU超時(shí)功能的研究與設(shè)計(jì)設(shè)計(jì)_第3頁(yè)
基于java的判斷DTU超時(shí)功能的研究與設(shè)計(jì)設(shè)計(jì)_第4頁(yè)
基于java的判斷DTU超時(shí)功能的研究與設(shè)計(jì)設(shè)計(jì)_第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) 業(yè) 大 學(xué)畢 業(yè) 論 文(設(shè)計(jì))論文題目 基于java的判斷DTU超時(shí)功能的研究與設(shè)計(jì) 安徽農(nóng)業(yè)大學(xué)學(xué)士學(xué)位論文(設(shè)計(jì))開(kāi)題報(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)該值超過(guò)事先定值則斷開(kāi)用戶DTU與DSC數(shù)據(jù)中心的連接。3 對(duì)以上工作過(guò)程的需要進(jìn)行編程并進(jìn)行模擬測(cè)試。研究計(jì)劃3月初3月中 調(diào)

2、研、查資料。3月中4月初 研究并分析超時(shí)功能的作用及其應(yīng)用原理。4月中5月初 構(gòu)建系統(tǒng)框架,編程。5月初5月中 對(duì)系統(tǒng)進(jìn)行調(diào)試、運(yùn)行并修改。5月中 撰寫(xiě)畢業(yè)設(shè)計(jì)論文。特色與創(chuàng)新 系統(tǒng)穩(wěn)定,抗干擾能力強(qiáng) 應(yīng)用該功能可以節(jié)省不必要的流量花費(fèi)指導(dǎo)教師意見(jiàn)教研室意見(jiàn)學(xué)院意見(jiàn)基于java的農(nóng)業(yè)物聯(lián)網(wǎng)中間件的研究判斷DTU超時(shí)功能的研究和設(shè)計(jì)學(xué)生:詹步康 指導(dǎo)教師:張武(安徽農(nóng)業(yè)大學(xué) 信息與計(jì)算機(jī)學(xué)院 合肥 230036)摘要:本課程設(shè)計(jì)運(yùn)用了所學(xué)的Java語(yǔ)言基礎(chǔ)知識(shí),面向?qū)ο蟪绦蛟O(shè)計(jì)的基本思想、方法與技術(shù),網(wǎng)絡(luò)通信編程技術(shù)等開(kāi)發(fā)了簡(jiǎn)單應(yīng)用功能-基于java的農(nóng)業(yè)物聯(lián)網(wǎng)中間件的判斷DTU超時(shí)功能。詳細(xì)地

3、介紹了本課程設(shè)計(jì)運(yùn)用了所學(xué)的Java語(yǔ)言基礎(chǔ)知識(shí),面向?qū)ο蟪绦蛟O(shè)計(jì)的基本思想、方法與技術(shù),網(wǎng)絡(luò)通信編程技術(shù)等開(kāi)發(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ò)Socket建立連接,利用輸入輸出流透明傳送數(shù)據(jù)。服務(wù)器端程序主要包括節(jié)點(diǎn)類、工作線程類(接受并處理數(shù)據(jù)所用)、輪詢類等,以及用于存儲(chǔ)節(jié)點(diǎn)的哈希表、同步鎖和支持多客戶端的線程;客戶端程序主要有計(jì)時(shí)器類(每隔一定時(shí)間向服務(wù)器端發(fā)送一數(shù)據(jù)

4、)。關(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(School of Information & Computer, Anhui Agricultural University, hefei, 230036)Abstract:Things of agriculture based o

5、n 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 basic idea of object-oriented program design, method and technology, developed a simple application functions such as ne

6、twork communication programming technology, Internet of things of agriculture based on the Java middleware DTU timeout automatically break function. Agricultural iot were introduced in detail based on the Java middleware DTU timeout automatically disconnect function design method, gives the function

7、 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 connection is established, using the transparent transmission of data input and output flow. Server-side programs includin

8、g 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 client; Client program mainly include the timer class (sending a data at regular intervals to the server).Keywords:DTU;ti

9、meout ;polling目錄1 引言32.課題的總體目標(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ì)43.1 需求分析與設(shè)計(jì)思想:43.1.1 對(duì)判斷DTU超時(shí)功能的需求分析43.1.2 對(duì)判斷DTU超時(shí)功能的設(shè)計(jì)思想43.2設(shè)計(jì)時(shí)用到的重要的技術(shù)或數(shù)據(jù)結(jié)構(gòu)5同步鎖5哈希表7線程84 程序的詳細(xì)設(shè)計(jì)104.1程序流程圖104.2數(shù)據(jù)字典114.2.1 主類Server11啟動(dòng)服務(wù)器StartServer12節(jié)點(diǎn)類Node13工作線程WorkThread144.2.5 輪詢類LookU

10、p15客戶端類Client16工作計(jì)時(shí)器類MyTask165 結(jié)論:17主要參考文獻(xiàn)17致謝18附錄1:18附錄2312.1運(yùn)行結(jié)果及界面31啟動(dòng)服務(wù)器前: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è)備相連,然后和

11、后臺(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ā)送到管理中心的后端服務(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ù)傳輸,大大提高水文部門(mén)的工作效率,成為農(nóng)場(chǎng)主、農(nóng)業(yè)部門(mén)選擇的通信手段之一。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ù)中心,在

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

13、用這個(gè)功能可以使服務(wù)器很大程度上提高自己管理內(nèi)存資源的能力。此功能應(yīng)用于服務(wù)器后臺(tái)上,能比較理想得保證通訊連接的時(shí)效性,避免了那些空占其位,不盡其守的DTU。2.2 研究的主要內(nèi)容 2.2.1 下面就本課題所做的工作的主要內(nèi)容 1) 就具體的DTU設(shè)備進(jìn)行調(diào)研,找出其工作原理,以何種方式發(fā)送數(shù)據(jù)等等。2) 編寫(xiě)服務(wù)器端接受數(shù)據(jù)的程序,能夠從字節(jié)流里讀取數(shù)據(jù)。3) 編寫(xiě)服務(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í)功能的具體

14、設(shè)計(jì),詳細(xì)介紹了設(shè)計(jì)過(guò)程。第5章,針對(duì)本文的工作進(jìn)行了總結(jié)以及提出不足之處。3 總體設(shè)計(jì)3.1 需求分析與設(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ù),這些情況常見(jiàn)有:突然斷電、DTU本身電路故障、信號(hào)太弱、等等。服務(wù)器與眾多DTU通訊時(shí),可能某一DTU故障而無(wú)法向服務(wù)器發(fā)送數(shù)據(jù),此時(shí)服務(wù)器還在默默等待該DTU傳送的信息。大家都知道服務(wù)器根本接受不到該DTU發(fā)來(lái)的數(shù)據(jù),但是此時(shí)服務(wù)器還與該DTU連接著,占著服務(wù)器寶貴

15、的內(nèi)存資源雙方卻不能正常通訊,顯然這浪費(fèi)資源,要是眾多DTU都是這樣尸位素餐的話,總有某一刻服務(wù)器也被“卡死了”。所以為了消除這種隱患,迫切需要一種功能能夠準(zhǔn)確查出那些尸位素餐的DTU,然后把它們“踢下線”以釋放資源。3.1.2 對(duì)判斷DTU超時(shí)功能的設(shè)計(jì)思想 啟動(dòng)服務(wù)器,打開(kāi)了輪詢程序并啟動(dòng)了監(jiān)聽(tīng)程序,等候客戶端的連接。若有客戶端發(fā)來(lái)連接請(qǐng)求時(shí),服務(wù)器就專門(mén)為這個(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地址、連接端口號(hào)、向服務(wù)器發(fā)送的數(shù)據(jù)、該節(jié)點(diǎn)在哈希表中存放的位置(即:鍵值)以及最后一次與服務(wù)器

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

17、務(wù)器端發(fā)出連接請(qǐng)求但是輪詢尚未結(jié)束不能將新來(lái)的節(jié)點(diǎn)插入哈希表,所以要將輪詢代碼與向哈希表插入節(jié)點(diǎn)的代碼同步起來(lái)。同步分為 同步方法 和 同步塊 兩種方式。3. Synchronized 加在方法上, (同步方法,鎖定類實(shí)例)Java代碼public class Demo1            public synchronized void m1()        

18、     /.                  public void m2()             /.            &#

19、160; synchronized(this)                 /.                            /.  &

20、#160;               這兩種寫(xiě)法的效果是一樣的,鎖定的都是類實(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)閠hread1把de1這個(gè)對(duì)象的鎖使用了,所以無(wú)法分給其它線程使用。但是,如果threa

21、d1調(diào)用 de1.m1(), thread2調(diào)用 de2.m1(), 則可以同時(shí)進(jìn)行,因?yàn)樗鼈冋{(diào)用的是不同的Demo1類對(duì)象實(shí)例。3 Synchronized 加在變量上, (同步塊,鎖定類實(shí)例)Java代碼public class Demo2          Object a = new Object();         Object b =

22、 new Object();           public void m1()             /.               synchronized(a)  &#

23、160;              /.                            /.          

24、         public void m2()             /.             synchronized(b)           &

25、#160;     /.                           /.                   這種情況下,是實(shí)現(xiàn)代

26、碼塊鎖定,鎖定的對(duì)象是變量a 或 b; (注意:a 、b 都是非static 的)如果有一個(gè) 類實(shí)例: do = new Demo2(),另外有兩個(gè)線程:thread1,thread2,都調(diào)用了do 對(duì)象,那么,在同一時(shí)間,如果 thread1調(diào)用了do.m1(),則thread2在該時(shí)間內(nèi)可以訪問(wèn)do.m2();但不能訪問(wèn) do.m1() 的同步塊, 因?yàn)閍被 thread1鎖定了。若此代碼里a、b變量用static修飾,其鎖定的對(duì)象都是類Demo2,而不是類的實(shí)例,即在多線程中,其共享的資源是屬于類的,而不是屬于類對(duì)象的。在這種情況下,如果thread1 訪問(wèn)了這2個(gè)方法中的任何一個(gè), 在

27、同一時(shí)間內(nèi)其它任何線程都不能訪問(wèn) 這2個(gè)方法。3.2.2哈希表 3.2.2.1 哈希表的定義及其構(gòu)造方法哈希表是一種重要的存儲(chǔ)方式,也是一種常見(jiàn)的檢索方法,是基于哈希表的 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)行插入、刪除和解決沖突。

28、在Java中哈希表用于存儲(chǔ)對(duì)象,實(shí)現(xiàn)快速檢索。java.util.HashMap<K,V>提供了若干種方法讓用戶很方便地使用哈希表,而不需要考慮其真正如何工作的。哈希表類中提供了三種構(gòu)造方法,分別是:public HashMap ()public HashMap (int initialcapacity)public HashMap (int initialCapacity,float loadFactor)public HashMap(Map<? extends K,? extends V> m)參數(shù)initialCapacity是HashMap的初始容量,它的值應(yīng)大

29、于0。loadFactor又稱裝載因子,是一個(gè)0.0到0.1之間的float型的浮點(diǎn)數(shù)。它是一個(gè)百分比,表明了哈希表何時(shí)需要擴(kuò)充,例如,有一哈希表,容量為100,而裝載因子為0.9,那么當(dāng)哈希表90%的容量已被使用時(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 val

30、ue)如果此映射將一個(gè)或多個(gè)鍵映射到指定值,則返回 true。 public Set<K> keySet()返回此映射中所包含的鍵的 Set 視圖。該 set 受映射的支持,所以對(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 Collecti

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

32、ap.Entry<K,V>> entrySet()返回此映射所包含的映射關(guān)系的 Set 視圖。 該 set 受映射支持,所以對(duì)映射的更改將反映在此 set 中,反之亦然。如果在對(duì) set 進(jìn)行迭代的同時(shí)修改了映射(通過(guò)迭代器自己的 remove 操作,或者通過(guò)在該迭代器返回的映射項(xiàng)上執(zhí)行 setValue 操作除外),則迭代結(jié)果是不確定的。該 set 支持元素的移除,通過(guò) Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作可從該映射中移除相應(yīng)的映射關(guān)系。它不支持 add 或 addAll 操作。 刪除public

33、 V remove(Object key)從此映射中移除指定鍵的映射關(guān)系(如果存在)。 public void clear()從此映射中移除所有映射關(guān)系。此調(diào)用返回后,映射將為空。3.2.3線程3線程的設(shè)計(jì)在Java中,創(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. 通過(guò)Thread類實(shí)現(xiàn) 定義一個(gè)線程類,他繼承類Thread并重寫(xiě)其中的run()方法。

34、這時(shí)在初始化這個(gè)類的實(shí)例時(shí),目標(biāo)對(duì)象target可以為null,表示這個(gè)實(shí)例本身具有線程體。由于Java只支持單繼承,用這種方法定義的類不能再繼承其他類。Thread類定義的用來(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)行,出

35、于活動(dòng)狀態(tài)。 void stName(String threadName):改變線程的名字。 String getName():獲取由setName()方法實(shí)質(zhì)的線程名字的字符串。 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)Ru

36、nnable接口的方法創(chuàng)建每一個(gè)對(duì)象的線程。為實(shí)現(xiàn)Runnable接口,一個(gè)類僅需實(shí)現(xiàn)一個(gè)run()的簡(jiǎn)單方法。3.2.3.4 線程的生命周期 每個(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方法

37、之后,線程就進(jìn)入就緒狀態(tài),即被加入到處于就緒狀態(tài)的線程序列中,在等待CPU時(shí)間片。線程名.Start();3.2.3.7 運(yùn)行 當(dāng)處于線程序列中的線程獲得CPU時(shí)間片的時(shí)候,該線程就會(huì)自動(dòng)調(diào)用其run方法,進(jìn)入運(yùn)行狀態(tài)。4 程序的詳細(xì)設(shè)計(jì)4.1程序流程圖判斷DTU超時(shí)功能程序共有8個(gè)Java源文件。重要之間的關(guān)系如下圖; 圖2 類之間的關(guān)系Server.java該文件是java application程序,負(fù)責(zé)創(chuàng)建程序的主窗口。該類含有init方法,程序從該類開(kāi)始執(zhí)行。StartServer.java該文件生成的類負(fù)責(zé)將服務(wù)器端套接字綁定端口號(hào)和IP地址,啟動(dòng)服務(wù)器,建立監(jiān)聽(tīng)系統(tǒng)。當(dāng)有客戶端發(fā)

38、來(lái)連接請(qǐng)求時(shí)即建立連接,然后啟動(dòng)工作線程。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, 等輪

39、詢一周結(jié)束,用迭代器遍歷哈希表2將哈希表1中超時(shí)的客戶端節(jié)點(diǎn)踢下線并將其從哈希 表1中刪除。Client.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ù)字典4.2.1 主類Server4.2.1.1 成員變量(見(jiàn)表1)表1 Server類的主要成員變量(屬性)變量名變量類型可見(jiàn)性成員變量描述taTextArea文本區(qū)域lb1Label標(biāo)簽

40、lb2Label標(biāo)簽tf1TextField文本框tf2TextField文本框btnButton按鈕4.2.1.2 方法(見(jiàn)表2)表2 Server類的主要方法名稱功能返回值備注Server創(chuàng)建程序主窗口構(gòu)造方法actionPerformed處理ActionEvent事件接口方法init程序開(kāi)始運(yùn)行Applet程序從此處開(kāi)始運(yùn)行4.2.2啟動(dòng)服務(wù)器StartServer4.2.2.1成員變量(見(jiàn)表3)表3 StartServer類的主要成員變量變量名變量類型可見(jiàn)性成員變量描述hmHashMap哈希表num_Threadint當(dāng)前工作線程數(shù)ssServerSocket服務(wù)器套接字addrIne

41、tAddress服務(wù)器IP地址的InetAddress對(duì)象IpStringIP地址字符串形式portint端口號(hào)4.2.2.2方法(見(jiàn)表4)表4 StartServer類主要方法名稱功能返回值備注StartServer初始化IP地址和端口號(hào)構(gòu)造方法run線程的主部;建立服務(wù)器端的監(jiān)聽(tīng)機(jī)制,收到連接請(qǐng)求即建立連接并啟動(dòng)工作線程線程的run()bind_Port使服務(wù)器端綁定固定的IP地址和監(jiān)聽(tīng)端口號(hào)4.2.3節(jié)點(diǎn)類Node4.2.3.1 成員變量(見(jiàn)表5)表5 Node類的主要成員變量變量名變量類型可見(jiàn)性成員變量描述dataString記錄客戶端向服務(wù)器端發(fā)的數(shù)據(jù)timelong收到最后一條信息

42、時(shí)的時(shí)刻ipString客戶端的IP地址portint客戶端的端口號(hào)socketSocket客戶端套接字keyChar節(jié)點(diǎn)存入哈希表時(shí)的鍵值4.2.3.2 方法 (見(jiàn)表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)存儲(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)

43、存儲(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 成員變量(見(jiàn)表7)表7 WorkThread類的主要成員變量變量名變量類型可見(jiàn)性成員變量描述chChar客戶端發(fā)的心跳包的字符串信息的第九位字符dataString客戶端發(fā)來(lái)的信息bByte服務(wù)器端從輸入流讀取數(shù)據(jù)放入字節(jié)數(shù)組b中flagboolean用于標(biāo)記是否同一個(gè)客戶端向服務(wù)器端發(fā)信息nodeNodeNode類的實(shí)例,即客戶端節(jié)點(diǎn)socketSocket客戶端套接字hashLoc

44、kObject同步鎖4.2.4.2 方法(見(jiàn)表8)表8 WorkThread類的主要方法名稱功能返回值備注WorkThread初始化客戶端套接字socket構(gòu)造方法run工作線程主部,接受并處理客戶端發(fā)向服務(wù)器端的信息4.2.5 輪詢類LookUp 4.2.5.1 成員變量(見(jiàn)表9)表9 LookUp類的主要成員變量變量名變量類型可見(jiàn)性成員變量描述now_Datelong開(kāi)始輪詢時(shí)的時(shí)間last_Datelong客戶端最后一次與服務(wù)器端通訊時(shí)的時(shí)間nodeNode輪詢期間,代表所檢查時(shí)間的當(dāng)前節(jié)點(diǎn)node2Node輪詢后,代表所檢查出超時(shí)的節(jié)點(diǎn)hm2HashMap存儲(chǔ)輪詢期間檢查出超時(shí)的節(jié)點(diǎn)i

45、tIterator哈希表1的迭代器it2Iterator哈希表2的迭代器 4.2.5.2 方法(見(jiàn)表10)表10 LookUp類的主要方法名稱功能返回值備注run線程的run方法chaXun輪詢哈希表檢查是否有超時(shí)的客戶端節(jié)點(diǎn)delete把超時(shí)的客戶端踢下線并從哈希表中刪除4.2.6客戶端類Client 4.2.6.1 成員變量(見(jiàn)表11)表11 Client類的主要成員變量變量名變量類型成員變量描述socketSocket客戶端套接字4.2.6.2 方法(見(jiàn)表12) 表12 Client類的主要方法名稱功能返回值備注 main將套接字綁定服務(wù)器端的IP地址和端口號(hào)4.2.7工作計(jì)時(shí)器類MyT

46、ask 4.2.7.1 成員變量(見(jiàn)表13)表13 MyTask類的主要成員變量變量名變量類型可見(jiàn)性變量描述dataString客戶端要發(fā)送的信息socketSocket客戶端套接字outDataOutputStream輸出流 4.2.7.2 方法(見(jiàn)表14)表14 MyTask類的主要方法名稱功能返回值備注MyTask初始化socket構(gòu)造方法run向輸出流寫(xiě)數(shù)據(jù)closeSocket關(guān)閉輸出流和套接字釋放資源 接口方法5 結(jié)論:本文對(duì)GPRS 判斷DTU超時(shí)功能的開(kāi)發(fā)過(guò)程進(jìn)行了詳細(xì)的分析說(shuō)明。本文遵循了“從當(dāng)前應(yīng)用的存在的問(wèn)題>提出開(kāi)發(fā)需求>形成系統(tǒng)架構(gòu)>具體功能實(shí)現(xiàn)”的

47、流程來(lái)實(shí)現(xiàn)功能,此功能已經(jīng)通過(guò)實(shí)際測(cè)試,運(yùn)行良好,并得到應(yīng)用。本課題的創(chuàng)新點(diǎn):判斷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)生的沖突。本設(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的

48、身份信息,從而讓服務(wù)器提取并作為發(fā)送該心跳包的DTU的身份標(biāo)識(shí)。主要參考文獻(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í)的功能。在開(kāi)發(fā)設(shè)計(jì)的過(guò)程中,指導(dǎo)老師張武本著認(rèn)真負(fù)責(zé)的態(tài)度、以嚴(yán)謹(jǐn)求真的作風(fēng)來(lái)要求我們每一位學(xué)生

49、,從選題到研發(fā)到實(shí)現(xiàn),指導(dǎo)老師給予了我正確的指導(dǎo)和極大的幫助,使得我在設(shè)計(jì)當(dāng)中少走了很多彎路。還有學(xué)長(zhǎng)-胡鴻超,在編程設(shè)計(jì)過(guò)程,給予了我極大的幫助,從理論知識(shí)到實(shí)際操作都給我很大的支持,讓我從剛開(kāi)始接到課題時(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.javaimport .Socket

50、;public class Node private String data; 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() /處理端口號(hào) return

51、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; public void setSocket(Socket socket) /處理Socket接口 this.socket=socket;

52、 public Socket getSocket() return socket; public char getkey() /處理鍵值 return key; public void setkey(char key) this.key = key; Server.javaimport java.applet.Applet;import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.Label;import java.awt.TextArea;import java.awt.Te

53、xtField;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 TextArea(25,45);lb1=new Label

54、("請(qǐng)輸入IP地址:");lb2=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.ad

55、dFocusListener(new HandleFocus();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 StartSe

56、rver(Ipp,portt).start();LookUp lk=new LookUp();lk.start();class 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(Integer.parseInt(str)=0)tf2.requestFocus();tf2.setText("0");StartServer.javaimport java.io.IOException;import .InetAddr

溫馨提示

  • 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)論