版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 PAGE35 / NUMPAGES36 安 徽 农 业 大 学毕 业 论 文(设计)论文题目 基于java的判断DTU超时功能的研究与设计农业大学学士学位论文(设计)开题报告课题名称基于java的农业物联网中间件的判断DTU超时功能的研究和设计课题来源导师指定学生专业通信工程学号指导教师职称副教授研究容研究分析DTU超时功能的作用。对DTU超时功能的应用原理进行分析:1)DSC启动定时器轮询并获取用户最后一次与DSC通讯的时间。2)获取当前时间并与最后一次登录时间比较,取其差值。3)该值超过事先定值则断开用户DTU与DSC数据中心的连接。对以上工作过程的需要进行编程并进行模拟测试。研究计划3
2、月初3月中 调研、查资料。3月中4月初 研究并分析超时功能的作用与其应用原理。4月中5月初 构建系统框架,编程。5月初5月中 对系统进行调试、运行并修改。5月中 撰写毕业设计论文。特色与创新系统稳定,抗干扰能力强应用该功能可以节省不必要的流量花费指导教师意见教研室意见学院意见基于java的农业物联网中间件的研究判断DTU超时功能的研究和设计学生:詹步康 指导教师:武(农业大学 信息与计算机学院 230036)摘要:本课程设计运用了所学的Java语言基础知识,面向对象程序设计的基本思想、方法与技术,网络通信编程技术等开发了简单应用功能-基于java的农业物联网中间件的判断DTU超时功能。详细地介
3、绍了本课程设计运用了所学的Java语言基础知识,面向对象程序设计的基本思想、方法与技术,网络通信编程技术等开发了简单应用功能-基于java的农业物联网中间件的判断DTU超时功能。详细地介绍了基于java的农业物联网中间件的判断DTU超时功能的设计方法,给出了该功能的java程序设计,该程序可直接用作服务器端程序,接受并处理数据。服务器端数据中心与客户端DTU通过Socket建立连接,利用输入输出流透明传送数据。服务器端程序主要包括节点类、工作线程类(接受并处理数据所用)、轮询类等,以与用于存储节点的哈希表、同步锁和支持多客户端的线程;客户端程序主要有计时器类(每隔一定时间向服务器端发送一数据)
4、。关键词:DTU;超时;轮询Java-based Research ofInternet of Things of Agriculture MiddlewareResearch and Design of Judgment of DTU Timeout Function Student: zhan bu kang teachers: Zhang Wu(School of Information & Computer,AnhuiAgriculturalUniversity,hefei,230036)Abstract:Things of agriculture based on the Java
5、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 network commu
6、nication 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 of the Jav
7、a 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 including the node
8、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;timeout ;poll
9、ing目录 TOC o 1-3 h z u HYPERLINK l _Toc3563291621 引言 PAGEREF _Toc356329162 h 3HYPERLINK l _Toc3563291632.课题的总体目标与主要研究容 PAGEREF _Toc356329163 h 4HYPERLINK l _Toc3563291642.1 课题的总体目标 PAGEREF _Toc356329164 h 4HYPERLINK l _Toc3563291652.2 研究的主要容 PAGEREF _Toc356329165 h 4HYPERLINK l _Toc3563291662.2.1 下面就
10、本课题所做的工作的主要容 PAGEREF _Toc356329166 h 4HYPERLINK l _Toc3563291672.2.2 本论文的章节安排 PAGEREF _Toc356329167 h 4HYPERLINK l _Toc3563291683 总体设计 PAGEREF _Toc356329168 h 4HYPERLINK l _Toc3563291693.1 需求分析与设计思想: PAGEREF _Toc356329169 h 4HYPERLINK l _Toc3563291703.1.1 对判断DTU超时功能的需求分析 PAGEREF _Toc356329170 h 4HYP
11、ERLINK l _Toc3563291713.1.2 对判断DTU超时功能的设计思想 PAGEREF _Toc356329171 h 4HYPERLINK l _Toc3563291723.2设计时用到的重要的技术或数据结构 PAGEREF _Toc356329172 h 5HYPERLINK l _Toc3563291733.2.1同步锁 PAGEREF _Toc356329173 h 5HYPERLINK l _Toc3563291743.2.2哈希表 PAGEREF _Toc356329174 h 7HYPERLINK l _Toc3563291753.2.3线程 PAGEREF _T
12、oc356329175 h 8HYPERLINK l _Toc3563291764 程序的详细设计 PAGEREF _Toc356329176 h 10HYPERLINK l _Toc3563291774.1程序流程图 PAGEREF _Toc356329177 h 10HYPERLINK l _Toc3563291784.2数据字典 PAGEREF _Toc356329178 h 11HYPERLINK l _Toc3563291794.2.1 主类Server PAGEREF _Toc356329179 h 11HYPERLINK l _Toc3563291804.2.2启动服务器Star
13、tServer PAGEREF _Toc356329180 h 12HYPERLINK l _Toc3563291814.2.3节点类Node PAGEREF _Toc356329181 h 13HYPERLINK l _Toc3563291824.2.4工作线程WorkThread PAGEREF _Toc356329182 h 14HYPERLINK l _Toc3563291834.2.5 轮询类LookUp PAGEREF _Toc356329183 h 15HYPERLINK l _Toc3563291844.2.6客户端类Client PAGEREF _Toc356329184 h
14、 16HYPERLINK l _Toc3563291854.2.7工作计时器类MyTask PAGEREF _Toc356329185 h 16HYPERLINK l _Toc3563291865 结论: PAGEREF _Toc356329186 h 17HYPERLINK l _Toc356329187主要参考文献 PAGEREF _Toc356329187 h 17HYPERLINK l _Toc356329188致 PAGEREF _Toc356329188 h 18HYPERLINK l _Toc356329189附录1: PAGEREF _Toc356329189 h 18HYPE
15、RLINK l _Toc356329190附录2 PAGEREF _Toc356329190 h 31HYPERLINK l _Toc3563291912.1运行结果与界面 PAGEREF _Toc356329191 h 31HYPERLINK l _Toc3563291922.1.1启动服务器前: PAGEREF _Toc356329192 h 31HYPERLINK l _Toc3563291932.1.2启动服务器但不启动客户端: PAGEREF _Toc356329193 h 32HYPERLINK l _Toc3563291942.1.3启动服务器并启动多个客户端: PAGEREF
16、_Toc356329194 h 33HYPERLINK l _Toc3563291952.1.4 启动服务器并启动多个客户端最后关闭全部客户端: PAGEREF _Toc356329195 h 341 引言随着经济社会的不断发展和进步,无线通信技术在人们生活中已变得愈发重要,受到广泛运用。应用了无线通信技术的GPRS DTU遍布了人类生活各个领域,被广泛应用于电力、水利、市政、交通、金融、环境监测、农业等行业领域。尽管应用的行业不同,但应用的原理是一样的,大都是DTU和行业设备相连,然后和后台建立无线的通信连接。在农业监测系统中,常常需要对众多农业园的CO2浓度,光照强度,土壤酸碱度等进行实时
17、监测,大部分监测数据需要实时发送到管理中心的后端服务器进行处理。由于监测点分散,分布围广,而且大多设置在环境较恶劣的地区,通过线传送数据往往事倍功半。通过GPRS无线网络进行数据传输,大大提高水文部门的工作效率,成为农场主、农业部门选择的通信手段之一。DTU嵌了TCP/IP协议栈,具有Socket通讯功能,并提供透明数据传输通道,用户只需设置一些参数就可实现将嵌入式系统直接与Internet相连,实现网络的互连互通。DTU的主要功能是把远端设备的数据通过无线的方式传送到数据中心,在传送数据之前,DTU需要与服务器端数据中心建立无线连接。服务器端监控中心的Socket端口监听程序负责监听采集终端
18、的连接请求,当监听到连接请求后,建立通信链路,原来负责监听Socket仍进行监听,通信链路建立后就可任意交换数据了。当DTU长时间没有发送数据到数据中心时,那么数据中心就认为该DTU已掉线并断开与该DTU的连接。判断DTU超时功能是DTU众多功能之一,作用就是帮助数据中心与时发现那些不传送数据却仍然连接占用大量资源的DTU,以便让有限的存资源得到最大化利用。图1 DTU与其使用示例2.课题的总体目标与主要研究容2.1 课题的总体目标本课题的目标是,实现个判断DTU超时的功能,使用这个功能可以使服务器很大程度上提高自己管理存资源的能力。此功能应用于服务器后台上,能比较理想得保证通讯连接的时效性,
19、避免了那些空占其位,不尽其守的DTU。2.2 研究的主要容2.2.1 下面就本课题所做的工作的主要容 1) 就具体的DTU设备进行调研,找出其工作原理,以何种方式发送数据等等。2) 编写服务器端接受数据的程序,能够从字节流里读取数据。3) 编写服务器端轮询程序,能够每隔一段时间检查一次各客户端是否掉线。2.2.2 本论文的章节安排 第2章,提出了课题的总体目标与主要研究容;第3章,对判断DTU超时功能的总体设计,对设计有个宏观把握;第4章,对判断DTU超时功能的具体设计,详细介绍了设计过程。第5章,针对本文的工作进行了总结以与提出不足之处。3 总体设计3.1 需求分析与设计思想:3.1.1 对
20、判断DTU超时功能的需求分析在互联网日益发展的今天,DTU的使用也越来越广泛,为各行业之间的信息、产业融合提供了帮助。可往往运用DTU的过程中难免会遇到令人不快的情况使得DTU无常向服务器发送数据,这些情况常见有:突然断电、DTU本身电路故障、信号太弱、等等。服务器与众多DTU通讯时,可能某一DTU故障而无法向服务器发送数据,此时服务器还在默默等待该DTU传送的信息。大家都知道服务器根本接受不到该DTU发来的数据,但是此时服务器还与该DTU连接着,占着服务器宝贵的存资源双方却不能正常通讯,显然这浪费资源,要是众多DTU都是这样尸位素餐的话,总有某一刻服务器也被“卡死了”。所以为了消除这种隐患,
21、迫切需要一种功能能够准确查出那些尸位素餐的DTU,然后把它们“踢下线”以释放资源。3.1.2 对判断DTU超时功能的设计思想 启动服务器,打开了轮询程序并启动了监听程序,等候客户端的连接。若有客户端发来连接请求时,服务器就专门为这个客户端启动一个线程来接受并处理该客户端发来的数据;另外服务器会创建个节点来代表该客户端,并将该节点存在哈希表中。节点里封装有客户端的IP地址、连接端口号、向服务器发送的数据、该节点在哈希表中存放的位置(即:键值)以与最后一次与服务器通讯时的时间(客户端向服务器发送一次数据,该时间即更新一次)。 轮询程序启动以后,会每隔一段时间轮询一次哈希表,对里面存储的客户端节点中
22、的时间进行检查,若其大于指定值则默认该客户端节点已故障,将与其断开连接。3.2设计时用到的重要的技术或数据结构3.2.1同步锁当我们用多线程访问或修改同一共享资源时,可能会引起线程间的冲突,因此引入线程同步机制,来让先到的线程率先访问或修改该共享资源而在这一线程对共享资源的访问或修改还没有结束之前,任何要访问或修改该共享资源的线程都必须等待,这样就很好得解决了线程间的并发问题。 本设计中轮询机制的代码在访问或删除哈希表中的客户端节点时,必须考虑到此时可能有新的客户端向服务器端发出连接请求但是轮询尚未结束不能将新来的节点插入哈希表,所以要将轮询代码与向哈希表插入节点的代码同步起来。同步分为 同步
23、方法 和 同步块 两种方式。3.2.1.1Synchronized 加在方法上, (同步方法,锁定类实例)Java代码publicclassDemo1 publicsynchronizedvoidm1() / publicvoidm2() / synchronized(this) / / 这两种写法的效果是一样的,锁定的都是类实例。如果有两个 类实例: de1 = new Demo1(),de2 = new Demo1(),另外有两个线程: thread1,thread2,都调用了de1 对象,那么,在同一时间,如果 thread1调用了de1.m1(),则thread2在该时间不能访问de1
24、.m1() 和 de1.m2(); 因为thread1把de1这个对象的锁使用了,所以无法分给其它线程使用。但是,如果thread1调用 de1.m1(), thread2调用 de2.m1(), 则可以同时进行,因为它们调用的是不同的Demo1类对象实例。3.2.1.1 Synchronized 加在变量上, (同步块,锁定类实例)Java代码publicclassDemo2 Objecta=newObject(); Objectb=newObject(); publicvoidm1() / synchronized(a) / / publicvoidm2() / synchronized(
25、b) / / 这种情况下,是实现代码块锁定,锁定的对象是变量a 或 b; (注意:a 、b 都是非static 的)如果有一个 类实例: do = new Demo2(),另外有两个线程:thread1,thread2,都调用了do 对象,那么,在同一时间,如果 thread1调用了do.m1(),则thread2在该时间可以访问do.m2();但不能访问 do.m1() 的同步块, 因为a被 thread1锁定了。若此代码里a、b变量用static修饰,其锁定的对象都是类Demo2,而不是类的实例,即在多线程中,其共享的资源是属于类的,而不是属于类对象的。在这种情况下,如果thread1 访
26、问了这2个方法中的任何一个, 在同一时间其它任何线程都不能访问 这2个方法。3.2.2哈希表3.2.2.1 哈希表的定义与其构造方法哈希表是一种重要的存储方式,也是一种常见的检索方法,是基于 HYPERLINK :/baike.baidu /view/329976.htm t _blank 哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致一样。其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入
27、计算得到存储地址所对应的存储单元。检索时采用检索关键码的方法寻找对应的节点。现在哈希表有一套完整的算法来进行插入、删除和解决冲突。在Java中哈希表用于存储对象,实现快速检索。java.util.HashMap提供了若干种方法让用户很方便地使用哈希表,而不需要考虑其真正如何工作的。哈希表类中提供了三种构造方法,分别是:public HashMap ()public HashMap (int initialcapacity)public HashMap (int initialCapacity,float loadFactor)public HashMap( HYPERLINK mk:MSITS
28、tore:C:UsersAdministratorDesktopJDK1.6%20API帮助文档.CHM:/java/util/Map.html o java.util 中的接口 Map m)参数initialCapacity是HashMap的初始容量,它的值应大于0。loadFactor又称装载因子,是一个0.0到0.1之间的float型的浮点数。它是一个百分比,表明了哈希表何时需要扩充,例如,有一哈希表,容量为100,而装载因子为0.9,那么当哈希表90%的容量已被使用时,此哈希表会自动扩充成一个更大的哈希表。如果用户不赋这些参数,系统会自动进行处理,而不需要用户操心。3.2.2.2 Ha
29、shMap提供了基本的插入、检索等方法。插入public HYPERLINK mk:MSITStore:C:UsersAdministratorDesktopJDK1.6%20API帮助文档.CHM:/java/util/HashMap.html o HashMap 中的类型参数 V put( HYPERLINK mk:MSITStore:C:UsersAdministratorDesktopJDK1.6%20API帮助文档.CHM:/java/util/HashMap.html o HashMap 中的类型参数 K key, HYPERLINK mk:MSITStore:C:UsersAdm
30、inistratorDesktopJDK1.6%20API帮助文档.CHM:/java/util/HashMap.html o HashMap 中的类型参数 V value)在此映射中关联指定值与指定键。如果该映射以前包含了一个该键的映射关系,则旧值被替换。检索public boolean containsValue( HYPERLINK mk:MSITStore:C:UsersAdministratorDesktopJDK1.6%20API帮助文档.CHM:/java/lang/Object.html o java.lang 中的类 Object value)如果此映射将一个或多个键映射到指
31、定值,则返回 true。public HYPERLINK mk:MSITStore:C:UsersAdministratorDesktopJDK1.6%20API帮助文档.CHM:/java/util/Set.html o java.util 中的接口 Set keySet()返回此映射中所包含的键的 HYPERLINK mk:MSITStore:C:UsersAdministratorDesktopJDK1.6%20API帮助文档.CHM:/java/util/Set.html o java.util 中的接口 Set 视图。该 set 受映射的支持,所以对映射的更改将反映在该 set 中,
32、反之亦然。如果在对 set 进行迭代的同时修改了映射(通过迭代器自己的 remove 操作除外),则迭代结果是不确定的。该 set 支持元素的移除,通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作可从该映射中移除相应的映射关系。它不支持 add 或 addAll 操作。public HYPERLINK mk:MSITStore:C:UsersAdministratorDesktopJDK1.6%20API帮助文档.CHM:/java/util/Collection.html o java.util 中的接口 Collect
33、ion values()返回此映射所包含的值的 HYPERLINK mk:MSITStore:C:UsersAdministratorDesktopJDK1.6%20API帮助文档.CHM:/java/util/Collection.html o java.util 中的接口 Collection 视图。该 collection 受映射的支持,所以对映射的更改将反映在该 collection 中,反之亦然。如果在对 collection 进行迭代的同时修改了映射(通过迭代器自己的 remove 操作除外),则迭代结果是不确定的。该collection 支持元素的移除,通过 Iterator.r
34、emove、Collection.remove、removeAll、retainAll 和 clear 操作可从该映射中移除相应的映射关系。它不支持 add 或 addAll 操作。 public HYPERLINK mk:MSITStore:C:UsersAdministratorDesktopJDK1.6%20API帮助文档.CHM:/java/util/Set.html o java.util 中的接口 Set HYPERLINK mk:MSITStore:C:UsersAdministratorDesktopJDK1.6%20API帮助文档.CHM:/java/util/Map.Ent
35、ry.html o java.util 中的接口 Map.Entry entrySet()返回此映射所包含的映射关系的 HYPERLINK mk:MSITStore:C:UsersAdministratorDesktopJDK1.6%20API帮助文档.CHM:/java/util/Set.html o java.util 中的接口 Set 视图。 该 set 受映射支持,所以对映射的更改将反映在此 set 中,反之亦然。如果在对 set 进行迭代的同时修改了映射(通过迭代器自己的 remove 操作,或者通过在该迭代器返回的映射项上执行 setValue 操作除外),则迭代结果是不确定的。该
36、 set 支持元素的移除,通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作可从该映射中移除相应的映射关系。它不支持 add 或 addAll 操作。 删除public HYPERLINK mk:MSITStore:C:UsersAdministratorDesktopJDK1.6%20API帮助文档.CHM:/java/util/HashMap.html o HashMap 中的类型参数 V remove( HYPERLINK mk:MSITStore:C:UsersAdministratorDesktopJDK1.6%2
37、0API帮助文档.CHM:/java/lang/Object.html o java.lang 中的类 Object key)从此映射中移除指定键的映射关系(如果存在)。 public void clear()从此映射中移除所有映射关系。此调用返回后,映射将为空。3.2.3线程3.2.3.1线程的设计在Java中,创建线程的方法有两种:一种是通过创建Thread类的子类来实现;另一种是通过实现Runnable接口的类来实现。这两种创建线程方法并没有本质上的区别,但是由于Java不允许多重继承,所以当一个类要继承另一个非Thread类而实现多线程的话,只能通过实现Runnable接口的方式来实现
38、。3.2.3.2 通过Thread类实现 定义一个线程类,他继承类Thread并重写其中的run()方法。这时在初始化这个类的实例时,目标对象target可以为null,表示这个实例本身具有线程体。由于Java只支持单继承,用这种方法定义的类不能再继承其他类。Thread类定义的用来帮助管理线程的方法主要包括以下容 : void run()方法:线程的入口点,运行线程中的代码。 void start()方法:通过调用运行方法来启动线程,使之由出生状态转入就绪状态。void sleep(long milis):在一段时间挂起线程,令线程睡眠,在此期间,线程不消耗CPU资源;以毫秒为单位。 voi
39、d interrupt():中断线程。 boolean isAlive():判定线程是否仍在在运行,出于活动状态。 void stName(String threadName):改变线程的名字。 String getName():获取由setName()方法实质的线程名字的字符串。Yield():将CPU控制权主动移交到下一个可运行的线程。 setPriority(int p):设置线程优先级。 getPriority():获得线程优先级。Join():等待一个线程终止。3.2.3.3 实现Runnable接口创建线程的最简单的方法就是创建一个实现Runnable接口的类。然后根据工作需要重新
40、设计线程的run方法;再建立该类的对象。Runnable抽象了一个执行代码单元。你可以通过实现Runnable接口的方法创建每一个对象的线程。为实现Runnable接口,一个类仅需实现一个run()的简单方法。3.2.3.4 线程的生命周期 每个线程的生命周期一共包括5种状态:出生,就绪,运行,阻塞和死亡。线程从出生到死亡的过程称为线程的生命周期。通过特定的操作可以进行状态间的转换。3.2.3.5 出生当用关键字new和thread类或其子类建立了一个线程对象后,该线程就处于出生状态。 Thread 线程名=new Thread();处于新建状态的线程只是一个空闲的线程对象,系统并没有为他分配
41、资源。在调用start方法之前,线程就一直处于出生状态。3.2.3.6 就绪在调用了start方法之后,线程就进入就绪状态,即被加入到处于就绪状态的线程序列中,在等待CPU时间片。线程名.Start();3.2.3.7 运行 当处于线程序列中的线程获得CPU时间片的时候,该线程就会自动调用其run方法,进入运行状态。4 程序的详细设计4.1程序流程图判断DTU超时功能程序共有8个Java源文件。重要之间的关系如下图;图2 类之间的关系Server.java该文件是java application程序,负责创建程序的主窗口。该类含有init方法,程序从该类开始执行。StartServer.jav
42、a该文件生成的类负责将服务器端套接字绑定端口号和IP地址,启动服务器,建立监听系统。当有客户端发来连接请求时即建立连接,然后启动工作线程。Node.java该文件生成的类的对象代表一个客户端节点,节点里存储着客户端发向服务器端的信息、客户端最后一次与服务器端通讯的时间、客户端的IP地址和端口号、客户端套接字以与该节点在哈希表中所对应的键值。WorkThread.java该文件生成的类负责创建工作线程。接受并处理客户端发向服务器端的数据。每接受一次数据,都要根据该数据对这个工作线程对应的客户端节点里的信息进行更新。LookUp.java该文件生成的类负责对哈希表1中各客户端节点最后一次与服务器端
43、通讯的时间进行检查。 使用迭代器遍历哈希表1,查出超时的客户端节点便将其键值放入哈希表2, 等轮询一周结束,用迭代器遍历哈希表2将哈希表1中超时的客户端节点踢下线并将其从哈希 表1中删除。Client.java(测试类)该文件生成的类负责向服务器端发送数据。首先在其主函数过构造函数 HYPERLINK mk:MSITStore:C:UsersAdministratorDesktopJDK1.6%20API帮助文档.CHM:/java/net/Socket.html l Socket(.InetAddress, int) Socket( HYPERLINK mk:MSITStore:C:User
44、sAdministratorDesktopJDK1.6%20API帮助文档.CHM:/java/net/InetAddress.html o 中的类 InetAddress address, int port)绑定服务器端的地址和端口号,然后启动定时器。MyTask.java(测试类)该文件主要负责创建一个定时器,每隔一定时间向服务器端发送数据。4.2数据字典4.2.1 主类Server4.2.1.1 成员变量(见表1)表1 Server类的主要成员变量(属性)变量名变量类型可见性成员变量描述taTextArea文本区域lb1Label标签lb2Label标签tf1TextField文本框tf
45、2TextField文本框btnButton按钮4.2.1.2 方法(见表2)表2 Server类的主要方法名称功能返回值备注Server创建程序主窗口构造方法actionPerformed处理ActionEvent事件接口方法init程序开始运行Applet程序从此处开始运行4.2.2启动服务器StartServer4.2.2.1成员变量(见表3)表3 StartServer类的主要成员变量变量名变量类型可见性成员变量描述hmHashMap哈希表num_Threadint当前工作线程数ssServerSocket服务器套接字addrInetAddress服务器IP地址的InetAddress
46、对象IpStringIP地址字符串形式portint端口号4.2.2.2方法(见表4)表4 StartServer类主要方法名称功能返回值备注StartServer初始化IP地址和端口号构造方法run线程的主部;建立服务器端的监听机制,收到连接请求即建立连接并启动工作线程线程的run()bind_Port使服务器端绑定固定的IP地址和监听端口号4.2.3节点类Node4.2.3.1 成员变量(见表5)表5 Node类的主要成员变量变量名变量类型可见性成员变量描述dataString记录客户端向服务器端发的数据timelong收到最后一条信息时的时刻ipString客户端的IP地址portint
47、客户端的端口号socketSocket客户端套接字keyChar节点存入哈希表时的键值4.2.3.2 方法 (见表6)表6 Node类的主要方法名称功能返回值备注Node创建客户端节点构造方法getIP获取节点存储的客户端IP地址IP是String类型setIP设置IP地址值getPort获取节点存储的客户端端口号setPort设置客户端端口号getTime获取节点存储的服务器与客户端最后一次通讯的时间setTime更新某节点存储的服务器与客户端最后一次通讯的时刻getData获取节点存储的客户端发来的信息setData更新节点存储的客户端发来的信息getSocket获取节点存储的客户端套se
48、tSocket更新节点存储的客户端套接字getkey获取哈希表存储的该节点对应的键值4.2.4工作线程WorkThread 4.2.4.1 成员变量(见表7)表7 WorkThread类的主要成员变量变量名变量类型可见性成员变量描述chChar客户端发的心跳包的字符串信息的第九位字符dataString客户端发来的信息bByte服务器端从输入流读取数据放入字节数组b中flagboolean用于标记是否同一个客户端向服务器端发信息nodeNodeNode类的实例,即客户端节点socketSocket客户端套接字hashLockObject同步锁4.2.4.2 方法(见表8)表8 WorkThre
49、ad类的主要方法名称功能返回值备注WorkThread初始化客户端套接字socket构造方法run工作线程主部,接受并处理客户端发向服务器端的信息4.2.5 轮询类LookUp 4.2.5.1 成员变量(见表9)表9 LookUp类的主要成员变量变量名变量类型可见性成员变量描述now_Datelong开始轮询时的时间last_Datelong客户端最后一次与服务器端通讯时的时间nodeNode轮询期间,代表所检查时间的当前节点node2Node轮询后,代表所检查出超时的节点hm2HashMap存储轮询期间检查出超时的节点itIterator哈希表1的迭代器it2Iterator哈希表2的迭代器
50、 4.2.5.2 方法(见表10)表10 LookUp类的主要方法名称功能返回值备注run线程的run方法chaXun轮询哈希表检查是否有超时的客户端节点delete把超时的客户端踢下线并从哈希表中删除4.2.6客户端类Client 4.2.6.1 成员变量(见表11)表11 Client类的主要成员变量变量名变量类型成员变量描述socketSocket客户端套接字4.2.6.2 方法(见表12)表12 Client类的主要方法名称功能返回值备注 main将套接字绑定服务器端的IP地址和端口号4.2.7工作计时器类MyTask 4.2.7.1 成员变量(见表13)表13 MyTask类的主要成
51、员变量变量名变量类型可见性变量描述dataString客户端要发送的信息socketSocket客户端套接字outDataOutputStream输出流4.2.7.2 方法(见表14)表14 MyTask类的主要方法名称功能返回值备注MyTask初始化socket构造方法run向输出流写数据closeSocket关闭输出流和套接字释放资源 接口方法5 结论:本文对GPRS 判断DTU超时功能的开发过程进行了详细的分析说明。本文遵循了“从当前应用的存在的问题提出开发需求形成系统架构具体功能实现”的流程来实现功能,此功能已经通过实际测试,运行良好,并得到应用。本课题的创新点:判断GPRS 判断DT
52、U超时功能的设计,能够使服务器更好得管理自己的存资源,并提高了通信稳定性,具有很高的实用价值和经济价值。文章中采用哈希表存储DTU节点,大大提高了服务器管理各DTU与自己资源的效率,并使用了同步锁,在这多线程程序中很好得避免多条线程同时访问或修改哈希表等共享资源而产生的冲突。本设计的不足:由于无法明确DTU的生产厂家所设计使用通信协议,故无法获取DTU在与DSC建立连接后发来的注册包,因此服务器不好对各个与之建立连接的DTU做标识。无奈之下,通过设置DTU的心跳包容,使之包含其对应的DTU的身份信息,从而让服务器提取并作为发送该心跳包的DTU的身份标识。主要参考文献1 印旻,王行言.Java语
53、言与面向对象程序设计(第二版).:清华大学,2007,11.2 黄晓东.Java课程设计案例精编M.:中国水利水电,2004,5.3 陆迟.Java语言程序设计(第一版)M.:电子工业,20024 广彬.Java课程设计案例精编(第二版)M.:清华大学,2007致随着本科生活的临近尾声,五个月的毕业设计也将结束,我也顺利的完成设计GPRS 判断DTU超时的功能。在开发设计的过程中,指导老师武本着认真负责的态度、以严谨求真的作风来要求我们每一位学生,从选题到研发到实现,指导老师给予了我正确的指导和极大的帮助,使得我在设计当中少走了很多弯路。还有学长胡鸿超,在编程设计过程,给予了我极大的帮助,从理
54、论知识到实际操作都给我很大的支持,让我从刚开始接到课题时一无所知到现在成功完成毕业设计,我感到非常欣慰!在顺利完成毕业设计的同时更让我学到了许多知识,对原有的理论知识能够很好的与实际结合起来运用,也大大的提高了我的编程能力,这使得我对以后的工作充满了信心。在此我由衷的向我的指导老师、学长还有那些一起走过来的同学朋友们再次地说一声!今后我会以此次的毕业设计为起点迈向更远的未来。附录1:Node.javaimport .Socket;public class Node private String data; private long time; private String ip; privat
55、e int port; private Socket socket; private char key; Node() /构造函数 Node(int port) this.port=port; public String getIP() /处理IP地址 return ip; public void setIP(String ip) this.ip = ip; public int getPort() /处理端口号 return port; public void setPort(int port) this.port=port; public long gettime() /处理时间 retu
56、rn time; public void settime(long time) this.time=time; public String getData() /处理数据 return data; public void setData(String data) this.data=data; public void setSocket(Socket socket) /处理Socket接口 this.socket=socket; public Socket getSocket() return socket; public char getkey() /处理键值 return key; pub
57、lic 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.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;impor
58、t 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(请输入IP地址:);lb2=new Label(请输入端口号:);tf1= new TextField(0.0.0.0,25);tf2 = new TextField
59、(0,20);btn=new Button(启动);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();tf2.addFocusListener(new HandleFocus();btn.addActionListener(new HandleAct();class HandleAct implements ActionL
60、istenerString 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 lk=new LookUp();lk.start();class HandleFocus implements FocusListenerString str;public void focusGained(FocusEven
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 草场租赁合同的保险条款
- 2024年夫妻债务处理合同
- 2024年兼职教师权益保护合同
- 2024年住房保障计划买卖合同
- 与购物中心相关的不动产管理服务行业营销策略方案
- 2024年外国公司对华分支机构合同
- 高温计项目营销计划书
- 2024年企业员工培训与发展协议
- 剧院演播室用灯光设备出租行业相关项目经营管理报告
- 2024年合作开发:城市燃气建设项目
- 项目管理甘特图课件
- 2024年甘肃省普通高中信息技术会考试题(含24套)
- 我国的武装力量课件
- 液化石油气瓶安全使用告知书范文
- 供应室护理责任组长竞聘
- 高中数学教师的专业发展路径
- LTC与铁三角从线索到回款
- 《旅游市场营销》课程教学设计
- 工程流体力学课后习题答案-(杜广生)
- 小儿健脾胃知识讲座
- 【比亚迪新能源汽车企业财务风险识别与控制分析13000字(论文)】
评论
0/150
提交评论