蒋传杭 陈至哲
采用C#编程语言为开发语言和面向对象设计方法,利用UML建模语言,结合线程池、UDP通讯协议等技术基础,开发出一种适用于网络版轮机模拟器的通讯平台。主要完成即时通讯模块、数据存储模块和操作显示模块等,通过各模块之间协作来实现通讯平台的功能需求。整体架构采用C/S结构,分别对服务器端、客户端和数据库等进行分模块设计,客户端之间采用了点对点通讯架构,利用UDP通讯协议,实现了用户模型启动、通讯和操作提示等功能,完成整个网络版轮机模拟器通讯平台的开发。
该系统主要包括四个部分:客户端、主服务器、组服务器和数据库。当一个操作组满足所需操作人数时,同组成员可进行分角色轮机系统模拟操作,同组客户端之间通过组服务器进行通讯,不再通过主服务器,其数据库负责数据的存储、访问和保证数据的完整性约束等,各模块之间均采用工业以太网UDP通讯协,来完成数据的交互。
1、整体架构设计
该平台添加了组服务器与具体的轮机系统的模型,主服务器主要负责团队总数的管理和为客户端分组等功能,当人数满足条件时组服务器运行,客户端可以直接对轮机系统进行模拟操作,组服务器用来实现模型解算、访问数据库等功能。而客户端之间的数据交互和通讯采用都点对点结构。
服务器端先行启动,启动的同时开启端口监听客户端是否接入。客户端再行进行用户信息登录等相关操作,服务器段进行验证,认证成功后允许用户进入通讯平台,之后服务器端进行角色分配和初始化操作,进行模拟仿真训练,客户端之间可实现实时的信息和数据交互。
2、客户端设计
客户端运用.Net平台,采用C#编程语言,通过Visual Studio2010中Windows窗体应用程序设计操作界面,主要采用Button、Label和Text Box等基础控件。
在该通讯平台中引入心跳机制,首先主服务器端负责监控客户端是否登录成功,进入局域网,当客户端成功登录进来,主服务器创建一个Client,客户端连接成功后发送登录信息,服务器端监听客户端是否有消息传出,有消息时,判断该消息类型,如果是新客户端的登录信息,即设置用户ID,显示该用户在线。服务器端对登录成功的用户每10s进行一次空闲计数,当客户端向主服务器端发送的消息类型为心跳时,证明该客户端处于在线状态,空闲计数清零,可参与该轮机模拟器通讯平台模拟操作。
服务器端对客户端每10s进行一次空间计数,逐次加一,当空间计数为3000时(代表该客户端已30秒没有心跳),服务器自动断开该Client,判定该用户处于离线状态,不可参与该轮机模拟器通讯平台模拟操作,需重新登录。
3、服务器端流程
主服务器端引进一个监听机制,首先平台开启后进行初始化,通过创建一个UDP监听线程,负责监控是否有客户端接入进该通讯平台,一旦客户端可以构成一组(四个客户端为一组),形成一个操作组。
通过创建一个控制台程序作为主服务器,实现与多个客户端程序通讯,主线程的socket绑定在一个固定端口,用于监听客户端的信息,每当一个客户端启动后,会发送一个连接请求,Server端就会自动创建一個新的线程,用来实现服务器端于客户端之间的通讯,当客户端退出程序时,结束该线程。
监听机制的引用是利用多线程技术。
4、数据库设计
此通讯平台的数据库使用SQL Server实现。
5、UDP通讯协议设计
该轮机模拟器模型各个模块之间均采用UDP通讯协议来进行数据和信息的交互,需对UDP协议进行具体详细的制定。
客户端与服务器端的信息主要分为两类:
A.客户端指令与服务器端应答
B.仿真模拟数据分发(具体包括:1.客户端与服务器之间采用单播 2.服务器和客户端之间采用组播3.客户端之间采用点对点通讯)
6、以太网桢基本格式
客户端指令和服务器应答信息数据包基本格式:
数据起始符(2 字节) + 数据长度(4字节) +客户端号(4 字节) +信息传输文本 (0-500 字节) + 结束符(2 字节)
仿真操作数据包基本格式:
数据起始符(2 字节) + 数据长度(4 字节) +客户端号(4 字节) +数据传输文本 (0-500 字节) + 结束符(2 字节)
仿真数据数据包基本格式:
数据起始符(2 字节) + 数据长度(4 字节) +时间戳(4字节)+数据传输文本 (0-500 字节) + 结束符(2 字节)
6.1数据起始符(21H)
本通讯平台数据起始符定义为16 进制单字节数(21),即每组数据包均以21(H)为起始字符,便于数据包的报头校验。各个模块之间均采用不同的UDP数据包格式来完成信息与数据的交互。
ASCII码:!。
6.2数据长度
所有数据,包括起始字符和结束字符,字节长度为2字节。
6.3客户端号
登录系统客户端的编号。定义为整型,字节长度为4字节。
6.4时间戳
由于UDP通讯协议不提供拥塞控制,因此在该通讯平台中引入了时间戳[48]。时间戳是在应用层对数据报进行排序,在数据包进行封包时封存当前时间,对数据包进行一个时间上的标记,以此作为数据发送顺序先后的凭证。而接收端通过两个数据包中封存的时间戳标记,计算出这两组数据发送间隔(或者称为两组数据包的时间间隔),以此对数据包的传输效率进行控制[49],通过将时间戳插入数据包中完成这一功能。
在该系统协议中,用int32型数据表示时间戳。时间戳从0开始,每次传输发生时,时间戳加1。客户端验证时间戳,如小于原时间戳,则该数据包应丢弃。
6.5结束符
数据结束符定义为16进制单字节数(0DH),即每组数据包均以0D(H)为结束字符,便于数据包的尾校验。
十进制:13。
ASCII码:回车。
当仿真数据量大,不再对仿真数据进行编码,而是通过在所传输文本中的位置确定数据的值、类型和含义。所有的值都表示为float型数据,数据包不超过1472个字节,如果超过1472字节的话,则需要对仿真数据进行分包发送。