收藏 分销(赏)

基于java的判断dtu超时功能的研究与设计设计.doc

上传人:精**** 文档编号:2484961 上传时间:2024-05-30 格式:DOC 页数:38 大小:754KB
下载 相关 举报
基于java的判断dtu超时功能的研究与设计设计.doc_第1页
第1页 / 共38页
基于java的判断dtu超时功能的研究与设计设计.doc_第2页
第2页 / 共38页
基于java的判断dtu超时功能的研究与设计设计.doc_第3页
第3页 / 共38页
基于java的判断dtu超时功能的研究与设计设计.doc_第4页
第4页 / 共38页
基于java的判断dtu超时功能的研究与设计设计.doc_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、安 徽 农 业 大 学毕 业 论 文(设计)论文题目 基于java的判断DTU超时功能的研究与设计 姓 名 詹 步 康 学 号 09101009院 系 信息与计算机学院 专 业 通信工程指导教师 张武 职 称 副教授中国合肥二o一三 年 五 月37安徽农业大学学士学位论文(设计)开题报告课题名称基于java的农业物联网中间件的判断DTU超时功能的研究和设计课题来源导师指定学生姓名詹步康专业通信工程学号09101009指导教师姓名张武职称副教授研究内容1 研究分析DTU超时功能的作用。2 对DTU超时功能的应用原理进行分析:1)DSC启动定时器轮询并获取用户最后一次与DSC通讯的时间。2)获取当

2、前时间并与最后一次登录时间比较,取其差值。3)该值超过事先定值则断开用户DTU与DSC数据中心的连接。3 对以上工作过程的需要进行编程并进行模拟测试。研究计划3月初3月中 调研、查资料。3月中4月初 研究并分析超时功能的作用及其应用原理。4月中5月初 构建系统框架,编程。5月初5月中 对系统进行调试、运行并修改。5月中 撰写毕业设计论文。特色与创新 系统稳定,抗干扰能力强 应用该功能可以节省不必要的流量花费指导教师意见教研室意见学院意见基于java的农业物联网中间件的研究判断DTU超时功能的研究和设计学生:詹步康 指导教师:张武(安徽农业大学 信息与计算机学院 合肥 230036)摘要:本课程

3、设计运用了所学的Java语言基础知识,面向对象程序设计的基本思想、方法与技术,网络通信编程技术等开发了简单应用功能-基于java的农业物联网中间件的判断DTU超时功能。详细地介绍了本课程设计运用了所学的Java语言基础知识,面向对象程序设计的基本思想、方法与技术,网络通信编程技术等开发了简单应用功能-基于java的农业物联网中间件的判断DTU超时功能。详细地介绍了基于java的农业物联网中间件的判断DTU超时功能的设计方法,给出了该功能的java程序设计,该程序可直接用作服务器端程序,接受并处理数据。服务器端数据中心与客户端DTU通过Socket建立连接,利用输入输出流透明传送数据。服务器端程

4、序主要包括节点类、工作线程类(接受并处理数据所用)、轮询类等,以及用于存储节点的哈希表、同步锁和支持多客户端的线程;客户端程序主要有计时器类(每隔一定时间向服务器端发送一数据)。关键词:DTU;超时;轮询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,

5、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 basic idea of object-oriented program

6、 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 detail based on the Java middlew

7、are 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 connection is established, using the tr

8、ansparent 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 client; Client program mainly include

9、the timer class (sending a data at regular intervals to the server).Keywords:DTU;timeout ;polling目录1 引言32.课题的总体目标与主要研究内容42.1 课题的总体目标42.2 研究的主要内容42.2.1 下面就本课题所做的工作的主要内容42.2.2 本论文的章节安排43 总体设计43.1 需求分析与设计思想:43.1.1 对判断DTU超时功能的需求分析43.1.2 对判断DTU超时功能的设计思想43.2设计时用到的重要的技术或数据结构53.2.1同步锁53.2.2哈希表73.2.3线程84 程序的

