![](https://csdnimg.cn/release/download_crawler_static/87984784/bg7.jpg)
3 总体设计
3.1 需求分析与设计思想:
3.1.1 对判断 DTU 超时功能的需求分析
在互联网日益发展的今天,DTU 的使用也越来越广泛,为各行业之间的信息、产业融
合提供了帮助。可往往运用 DTU 的过程中难免会遇到令人不快的情况使得 DTU 无法正常
向服务器发送数据,这些情况常见有:突然断电、DTU 本身电路故障、信号太弱、等等。
服务器与众多 DTU 通讯时,可能某一 DTU 故障而无法向服务器发送数据,此时服务器还在默默等待
该 DTU 传送的信息。大家都知道服务器根本接受不到该 DTU 发来的数据,但是此时服务器还与该
DTU 连接着,占着服务器宝贵的内存资源双方却不能正常通讯,显然这浪费资源,要是众多 DTU 都
是这样尸位素餐的话,总有某一刻服务器也被“卡死了”。所以为了消除这种隐患,迫切需要一种功能
能够准确查出那些尸位素餐的 DTU,然后把它们“踢下线”以释放资源。
3.1.2 对判断 DTU 超时功能的设计思想
启动服务器,打开了轮询程序并启动了监听程序,等候客户端的连接。若有客户端发来连接
请求时,服务器就专门为这个客户端启动一个线程来接受并处理该客户端发来的数据;另外服务器会
创建个节点来代表该客户端,并将该节点存在哈希表中。节点里封装有客户端的 IP 地址、连接端口
号、向服务器发送的数据、该节点在哈希表中存放的位置(即:键值)以及最后一次与服务器通讯时
的时间(客户端向服务器发送一次数据,该时间即更新一次)。 轮询程序启动以后,会每隔一段时间
轮询一次哈希表,对里面存储的客户端节点中的时间进行检查,若其大于指定值则默认该客户端节点
已故障,将与其断开连接。
3.2 设计时用到的重要的技术或数据结构
3.2.1 同步锁
当我们用多线程访问或修改同一共享资源时,可能会引起线程间的冲突,因此引入
线程同步机制,来让先到的线程率先访问或修改该共享资源而在这一线程对共享资源的
访问或修改还没有结束之前,任何要访问或修改该共享资源的线程都必须等待,这样就
很好得解决了线程间的并发问题。 本设计中轮询机制的代码在访问或删除哈希表中的客
户端节点时,必须考虑到此时可能有新的客户端向服务器端发出连接请求但是轮询尚未
结束不能将新来的节点插入哈希表,所以要将轮询代码与向哈希表插入节点的代码同步
起来。
同步分为 同步方法 和 同步块 两种方式。
3.2.1.1 Synchronized 加在方法上, (同步方法,锁定类实例)
Java 代码