网络编程实现思路 下载本文

通讯服务器程序设计思路

通讯过程:

客户端下发命令,把命令保存到数据库命令表,通讯服务读取命令数据表里的数据下发到下位机,下位机上传数据,通讯服务接收数据,解析后保存到数据,客户端通过数据库进行查看结果。

先定义了3个类分别是:

通讯链路父类、业务父类和设备对象类

通讯链路父类是抽象了串口、GPRS通讯和TCP通讯的一些共有的方法和属性。 通讯链路父类定义的方法和属性:

1、 服务IP 2、 服务端口 3、 服务状态 4、 启动服务事件 5、 停止服务事件

6、 接收数据事件(主动接收和被动接收,主动接收使用线程处理接收的数据) 7、 发送数据

8、 获取设备通讯状态 设备对象定义的属性和方法:

1、 设备编号 2、 设备名称 3、 设备IP

4、 设备通讯端口 5、 接收数据队列 6、 命令下发队列 7、 接收数据缓存 8、 缓存保存位置 9、 缓存读取位置 10、 接收数据事件(读取接收数据缓存区的数据,处理成完整的数据帧,保存

到接收数据队列) 11、 发送数据事件(回调通讯链路的命令发送方法) 12、 解析数据线程(回调业务父类的解析数据方法) 13、 发送命令线程

业务父类是抽象了各系统业务处理的方法:

1、 命令加载方法(把命令加载到命令下发队列) 2、 解析数据(针对单一设备)

服务类主要工作是根据业务类型和通讯类型建立服务。 服务类主要工作内容: 1、 加载基础数据 2、 启动通讯服务

3、 启动各线程,包括设备解析数据线程、设备命令发送线程。

4、 启动命令加载线程(业务父类的命令加载方法) 5、 启动运行数据解析线程() 6、 维护各线程稳定运行

线程长期稳定运行的方法:

1、 在线程中可能出错的语句中添加try语句。主要可能出错的语句有数值转换和数据

库操作。

2、 在线程中添加时间标识。判断时间标识是否超时,重建超时的线程。

线程之间共享资源的访问。

Delphi:

多线程同步的方法有:

临界区、互斥事件、信号量。

互斥可能造成程序的假死,无法正常运行。 临界区和信号量效率很低。 C#:

使用Monitor 时需要使用 try catch finish 避免获取锁之后因为异常,致锁无法释放。 Lock是对Monitor进行的封装,Lock不管执行结果是什么都会释放锁。 当线程遇到lock锁定时,线程将进入阻塞状态。 使用时需要注意:

Lock{}不能使用值类型,建议使用object类型。 Lock{}内的语句不宜过长。不宜调用函数。

设计框架中存在的共享资源有设备对象队列和设备对象里的接收数据缓冲区、接收数据队列和命令下发数据队列。

1、 设备对象队列只在基础数据加载时做队列添加,在整个周期中不对设备对象队列进行删

除。

2、 接收缓冲区使用了环形缓冲区,加载基础数据时给缓冲区设定一个初始数据长度。初始

数据长度可设定。

3、 接收数据队列和命令下发数据队列使用了lock进行互锁操作。

服务器资源占用:

占用大量资源会造成其他应用和线程不能正常运行。

C#程序不需要注意内存的回收,只需要注意CPU资源的占用。

循环运行的程序必须加sleep让程序进入阻塞状态,让出CPU资源给其他线程。