实现分布式应用的首要前提是分布式应用程序能通过调用网络API得到稳定、高效、可靠的网络通信服务。在网络API中,Socket占有重要的地位。它提供了位于TCP/IP等多种网络协议上的统一的编程接口,成为开发网络应用的重要途径。但是,利用Socket API来开发网络应用并不是一件简单的工作。开发者需要构造通信模型,并显示地完成字节顺序转换、字符串转换、收/发缓冲区的开辟、格式化数据的收/发等工作。其原因在于,Socket API在为应用提供基于流的通信机制的同时,将许多工作留给了应用程序本身。因此,为了满足实际应用开发需求,在现有Socket API的基础上,设计并实现了一种基于Windows平台的分布式网络通信软件,开发人员可以调用该软件提供的接口更加方便地实现分布式应用系统。
该软件的基本设计思路是给局域网中的每台参与通信的计算机赋予一个主机ID,由软件自动实现ID的动态分配、IP地址映射和管理,数据通信都是通过识别ID决定其流向,在此基础上构造了通信模型,通信模型中包含两个分离的实体,分别为客户和服务器,服务器始终处于监听状态,而客户则负责在需要通信时向服务器发出通信连接请求,服务器则响应请求建立与客户的通信链路进行通信,通信结束后可由任意一方关闭通信链路。
通信模型还定义了客户和服务器进行交互的通用数据单元。它是设计和实现客户/服务器之间应用协议的基础。表1是数据单元的格式。
通信软件只负责完成交互数据单元在网络上的传送,不必关心数据单元的内容,这使得通信层软件相对独立,且具有一定的通用性。应用开发者可以通过约定消息的种类、内容和消息交互顺序形成应用协议来满足不同的分布式应用需求。
该软件实现是通过一个通信线程类CComThread来完成主要的通信操作,该类封装了所有的通信函数,一旦创建以独立线程的方式运行,避免了使应用程序等待的情况。另外该类拥有自己的消息队列,以消息传递和应用程序主进程通信,具体过程如下。(1) 在数据发送时,应用程序准备好要发送的数据,然后用消息通知CComThread,CComThread的消息处理函数在收到消息后立即打包数据并发送给消息的目的主机;(2) 接收数据时,首先是CComThread收到网络上传来的数据,然后把数据解包放在消息里通知应用程序,应用程序相应的消息处理函数负责完成对收到数据的处理。CComThread除了完成数据的发送和接收,还负责进行通信链路的建立和管理。另外该类还提供了外部调用接口以实现类似于FTP的文件传输服务。
分别编写客户和服务器应用程序在10M以太网环境下进行测试,共有10台计算机参与通信,模拟的数据量达到200kB/s,结果表明,所有数据均能正确发送、接收和处理,通信效率较高且具有通信故障检测和恢复能力,传输速度可达到700kB/s。该软件目前正应用于某分布式控制系统,该软件减轻了应用开发的负担,可将精力集中于应用协议的设计和实现。