APP下载

基于约定和配置的WebSocket客户端通信框架设计

2019-06-27蔡朝鹏

科技创新与应用 2019年20期

蔡朝鹏

摘 要:WebSocket可实现服务器和客户端的全双工通讯。为解决WebSocket通信程序编写的重复性和不易维护的问题,基于协议格式一致性的约定和XML配置文件设计了一个WebSocket客户端通信框架。该框架使用JavaScript通信类按照XML文件的配置自动执行通信流程,提升了WebSocket通信程序的可复用性和可维护性,提高了开发效率。

关键词:WebSocket;JavaScript;XML;HTML5

中图分类号:TP393 文献标志码:A 文章编号:2095-2945(2019)20-0020-03

Abstract: WebSocket can realize full-duplex communication between the server and the client. In order to solve the repeatability and difficult maintenance of WebSocket communication program, a WebSocket client communication framework is designed based on the agreement of protocol format consistency and XML configuration file. The framework uses JavaScript communication classes to automatically execute the communication flow according to the configuration of XML files, thus improving the reusability and maintainability of WebSocket communication programs and the development efficiency.

Keywords: WebSocket; JavaScript; XML; HTML5

引言

HTML协议是一种无状态、无连接、单向的应用层协议。单向连接的特点决定了如果服务器有任何状态变化,客户端都无法获知。为了让客户端正常获取服务器的状态变化,往往需要客户端以特定的时间间隔进行Ajax轮询。这种模式下客户端会不断的向服务器发送请求,导致网络中出现很多无效数据包,浪费带宽资源。

WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。WebSokcet连接是长连接,服务器可以主动向客户端推送消息,客户端也可以主动向服务器发送消息。这样就大大提高了服务器资源和带宽的利用效率[1]。

目前一般WebSocket客户端的使用方式是,用send方法向服务器发送数据,再通过onmessage事件接收并处理服务器返回的数据,每条协议都需要进行专门的处理,代码量大,不易维护,无法复用,基于此,本文设计了一个可复用、易维护的WebSocket客户端通信框架。

1 框架概述

该通信框架由三部分组成:协议配置文件格式、通信流程配置文件格式和通信类。程序使用JavaScript语言编写[2]。

编写WebSocket客户端通信程序的流程为:

(1)配置协议配置文件。

(2)配置通信流程配置文件。

(3)各流程节点回调函数和结果处理函数的定义。

(4)通信类对象初始化。

(5)通信类对象开始执行通信流程。

配置文件用来定义协议和通信流程,而实际的通信流程依靠通信类中的函数来启动执行。

本框架需要有一条重要约定,就是所有协议均遵从同一套结构定义,如均为SCPI协议。

2 框架流程图

由此WebSocket框架编写的程序的运行流程图如图1。

由图1可以看出,一旦配置好了协议和通信流程,则程序会自动运行整个通信流程,直到最后一条协议。

3 协议配置文件

可使用XML文件进行协议配置。协议包括id、类型、内容、参数等元素。配置文件中协议节点定义如下:

THRes:PORT

id:本条协议的唯一标识;

type:表示此协议为设置还是读取类型;

content:此协议的内容;

arg:receive属性为false时,表示arg為发送参数,即需要跟content一起发送给服务器;receive属性为true时,表示arg为接收数据。type属性为arg参数的类型,bytes属性为arg参数的字节数,count属性为arg参数的个数。

4 通信流程配置文件

通信流程同样使用XML文件来配置。通信流程节点需要配置id、协议id、结果处理函数、下一条协议的信息等。

post_callback="">0

|default|