龙源期刊网 http://www.qikan.com.cn
军事仿真训练系统中服务器端程序的研究与分析
作者:郭华 王群辉 闫炜 王志成 赵兴锋 来源:《中小企业管理与科技·下旬刊》2012年第09期
摘要:本文简要介绍作战模拟、仿真训练的概念;对仿真训练系统中服务器端程序各模块设计与分析进行了说明。
关键词:仿真训练系统 服务器端 程序设计 1 概述
信息化跨越式发展,推动了军事战略、战术和指挥控制手段的变革,作战模拟、仿真训练在军事发展中成了不可或缺得地步。采用计算机进行作战仿真模拟训练,简便易行,可有效减少装备损伤,有非常高的实用价值和军事效益。 2 军事仿真训练系统
军事仿真训练系统开发技术含量相当的高,如不能构思出一个贴切实际得训练环境,必将导致开发失败。它对设计人员策划能力要求也颇高,在编程知识中涉及网络编程、操作系统进程、线程编程、图形图像编程、WIN32 API编程及各种算法和数据结构等内容。
要使在仿真训练系统中控制行为更加精确,就需要高效的服务器系统,服务器端得程序设计就显得至关重要。
3 仿真训练系统中服务器端程序设计
服务端程序是就是为客户端提供服务的程序,服务器端应用程序应具有如下功能:监听客户端的连接请求、为客户端连接请求建立SOCHET队列、处理各客户端发送来的数据并发送应答消息。所用到得模块包括:通讯联络、线程管理、消息传递、场景分配、训练规则等。 3.1 通讯模块 通讯模块主要实现与客户端的通讯功能,是对套结字Socket的封装。Socket是UNIX下的网络通讯基础,对于一个Socket我们可以对其进行读写操作,读入的数据来自客户端,写入的数据可供客户端读取。Socket主要有阻塞套接字和无阻塞套接字两种,系统开发上大多采用阻塞模式,因无阻塞套结字,在网络环境不好时很难控制传输,容易使网络传输变得很不稳定。
但此模式,在不合适的时候从阻塞套接字读入数据,线程很可能将被阻塞,所以采用了select——多路复用技术,对socket进行监视,如果socket上有读事件发生,将调用消息模块
龙源期刊网 http://www.qikan.com.cn
发送消息给socket的携带对象,对其进行读写。通过对socket的封装,可完成通讯模块的基本任务。要做到传输网络上的消息,需要对Socket继续封装,应先定义一个消息结构体,再读写消息,消息结构可根据仿真训练系统具体设定。
3.2 线程管理模块 采用阻塞模式,就必须为各个socket创建单独的线程,否则可能会引起服务器端停工。封装线程内容包括:线程函数地址、线程开始时间、线程上次阻塞时间、线程最大阻塞时间、线程start方法、线程stop方法。线程stop方法可以通过发送信号给线程来杀死线程。线程类封装完成后,就可以编写管理模块代码了。管理模块是一个线程,其第一功能就是监视各个线程是否阻塞超时,通过察看线程上次阻塞时间和最大阻塞时间来完成。一旦发现当前时间超过线程最大阻塞时间加上线程上次阻塞时间,既可断定线程阻塞超时,此时就需要kill该线程。另外,其他一些根线程有关的管理方法都有此模块负责。
3.3 消息传递模块 对象、模块之间如何传递消息,也是服务器端设计的重点。封装消息模块,第一步就是做一个MessageBox类,它是一个堆栈,用来装消息,由pop和push方法,应先实现一个存储消息数据结构。第二步封装就是HandleMessage类,这就是消息模块的主要实现。服务器端是一个被动驱动的模型,应有一个WaitMessage方法(如没有消息来驱动,服务器端就不会运行下去),调用此方法,线程将被阻塞,直到有消息到达。在此可通过无名信号量来实现(也就是UNIX下的sem),它可以增加或减少信号量来实现互斥。
实现以上封装,在两个对象之间发消息用SendMessage方法就可以,SendMessage的实现,是调用MessageBox里Push方法向里边放消息,之后把sem加一,这样接受这就可以收到消息了。
3.4 训练场景管理模块 本模块专门管理训练场景里的数据模型,仿真训练系统里的对象基本上都由他来管理。此模块极为复杂,在大型系统里,可以把它再划分成很多子模块来协同工作。此模块封装:首先,需要一个消息处理类,因为训练场景分配管理模块同样是需要消息驱动的,每收到一个消息后,就察看消息类型。是转发类型,就将消息转发给消息目的地模块;是管理类型,就察看管理的目标及管理方法,然后执行管理方法。因此,此处需要的就是一个辨别消息的方法,以及一些数据及操作数据的方法。
3.5 训练规则模块 本模块按照具体得装备训练细则制定的规则来进行业务逻辑处理。同样,首先需要封装消息处理类,然后就是辨别消息。按照消息提示进行规则处理,随后将处理结果封装成消息,发给管理模块,基本上与训练场景管理模块模式相同。
训练场景管理模块和训练规则模块不是分开运用的,都是与训练息息相关得,他们是两个更为复杂的模块,根据要编写的仿真系统的不同,这两个模块实现也不同。规则模块实际上是专门处理训练业务逻辑的,主要工作就是辨别消息,把我们的消息翻译成对对象的处理方式;场景分配管理模块是专门处理训练对象的,仿真环境由很多对象构成,一个对象可以携带多个对象,对象可以不断增加、扩充。每当添加或扩充一个新对象,可以把它include进来,再在规则模块里加入对他的方法调用。
龙源期刊网 http://www.qikan.com.cn
在仿真训练系统中,以上两个模块是合在一起的,统称为仿真训练世界模块,如图1。从图上可以看出,两个模块之间不需要消息传递,游戏规则模块和游戏管理模块被合并在一起了,他们是函数调用关系。 4 架构局限
仿真训练系统中的网络端有其固有局限,系统设计中存在矛盾和不足。首先,是服务器的管理,应分析它的设计目标是应对很多的连接还是很大的数据传送量;其次,就是对客户端情况的检测,但如不注意,就可能造成服务器资源持续消耗而最终崩溃,使得服务器重启;再次,这样的系统架构,如不在小型机上运行,在多对象要处理对保持高速得响应有影响。 这种架构得系统,对硬件环境和软件配置有一定得要求:①采用unix开发,需要训练系统在小型机之类的服务器上运行。②没有封装TCP确认机制,采用默认TCP进行网络传输,不具有UDP高传输性能。③客户端有什么发什么,控制发送的间隔时间,对客户端得电脑得性能统一性有要求,可能会因同步问题出象卡屏。④为每个连接分配一个线程,有可能有浪费,为节约系统资源,可以采用连接池技术,虽然它会使通讯模块复杂化,但可以在配置时根据不同的系统,采用不同的配置方案,选择是否使用连接池技术。 5 结论
在本文中给出了一种仿真训练系统的服务端的设计方法,在这里我们要的是真正能实现的方法。网络编程最困难和有成就的地方,并不是服务器用了什么模式,而是真正深入设计的时候碰到的众多问题。正是那些没有标准答案的问题,值得我们去研究和解决。 参考文献:
[1]Dawson Bruce.Micro—Threads for Game Object AI.Game Programming Gems 2.Charles River Media,2001.
[2]Rabin Steve.Strategies for Optimizing AI.Game Programming Gems 2. Charles River Media,2001.
[3]Tozour Paul. Building an AI Diagnostic Toolset. AI Game Programming Wisdom.Charles River Media,2002.