10、详细设计104.1程序流程图104.2数据字典114.2.1 主类Server114.2.2启动服务器StartServer124.2.3节点类Node134.2.4工作线程WorkThread144.2.5 轮询类LookUp154.2.6客户端类Client164.2.7工作计时器类MyTask165 结论:17主要参考文献17致谢18附录1:18附录2312.1运行结果及界面312.1.1启动服务器前:312.1.2启动服务器但不启动客户端:322.1.3启动服务器并启动多个客户端:332.1.4 启动服务器并启动多个客户端最后关闭全部客户端:341 引言随着经济社会的不断发展和进步,无

11、线通信技术在人们生活中已变得愈发重要,受到广泛运用。应用了无线通信技术的GPRS DTU遍布了人类生活各个领域,被广泛应用于电力、水利、市政、交通、金融、环境监测、农业等行业领域。尽管应用的行业不同,但应用的原理是相同的,大都是DTU和行业设备相连,然后和后台建立无线的通信连接。在农业监测系统中,常常需要对众多农业园的CO2浓度,光照强度,土壤酸碱度等进行实时监测,大部分监测数据需要实时发送到管理中心的后端服务器进行处理。由于监测点分散,分布范围广,而且大多设置在环境较恶劣的地区,通过电话线传送数据往往事倍功半。通过GPRS无线网络进行数据传输,大大提高水文部门的工作效率,成为农场主、农业部门

12、选择的通信手段之一。DTU内嵌了TCP/IP协议栈,具有Socket通讯功能,并提供透明数据传输通道,用户只需设置一些参数就可实现将嵌入式系统直接与Internet相连,实现网络的互连互通。DTU的主要功能是把远端设备的数据通过无线的方式传送到数据中心,在传送数据之前,DTU需要与服务器端数据中心建立无线连接。服务器端监控中心的Socket端口监听程序负责监听采集终端的连接请求,当监听到连接请求后,建立通信链路,原来负责监听Socket仍进行监听,通信链路建立后就可任意交换数据了。当DTU长时间没有发送数据到数据中心时,那么数据中心就认为该DTU已掉线并断开与该DTU的连接。判断DTU超时功能

13、是DTU众多功能之一,作用就是帮助数据中心及时发现那些不传送数据却仍然连接占用大量资源的DTU,以便让有限的内存资源得到最大化利用。图1 DTU及其使用示例2.课题的总体目标与主要研究内容2.1 课题的总体目标本课题的目标是,实现个判断DTU超时的功能,使用这个功能可以使服务器很大程度上提高自己管理内存资源的能力。此功能应用于服务器后台上,能比较理想得保证通讯连接的时效性,避免了那些空占其位,不尽其守的DTU。2.2 研究的主要内容 2.2.1 下面就本课题所做的工作的主要内容 1) 就具体的DTU设备进行调研,找出其工作原理,以何种方式发送数据等等。2) 编写服务器端接受数据的程序,能够从字

14、节流里读取数据。3) 编写服务器端轮询程序,能够每隔一段时间检查一次各客户端是否掉线。 2.2.2 本论文的章节安排 第2章,提出了课题的总体目标与主要研究内容;第3章,对判断DTU超时功能的总体设计,对设计有个宏观把握;第4章,对判断DTU超时功能的具体设计,详细介绍了设计过程。第5章,针对本文的工作进行了总结以及提出不足之处。3 总体设计3.1 需求分析与设计思想:3.1.1 对判断DTU超时功能的需求分析在互联网日益发展的今天,DTU的使用也越来越广泛,为各行业之间的信息、产业融合提供了帮助。可往往运用DTU的过程中难免会遇到令人不快的情况使得DTU无法正常向服务器发送数据,这些情况常见

15、有:突然断电、DTU本身电路故障、信号太弱、等等。服务器与众多DTU通讯时,可能某一DTU故障而无法向服务器发送数据,此时服务器还在默默等待该DTU传送的信息。大家都知道服务器根本接受不到该DTU发来的数据,但是此时服务器还与该DTU连接着,占着服务器宝贵的内存资源双方却不能正常通讯,显然这浪费资源,要是众多DTU都是这样尸位素餐的话,总有某一刻服务器也被“卡死了”。所以为了消除这种隐患,迫切需要一种功能能够准确查出那些尸位素餐的DTU,然后把它们“踢下线”以释放资源。3.1.2 对判断DTU超时功能的设计思想 启动服务器,打开了轮询程序并启动了监听程序,等候客户端的连接。若有客户端发来连接请

