基于Socket的水文数据库管理平台的设计与实现

2020-08-04 21:59郭浩胡晓峰付航帅
河南科技 2020年17期
关键词:通信协议控件水文

郭浩 胡晓峰 付航帅

摘 要:水文数据是水文研究和分析的重要依据,水文数据的科学管理是实现分级可视化、图文查询和统计分析的关键。基于Socket的水文数据库管理平台采用Microsoft Visual Studio 2015作为开发平台,利用MFC构建水文数据库管理平台框架,利用SQL数据库存储数据。该平台为进一步加强水文信息管理提供关键技术支持。

关键词:水文数据;Socket;C/S

中图分类号:TP311.13文献标识码:A文章编号:1003-5168(2020)17-0013-03

Design and Implementation of Hydrological Database Management Platform Based on Socket

GUO Hao HU Xiaofeng FU Hangshuai

(Henan Water & Power Engineering Consulting Co., Ltd.,Zhengzhou Henan 450000)

Abstract: The hydrological data is an important basis for hydrological research and analysis, scientific management of hydrological data is the key to achieving hierarchical visualization, graphic query and statistical analysis. The Socket-based hydrological database management platform uses Microsoft Visual Studio 2015 as the development platform, uses MFC to build a hydrological database management platform framework, and uses SQL databases to store data. The platform provides key technical support for further strengthening hydrological information management.

Keywords: hydrological data;Socket;C/S

水文遥测站是水文信息采集的重要设施,随著我国水利信息化的不断完善和通信技术的不断发展,全国76%以上的水文遥测站实现了自动测报,所采集的水文要素值是流域管理的重要数据来源与主要参考依据。但目前已建的水文遥测系统缺乏对水文信息的统一发布与管理,严重影响水文信息的共享与综合管理[1-3]。基于此,本文提出建立基于Socket的水文数据库管理平台,依据基础水文数据库表结构及标识符标准,实现水文信息的科学管理、快速查询与统计的直观展示。系统采用TCP标准通信协议,完成服务端和客户端的信息传输,同时服务端和数据库分离,通过ADO数据库连接,实现了C/S的经典三层架构,使系统更易使用和安全[4-5]。该平台服务器端和数据库架构于Windows Server 2012 R2系统,数据库采用Microsoft SQL Server 2008。

1 TCP通信协议

在传输层,TCP协议和UDP协议是信息传递的两个主要协议。TCP是一种面向连接的可靠的通信协议,即不用主机之间的通信需要通过“三次握手”建立连接,而UDP则提供了无连接的服务,当报文发送之后无法得知其是否安全完整到达,因此本平台使用面向连接的可靠TCP实现Socket通信。TCP使用面向连接的可靠的双向通信数据流,使用“三次握手”传输数据。

2 Socket通信涉及的基本函数

2.1 创建套接字

M_Socket=Socket(AddressFamily,SocketType,ProtocolType);AddressFamily指定Socket地址簇类型,使用AF_INET,即TCP/IP协议簇;SocketType指定Socket请求协议类型,使用SOCK_STREAM,即表明数据基于TCP传输;ProtocolType指定Socket请求协议,使用0。

2.2 绑定套接字与服务器地址

Sockaddr_inaddr定义一个Sockaddr_in结构体addr;addr.sin_family=AF_INET,定义结构体通信协议为TCP/IP协议;Addr.sin_port=htons(6000),定义该结构体的通信端口号为6000;Addr.sin_addr.S_un.S_addr=htonl(INADR_ANY),定义接受任意IP地址发送给服务端;Bind(M_Socket,(SOCKADDR*)&addr,sizeof(SOCKADDR)),该函数将本地主机以及端口号与所创建的套接字绑定起来。

2.3 监听连接

Listen(M_Socket,int backlog)函数在一个Socket的句柄上监听连接,可以让M_Socket参数引用的Socket句柄标记成一个被动式的Socket,即可以用accept()函数去接受进来的连接请求。

2.4 建立连接

Connect(M_Socket,(structsockaddr *)&server_addr, sizeof(structsockaddr));connect()用于建立连接,M_Socket表示欲建立连接的本地套接字描述符,指出对方套接字保存着IP地址和端口号的结构体指针。

2.5 接受连接请求

Accept(M_Socket,sIP,*nPORT)用于面向连接服务器,表示接受客户机发来的连接请求。

2.6 发送和接收数据

Send(M_Socket,const char FAR *mesg,len,flags)用于发送数据,M_Socket为本地套接字描述符,mesg指向存有发送数据的缓冲区的指针;Recv(M_Socket,char FAR *mesg,len,flags)用于接收数据,M_Socket为已连接的套接字描述符,mesg指向接收输入数据缓冲区的指针,长度为len,flags指定传输控制方式,如是否发送带外数据等。

2.7 关闭套接字

CloseSocket(M_Socket)在完成通信链路的建立后,双方进行数据交互,完毕后关闭套接字。

3 软件设计

为实现水文数据库管理平台开发,同时避免虚拟机开发测试后部署物理机带来的问题,使用三台物理机分别部署相关环境。使用两台物理机分别部署数据库和水文数据库管理平台服务端,使用一台物理机对客户端和服务端程序进行编译。

首先,使用Windows Server 2012 R2服务器部署SQL Server 2008,创建水文数据库,设置数据库登录及平台管理账号密码,并根据基础水文数据库表结构及标识符标准创建相关表格,同时导入水文数据。其次,使用Windows 10专业版搭建Visual Studio 2015编译环境,编译服务器端和客户端程序,编译完成之后进行程序封装。

