首先介绍一下项目背景,本项目是某研究院为了更加方便的使用平时使用较多的三个仿真软件而做的,其中我接触比较多的就是CST这款软件,主要是用来进行3D建模的。这个项目简单来说就是将这三个大型仿真软件放到一台服务器上,然后开发一个client-server模式的系统 ,用户可以在一个集成的Client端统一使用这三个软件(在一个界面中),而不必需要同每一个软件进行交互,方便了用户的使用,将多个仿真软件统一起来使用,就是所谓的一体化。同时在服务器上部署一个server用来同多个cilent进行通信,以此来调用服务器端这三个仿真软件的计算能力,同时协调多个用户对服务器计算资源的请求,这大概就是所谓计算平台吧。
一.总体架构
本项目的总体架构应该说比较简单,就是CS模型的架构,其中client有多个,部署到用户的电脑上,server只用一个,部署到服务器端,同时服务器端会部署三个仿真软件,server会对这三个软件进行调用。部署图如下所示:
部署图
其中更加详细的描述可以将本系统划分为四个大的模块,分别是客户端业务处理模块,服务器业务处理模块,ftp上传下载模块以及客户端服务器通信模块。其中我负责了客户端服务器通信模块以及服务器端业务处理模块,关于服务器端的业务处理,由于在系统原型搭建完毕后就退出了此项目,后期的改进不再参与,估计会有很大的变动,但是客户端服务器端通信模块已经比较稳定,剩下的就是对通信协议的扩展工作。本系统的详细组件描述可以由下图描述:
下面描述一下系统实现,为了说明问题,首先需要讲明,服务器调用仿真软件的功能是通过执行脚本文件来实现的,脚本文件的生成由客户端的业务处理模块来实现。当客户端通过输入参数生成了要执行的脚本文件后,通过ftp客户端将脚本上传至服务器处的ftp服务器中,并且通过客户端的socketclient模块来通知服务器端的server,server模块中的socketserver模块接收到了客户端的通知后会调用server中业务处理模块,业务处理模块会查找到上传到服务器中的脚本文件并且执行脚本文件来调用仿真软件的计算能力,同时客户端也可以通过socketclient来查询脚本文件的执行情况,当客户端查询到脚本文件执行完毕后,会到指定的ftp服务器处下载执行结果,来进行下一步的分析和处理。以上即为本系统的大致执行过程,下面对我负责的通信模块和服务器端业务处理模块进行一个描述。
二.通信模块
通信模块分为客户端socketclient和服务器端socketserver两部分,本项目由于服务器和客户端都是部署到windows上,所以使用c#进行编程,c#对socket有很方便简单的实现,所以实现通信的技术难度并不大,这里主要阐述一下本系统在socket通信设计上的考虑。此处通信选用了Tcp协议。udp协议的用处在于短时间内发送数据很频繁的情况,同时对于传输数据的安全性要求不高的情况,类似于发送心跳信号(???)这种情况,其他多数的情况基本都是选择Tcp协议作为通信协议。另外涉及到网络通信,利用线程是必须的,因为网络状况的不确定性,如果在主线程中进行网络连接,发生主线程阻塞就会造成不好的后果。下面分三块进行描述,分别是socketclient,socketserver,以及通信协议。
(一)socketclient
socketclient在设计上有以下几个特点:
(1)使用短连接,即每次与服务器端通信完毕后都会关闭Tcp连接,因为长时间保持Tcp连接可能发生不确定的情况,影响服务器和客户端的稳定性。在实现中,则是每次发送数据时首先connect()连接服务器,与服务器通信完毕后disconnect(),下次需要通信时重新建立连接。
(2)每次建立Tcp连接都在线程中,防止阻塞主线程。
(3)网络通信线程与主线程的数据同步,当连接线程接收服务器端数据后,会根据数据内容刷新主线程中的界面,此处使用了c#中的代理来进行这项工作,c#中的代理与c++中的函数指针类似,具体使用方法由客户端处理,我不负责,不是太明确(???)。
(二)socketserver
socketserver的设计要点:
(1)使用一个专门的线程进行网络连接的监听。
(2)使用c#中的异步模式处理新的客户端连接,每次有新的客户端连接到服务器时,都有专门的函数处理此连接。对客户端连接的处理是在监听线程中实现的,这样避免了如果每当有一个客户端连接进来时新开一个线程来处理,这样会极大的消耗服务器端的资源。(异步模式的实现方式???通过循环不断的转换来处理不同的连接???)
(三)通信协议
为了实现客户端与服务器的通信,需要制定并且实现本系统自己的通信协议。此处协议的制定还是比较简单的,由于过于细节,此处不再赘述,在一下篇拾遗中会做一些描述。
在c#中对于Tcp协议的实现,有专门的Tcpclient和TcpListener进行了实现,不过由于第一次使用c#,所以在前期的原型实现过程中使用了最简单的socket来进行Tcp连接和监听,后来发现这两个组件后由于前期的做的工作不想放弃所以没有改用这两个组件。其实应该想到,像c#这种有微软支持的语言,其中应该会有大量实现好的组件可以简单的调用,而不需要从比较底层开始写起,做应用时应该注意这一点。毕竟用现成的组件不仅简单而且稳定。
三.服务器业务模块
对于不同的系统来说,业务模块各不相同,本系统的业务模块也没有必要做详细的描述,下面只是讲几个点:
(1)使用单独的线程来检查脚本是否执行成功,这个线程是对所有脚本而言的。判断脚本是否执行成功是通过仿真软件是否产生了输出来判断的。
(2)使用单独的线程来执行脚本,这个线程是对每一个脚本而言的。
(3)封装出一个业务的数据层(Model)模块,对这一个模块的读写可以防止数据的不一致。同时使业务模块更加清晰。
四.总结
对我来说,这个项目对我最大的帮助就是初步了解了socket编程的方法,以前并没有从socket层面进行实际的开发,同时学习了socket编程的一些设计思想,以后对于socket编程需要更加重视多加练习。另外,本文只是从一个大的层面阐述了此项目,在写博客的过程中发现还有很多不是很清楚的点,下一篇将会从细节缕清一些点。