16、求时,服务器就专门为这个客户端启动一个线程来接受并处理该客户端发来的数据;另外服务器会创建个节点来代表该客户端,并将该节点存在哈希表中。节点里封装有客户端的IP地址、连接端口号、向服务器发送的数据、该节点在哈希表中存放的位置(即:键值)以及最后一次与服务器通讯时的时间(客户端向服务器发送一次数据,该时间即更新一次)。 轮询程序启动以后,会每隔一段时间轮询一次哈希表,对里面存储的客户端节点中的时间进行检查,若其大于指定值则默认该客户端节点已故障,将与其断开连接。3.2设计时用到的重要的技术或数据结构3.2.1同步锁当我们用多线程访问或修改同一共享资源时,可能会引起线程间的冲突,因此引入线程同步机

17、制,来让先到的线程率先访问或修改该共享资源而在这一线程对共享资源的访问或修改还没有结束之前,任何要访问或修改该共享资源的线程都必须等待,这样就很好得解决了线程间的并发问题。 本设计中轮询机制的代码在访问或删除哈希表中的客户端节点时,必须考虑到此时可能有新的客户端向服务器端发出连接请求但是轮询尚未结束不能将新来的节点插入哈希表,所以要将轮询代码与向哈希表插入节点的代码同步起来。同步分为 同步方法 和 同步块 两种方式。3.2.1.1 Synchronized 加在方法上, (同步方法,锁定类实例)Java代码publicclassDemo1 publicsynchronizedvoidm1()

18、/. publicvoidm2() /. synchronized(this) /. /. 这两种写法的效果是一样的,锁定的都是类实例。如果有两个 类实例: de1 = new Demo1(),de2 = new Demo1(),另外有两个线程: thread1,thread2,都调用了de1 对象,那么,在同一时间,如果 thread1调用了de1.m1(),则thread2在该时间内不能访问de1.m1() 和 de1.m2(); 因为thread1把de1这个对象的锁使用了,所以无法分给其它线程使用。但是,如果thread1调用 de1.m1(), thread2调用 de2.m1(),

19、 则可以同时进行,因为它们调用的是不同的Demo1类对象实例。3.2.1.1 Synchronized 加在变量上, (同步块,锁定类实例)Java代码publicclassDemo2 Objecta=newObject(); Objectb=newObject(); publicvoidm1() /. synchronized(a) /. /. publicvoidm2() /. synchronized(b) /. /. 这种情况下,是实现代码块锁定,锁定的对象是变量a 或 b; (注意:a 、b 都是非static 的)如果有一个 类实例: do = new Demo2(),另外有两个线

20、程:thread1,thread2,都调用了do 对象,那么,在同一时间,如果 thread1调用了do.m1(),则thread2在该时间内可以访问do.m2();但不能访问 do.m1() 的同步块, 因为a被 thread1锁定了。若此代码里a、b变量用static修饰,其锁定的对象都是类Demo2,而不是类的实例,即在多线程中,其共享的资源是属于类的,而不是属于类对象的。在这种情况下,如果thread1 访问了这2个方法中的任何一个, 在同一时间内其它任何线程都不能访问 这2个方法。3.2.2哈希表 3.2.2.1 哈希表的定义及其构造方法哈希表是一种重要的存储方式,也是一种常见的检索

21、方法,是基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入计算得到存储地址所对应的存储单元。检索时采用检索关键码的方法寻找对应的节点。现在哈希表有一套完整的算法来进行插入、删除和解决冲突。在Java中哈希表用于存储对象,实现快速检索。java.util.HashMap提供了若干种方法让用户很方便地使用哈希表,而不需要考虑其真正如何工作的

22、。哈希表类中提供了三种构造方法,分别是:public HashMap ()public HashMap (int initialcapacity)public HashMap (int initialCapacity,float loadFactor)public HashMap(Map m)参数initialCapacity是HashMap的初始容量,它的值应大于0。loadFactor又称装载因子,是一个0.0到0.1之间的float型的浮点数。它是一个百分比,表明了哈希表何时需要扩充,例如,有一哈希表,容量为100,而装载因子为0.9,那么当哈希表90%的容量已被使用时,此哈希表会自动扩