3.1 服务端编译

在CshuiwenApp的InitInstance()函数中添加数据库连接,连接实现代码如下:

if (!m_ado.Connect(CAdoLx::DBT_SQL, _T("shuiwen"), _T("administrator"), _T("sa"), _T("192.168.0.252"))){AfxMessageBox(m_ado.GetLastError());return FALSE;}

其中,调用CAdoLx实现数据库连接,shuiwen为创建的水文数据库,之后依次为数据库密码、数据库账号及数据库IP地址。

在CshuiwenApp的InitInstance()函数中添加登录窗口类,实现数据库连接登录。连接在实现代码如下:sqlstr.Format(_T("SELECT * FROM admin WHERE 用户名='%s' AND 密码='%s' "), str1, str2)。要保證其和数据库内账户与密码相匹配。

3.1.1 查询模块实现。strsql.Format(L"select * from ‘%swhere STCD=%s AND YR BETWEEN ‘%s AND %s order by STCD ASC ")需要客户端传递查询命令以及查询的表名和限定性条件,服务端从数据库调取数据并发送给客户端。

3.1.2 导出模块实现。CFileDialogdlg(FALSE, _T("xls"), _T("FileList"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Excel 文件(*.xls)|*.xls||")); dlg.m_ofn.lpstrTitle = _T("文件列表另存为")获取文件存在的路径调用系统中Excel驱动;sSql.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"), sDriver, strFilePath, strFilePath)将驱动、路径及文件格式化赋值给sSql,创建循环重新赋值给sSql,database.ExecuteSQL(sSql)执行sql语句实现Excel表格的插入操作。

3.1.3 统计分析模块实现。string s = "select ‘%s from ‘%s order by DTDesc";string s = "select ‘%s from ‘%s order by MTHDesc" string s = "select ‘%s from ‘%s order by YRDesc"通过安装TeeChart控件,通过编辑框修改TeeChart图的样式属性,如标题、是否3D显示、背景色、x和y轴范围大小等,并且通过sql语句选取需要统计的数据,实现按天/月/年的统计曲线的绘制。

3.2 客户端编译

添加CTreeCtrl控件,m_root = m_tree.InsertItem(_T("基础水文数据库"));HTREEITEM m_ribiaolei;m_ribiaolei =m_tree.InsertItem(_T("日表类"),m_root);设置日表类、旬表类、月表类、年表类及其子树,构建树形列表。

添加CListCtrl控件,m_ctllist.InsertColumn(0, _T("STCD"), LVCFMT_CENTER, 100, 0);m_ctllist.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);按照每个表分别插入不同表的列名,根据选中的表名在CListCtrl控件上显示不同的表,添加查询、导出、统计分析按钮,实现对指令和参数的传递。

4 运行结果与分析

使用Windows Server 2012 R2服务器部署水文数据库管理平台服务端。分别使用Windows XP、Windows 7、Windows 10部署客户端,对水文数据管理平台进行测试分析。

4.1 编译并执行Server端程序

双击debug目录下server.exe,此时,服务器端程序准备就绪,等待客户端请求连接。

4.2 启动client端程序

双击debug目录下client.exe,弹出登录界面,因连接服务端的IP地址及端口号已写入程序,如果输入账号、密码后成功登录,就表明成功连接服务器端。

4.3 实现互相通信

连接成功后,弹出管理窗口,客户机可自由发送查询、导出、统计分析命令及参数。当选定限定条件,点击查询按钮时,CListCtrl控件显示查询内容;点击导出按钮,将查詢内容保存至本地;点击统计分析按钮,会弹出统计分析结果窗口。

5 结果分析

结果表明,服务器和客户端在成功连接后能够实现用户登录、查询、导出、统计分析等功能,结果在窗体界面中显示。经测试,客户端可在多种Windows操作系统下较好地和服务器进行数据交互,达到了预期目的,较好地实现了水文数据库平台的管理。

6 结语

基于Socket的水文数据库管理平台通过使用C++提供的Socket连接池构建了经典的三层结构,服务器作为中间层访问数据库,同时将数据信息返回至客户端。由于客户端、服务端与数据库的分离增加了数据的安全性,当已有功能需要改变时,客户端无须重新编译。因此,该平台不仅保障了系统安全,也避免了重要数据和功能的外漏,使整个系统稳定安全运行。

参考文献:

[1]周相丽,贺旭东.基础水文数据库导入导出工具设计与实现分析[J].河南水利与南水北调,2017(2):38-39.

[2]王飘.基于ArcEngine的水文空间数据库管理系统开发及应用研究[D].武汉:华中科技大学,2018.

[3]董玲燕,马瑞,杨春花.基于ArcSDE的数字流域模型系统数据库构建方式研究[J].长江科学院院报,2011(12):103-106.

[4]况润元,朱元峰,周凡.基于GIS的贡水流域水文信息分析系统设计与实现[J].水电能源科学,2013(2):180-182.

[5]王海峰,张伟.基于JavaSocket及数据库连接池的农业监测系统[J].物联网技术,2016(2):27-28.

猜你喜欢
通信协议控件水文
际华高分子材料高科产业园能源管理系统设计
使用“填表单”微信小程序 统计信息很方便
基于.net的用户定义验证控件的应用分析
浅议互联网技术在水文档案管理中的应用
江西省水文文化建设的思考
水文档案的特点作用与管理分析
基于R8C的汽车OBD通用故障诊断仪设计
利用VF6.0的Timer控件实现动画效果
SIP协议系统模型的形式化研究
Spreadsheet控件在Delphi数据库系统中的编程与应用