23、充成一个更大的哈希表。如果用户不赋这些参数,系统会自动进行处理,而不需要用户操心。3.2.2.2 HashMap提供了基本的插入、检索等方法。插入public V put(K key,V value)在此映射中关联指定值与指定键。如果该映射以前包含了一个该键的映射关系,则旧值被替换。检索public boolean containsValue(Object value)如果此映射将一个或多个键映射到指定值,则返回 true。 public Set keySet()返回此映射中所包含的键的 Set 视图。该 set 受映射的支持,所以对映射的更改将反映在该 set 中,反之亦然。如果在对 set

24、 进行迭代的同时修改了映射(通过迭代器自己的 remove 操作除外),则迭代结果是不确定的。该 set 支持元素的移除,通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作可从该映射中移除相应的映射关系。它不支持 add 或 addAll 操作。 public Collection values()返回此映射所包含的值的 Collection 视图。该 collection 受映射的支持,所以对映射的更改将反映在该 collection 中,反之亦然。如果在对 collection 进行迭代的同时修改了映射(通过迭代器自己的

25、 remove 操作除外),则迭代结果是不确定的。该collection 支持元素的移除,通过 Iterator.remove、Collection.remove、removeAll、retainAll 和 clear 操作可从该映射中移除相应的映射关系。它不支持 add 或 addAll 操作。 public SetMap.Entry entrySet()返回此映射所包含的映射关系的 Set 视图。 该 set 受映射支持,所以对映射的更改将反映在此 set 中,反之亦然。如果在对 set 进行迭代的同时修改了映射(通过迭代器自己的 remove 操作,或者通过在该迭代器返回的映射项上执行

26、setValue 操作除外),则迭代结果是不确定的。该 set 支持元素的移除,通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作可从该映射中移除相应的映射关系。它不支持 add 或 addAll 操作。 删除public V remove(Object key)从此映射中移除指定键的映射关系(如果存在)。 public void clear()从此映射中移除所有映射关系。此调用返回后,映射将为空。3.2.3线程3.2.3.1线程的设计在Java中,创建线程的方法有两种:一种是通过创建Thread类的子类来实现;另一种是通过

27、实现Runnable接口的类来实现。这两种创建线程方法并没有本质上的区别,但是由于Java不允许多重继承,所以当一个类要继承另一个非Thread类而实现多线程的话,只能通过实现Runnable接口的方式来实现。3.2.3.2 通过Thread类实现 定义一个线程类,他继承类Thread并重写其中的run()方法。这时在初始化这个类的实例时,目标对象target可以为null,表示这个实例本身具有线程体。由于Java只支持单继承,用这种方法定义的类不能再继承其他类。Thread类定义的用来帮助管理线程的方法主要包括以下内容 : void run()方法:线程的入口点,运行线程中的代码。 void

28、 start()方法:通过调用运行方法来启动线程,使之由出生状态转入就绪状态。void sleep(long milis):在一段时间内挂起线程,令线程睡眠,在此期间,线程不消耗CPU资源;以毫秒为单位。 void interrupt():中断线程。 boolean isAlive():判定线程是否仍在在运行,出于活动状态。 void stName(String threadName):改变线程的名字。 String getName():获取由setName()方法实质的线程名字的字符串。 Yield():将CPU控制权主动移交到下一个可运行的线程。 setPriority(int p):设置

29、线程优先级。 getPriority():获得线程优先级。 Join():等待一个线程终止。3.2.3.3 实现Runnable接口创建线程的最简单的方法就是创建一个实现Runnable接口的类。然后根据工作需要重新设计线程的run方法;再建立该类的对象。Runnable抽象了一个执行代码单元。你可以通过实现Runnable接口的方法创建每一个对象的线程。为实现Runnable接口,一个类仅需实现一个run()的简单方法。3.2.3.4 线程的生命周期 每个线程的生命周期一共包括5种状态:出生,就绪,运行,阻塞和死亡。线程从出生到死亡的过程称为线程的生命周期。通过特定的操作可以进行状态间的转换

30、。3.2.3.5 出生当用关键字new和thread类或其子类建立了一个线程对象后,该线程就处于出生状态。 Thread 线程名=new Thread();处于新建状态的线程只是一个空闲的线程对象,系统并没有为他分配资源。在调用start方法之前,线程就一直处于出生状态。3.2.3.6 就绪在调用了start方法之后,线程就进入就绪状态,即被加入到处于就绪状态的线程序列中,在等待CPU时间片。线程名.Start();3.2.3.7 运行 当处于线程序列中的线程获得CPU时间片的时候,该线程就会自动调用其run方法,进入运行状态。4 程序的详细设计4.1程序流程图判断DTU超时功能程序共有8个J

31、ava源文件。重要之间的关系如下图; 图2 类之间的关系Server.java该文件是java application程序,负责创建程序的主窗口。该类含有init方法,程序从该类开始执行。StartServer.java该文件生成的类负责将服务器端套接字绑定端口号和IP地址,启动服务器,建立监听系统。当有客户端发来连接请求时即建立连接,然后启动工作线程。Node.java该文件生成的类的对象代表一个客户端节点,节点里存储着客户端发向服务器端的信息、客户端最后一次与服务器端通讯的时间、客户端的IP地址和端口号、客户端套接字以及该节点在哈希表中所对应的键值。WorkThread.java该文件生成

32、的类负责创建工作线程。接受并处理客户端发向服务器端的数据。每接受一次数据,都要根据该数据对这个工作线程对应的客户端节点里的信息进行更新。LookUp.java该文件生成的类负责对哈希表1中各客户端节点最后一次与服务器端通讯的时间进行检查。 使用迭代器遍历哈希表1,查出超时的客户端节点便将其键值放入哈希表2, 等轮询一周结束,用迭代器遍历哈希表2将哈希表1中超时的客户端节点踢下线并将其从哈希 表1中删除。Client.java(测试类)该文件生成的类负责向服务器端发送数据。首先在其主函数中通过构造函数Socket(InetAddress address, int port)绑定服务器端的地址和端

33、口号,然后启动定时器。MyTask.java(测试类)该文件主要负责创建一个定时器,每隔一定时间向服务器端发送数据。4.2数据字典4.2.1 主类Server4.2.1.1 成员变量(见表1)表1 Server类的主要成员变量(属性)变量名变量类型可见性成员变量描述taTextArea文本区域lb1Label标签lb2Label标签tf1TextField文本框tf2TextField文本框btnButton按钮4.2.1.2 方法(见表2)表2 Server类的主要方法名称功能返回值备注Server创建程序主窗口构造方法actionPerformed处理ActionEvent事件接口方法in

34、it程序开始运行Applet程序从此处开始运行4.2.2启动服务器StartServer4.2.2.1成员变量(见表3)表3 StartServer类的主要成员变量变量名变量类型可见性成员变量描述hmHashMap哈希表num_Threadint当前工作线程数ssServerSocket服务器套接字addrInetAddress服务器IP地址的InetAddress对象IpStringIP地址字符串形式portint端口号4.2.2.2方法(见表4)表4 StartServer类主要方法名称功能返回值备注StartServer初始化IP地址和端口号构造方法run线程的主部;建立服务器端的监听机

35、制,收到连接请求即建立连接并启动工作线程线程的run()bind_Port使服务器端绑定固定的IP地址和监听端口号4.2.3节点类Node4.2.3.1 成员变量(见表5)表5 Node类的主要成员变量变量名变量类型可见性成员变量描述dataString记录客户端向服务器端发的数据timelong收到最后一条信息时的时刻ipString客户端的IP地址portint客户端的端口号socketSocket客户端套接字keyChar节点存入哈希表时的键值4.2.3.2 方法 (见表6)表6 Node类的主要方法名称功能返回值备注Node创建客户端节点构造方法getIP获取节点内存储的客户端IP地址

36、IP是String类型setIP设置IP地址值getPort获取节点内存储的客户端端口号setPort设置客户端端口号getTime获取节点内存储的服务器与客户端最后一次通讯的时间setTime更新某节点内存储的服务器与客户端最后一次通讯的时刻getData获取节点内存储的客户端发来的信息setData更新节点内存储的客户端发来的信息getSocket获取节点内存储的客户端套setSocket更新节点内存储的客户端套接字getkey获取哈希表内存储的该节点对应的键值4.2.4工作线程WorkThread 4.2.4.1 成员变量(见表7)表7 WorkThread类的主要成员变量变量名变量类型

37、可见性成员变量描述chChar客户端发的心跳包的字符串信息的第九位字符dataString客户端发来的信息bByte服务器端从输入流读取数据放入字节数组b中flagboolean用于标记是否同一个客户端向服务器端发信息nodeNodeNode类的实例,即客户端节点socketSocket客户端套接字hashLockObject同步锁4.2.4.2 方法(见表8)表8 WorkThread类的主要方法名称功能返回值备注WorkThread初始化客户端套接字socket构造方法run工作线程主部,接受并处理客户端发向服务器端的信息4.2.5 轮询类LookUp 4.2.5.1 成员变量(见表9)表

38、9 LookUp类的主要成员变量变量名变量类型可见性成员变量描述now_Datelong开始轮询时的时间last_Datelong客户端最后一次与服务器端通讯时的时间nodeNode轮询期间,代表所检查时间的当前节点node2Node轮询后,代表所检查出超时的节点hm2HashMap存储轮询期间检查出超时的节点itIterator哈希表1的迭代器it2Iterator哈希表2的迭代器 4.2.5.2 方法(见表10)表10 LookUp类的主要方法名称功能返回值备注run线程的run方法chaXun轮询哈希表检查是否有超时的客户端节点delete把超时的客户端踢下线并从哈希表中删除4.2.6客

39、户端类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类的主要成员变量变量名变量类型可见性变量描述dataString客户端要发送的信息socketSocket客户端套接字outDataOutputStream输出流 4.2.7.2 方法(见表14)表14 MyTask类的主

40、要方法名称功能返回值备注MyTask初始化socket构造方法run向输出流写数据closeSocket关闭输出流和套接字释放资源 接口方法5 结论:本文对GPRS 判断DTU超时功能的开发过程进行了详细的分析说明。本文遵循了“从当前应用的存在的问题提出开发需求形成系统架构具体功能实现”的流程来实现功能,此功能已经通过实际测试,运行良好,并得到应用。本课题的创新点:判断GPRS 判断DTU超时功能的设计,能够使服务器更好得管理自己的内存资源,并提高了通信稳定性,具有很高的实用价值和经济价值。文章中采用哈希表存储DTU节点,大大提高了服务器管理各DTU及自己资源的效率,并使用了同步锁,在这多线程

41、程序中很好得避免多条线程同时访问或修改哈希表等共享资源而产生的冲突。本设计的不足:由于无法明确DTU的生产厂家所设计使用通信协议,故无法获取DTU在与DSC建立连接后发来的注册包,因此服务器不好对各个与之建立连接的DTU做标识。无奈之下,通过设置DTU的心跳包内容,使之包含其对应的DTU的身份信息,从而让服务器提取并作为发送该心跳包的DTU的身份标识。主要参考文献1 印旻,王行言.Java语言与面向对象程序设计(第二版).北京:清华大学出版社,2007,11.2 黄晓东.Java课程设计案例精编M.北京:中国水利水电出版社,2004,5.3 陆迟.Java语言程序设计(第一版)M.北京:电子工

42、业出版社,20024 张广彬.Java课程设计案例精编(第二版)M.北京:清华大学出版社,2007致谢随着本科生活的临近尾声,五个月的毕业设计也将结束,我也顺利的完成设计GPRS 判断DTU超时的功能。在开发设计的过程中,指导老师张武本着认真负责的态度、以严谨求真的作风来要求我们每一位学生,从选题到研发到实现,指导老师给予了我正确的指导和极大的帮助,使得我在设计当中少走了很多弯路。还有学长-胡鸿超,在编程设计过程,给予了我极大的帮助,从理论知识到实际操作都给我很大的支持,让我从刚开始接到课题时一无所知到现在成功完成毕业设计,我感到非常欣慰!在顺利完成毕业设计的同时更让我学到了许多知识,对原有的理论知识能够很好的与实际结合起来运用,也大大的提高了我的编程能力,这使得我对以后的工作充满了信心。在此我由衷的向我的指导老师、学长还有那些一起走过来的同学朋友们再次地说一声谢谢!今后我会以此次的毕业设计为起点迈向更远的未来。附录1:Node.javaimport .Socket;public class Node private String data; private long time; private Str

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 研究报告 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服