郭浩 胡曉峰 付航帥
摘 要:水文數據是水文研究和分析的重要依據,水文數據的科學管理是實現分級可視化、圖文查詢和統(tǒng)計分析的關鍵。基于Socket的水文數據庫管理平臺采用Microsoft Visual Studio 2015作為開發(fā)平臺,利用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
水文遙測站是水文信息采集的重要設施,隨著我國水利信息化的不斷完善和通信技術的不斷發(fā)展,全國76%以上的水文遙測站實現了自動測報,所采集的水文要素值是流域管理的重要數據來源與主要參考依據。但目前已建的水文遙測系統(tǒng)缺乏對水文信息的統(tǒng)一發(fā)布與管理,嚴重影響水文信息的共享與綜合管理[1-3]?;诖?,本文提出建立基于Socket的水文數據庫管理平臺,依據基礎水文數據庫表結構及標識符標準,實現水文信息的科學管理、快速查詢與統(tǒng)計的直觀展示。系統(tǒng)采用TCP標準通信協(xié)議,完成服務端和客戶端的信息傳輸,同時服務端和數據庫分離,通過ADO數據庫連接,實現了C/S的經典三層架構,使系統(tǒng)更易使用和安全[4-5]。該平臺服務器端和數據庫架構于Windows Server 2012 R2系統(tǒng),數據庫采用Microsoft SQL Server 2008。
1 TCP通信協(xié)議
在傳輸層,TCP協(xié)議和UDP協(xié)議是信息傳遞的兩個主要協(xié)議。TCP是一種面向連接的可靠的通信協(xié)議,即不用主機之間的通信需要通過“三次握手”建立連接,而UDP則提供了無連接的服務,當報文發(fā)送之后無法得知其是否安全完整到達,因此本平臺使用面向連接的可靠TCP實現Socket通信。TCP使用面向連接的可靠的雙向通信數據流,使用“三次握手”傳輸數據。
2 Socket通信涉及的基本函數
2.1 創(chuàng)建套接字
M_Socket=Socket(AddressFamily,SocketType,ProtocolType);AddressFamily指定Socket地址簇類型,使用AF_INET,即TCP/IP協(xié)議簇;SocketType指定Socket請求協(xié)議類型,使用SOCK_STREAM,即表明數據基于TCP傳輸;ProtocolType指定Socket請求協(xié)議,使用0。
2.2 綁定套接字與服務器地址
Sockaddr_inaddr定義一個Sockaddr_in結構體addr;addr.sin_family=AF_INET,定義結構體通信協(xié)議為TCP/IP協(xié)議;Addr.sin_port=htons(6000),定義該結構體的通信端口號為6000;Addr.sin_addr.S_un.S_addr=htonl(INADR_ANY),定義接受任意IP地址發(fā)送給服務端;Bind(M_Socket,(SOCKADDR*)&addr,sizeof(SOCKADDR)),該函數將本地主機以及端口號與所創(chuàng)建的套接字綁定起來。
2.3 監(jiān)聽連接
Listen(M_Socket,int backlog)函數在一個Socket的句柄上監(jiān)聽連接,可以讓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)用于面向連接服務器,表示接受客戶機發(fā)來的連接請求。
2.6 發(fā)送和接收數據
Send(M_Socket,const char FAR *mesg,len,flags)用于發(fā)送數據,M_Socket為本地套接字描述符,mesg指向存有發(fā)送數據的緩沖區(qū)的指針;Recv(M_Socket,char FAR *mesg,len,flags)用于接收數據,M_Socket為已連接的套接字描述符,mesg指向接收輸入數據緩沖區(qū)的指針,長度為len,flags指定傳輸控制方式,如是否發(fā)送帶外數據等。
2.7 關閉套接字
CloseSocket(M_Socket)在完成通信鏈路的建立后,雙方進行數據交互,完畢后關閉套接字。
3 軟件設計
為實現水文數據庫管理平臺開發(fā),同時避免虛擬機開發(fā)測試后部署物理機帶來的問題,使用三臺物理機分別部署相關環(huán)境。使用兩臺物理機分別部署數據庫和水文數據庫管理平臺服務端,使用一臺物理機對客戶端和服務端程序進行編譯。
首先,使用Windows Server 2012 R2服務器部署SQL Server 2008,創(chuàng)建水文數據庫,設置數據庫登錄及平臺管理賬號密碼,并根據基礎水文數據庫表結構及標識符標準創(chuàng)建相關表格,同時導入水文數據。其次,使用Windows 10專業(yè)版搭建Visual Studio 2015編譯環(huán)境,編譯服務器端和客戶端程序,編譯完成之后進行程序封裝。
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為創(chuàng)建的水文數據庫,之后依次為數據庫密碼、數據庫賬號及數據庫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 ")需要客戶端傳遞查詢命令以及查詢的表名和限定性條件,服務端從數據庫調取數據并發(fā)送給客戶端。
3.1.2 導出模塊實現。CFileDialogdlg(FALSE, _T("xls"), _T("FileList"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Excel 文件(*.xls)|*.xls||")); dlg.m_ofn.lpstrTitle = _T("文件列表另存為")獲取文件存在的路徑調用系統(tǒng)中Excel驅動;sSql.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"), sDriver, strFilePath, strFilePath)將驅動、路徑及文件格式化賦值給sSql,創(chuàng)建循環(huán)重新賦值給sSql,database.ExecuteSQL(sSql)執(zhí)行sql語句實現Excel表格的插入操作。
3.1.3 統(tǒng)計分析模塊實現。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語句選取需要統(tǒng)計的數據,實現按天/月/年的統(tǒng)計曲線的繪制。
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控件上顯示不同的表,添加查詢、導出、統(tǒng)計分析按鈕,實現對指令和參數的傳遞。
4 運行結果與分析
使用Windows Server 2012 R2服務器部署水文數據庫管理平臺服務端。分別使用Windows XP、Windows 7、Windows 10部署客戶端,對水文數據管理平臺進行測試分析。
4.1 編譯并執(zhí)行Server端程序
雙擊debug目錄下server.exe,此時,服務器端程序準備就緒,等待客戶端請求連接。
4.2 啟動client端程序
雙擊debug目錄下client.exe,彈出登錄界面,因連接服務端的IP地址及端口號已寫入程序,如果輸入賬號、密碼后成功登錄,就表明成功連接服務器端。
4.3 實現互相通信
連接成功后,彈出管理窗口,客戶機可自由發(fā)送查詢、導出、統(tǒng)計分析命令及參數。當選定限定條件,點擊查詢按鈕時,CListCtrl控件顯示查詢內容;點擊導出按鈕,將查詢內容保存至本地;點擊統(tǒng)計分析按鈕,會彈出統(tǒng)計分析結果窗口。
5 結果分析
結果表明,服務器和客戶端在成功連接后能夠實現用戶登錄、查詢、導出、統(tǒng)計分析等功能,結果在窗體界面中顯示。經測試,客戶端可在多種Windows操作系統(tǒng)下較好地和服務器進行數據交互,達到了預期目的,較好地實現了水文數據庫平臺的管理。
6 結語
基于Socket的水文數據庫管理平臺通過使用C++提供的Socket連接池構建了經典的三層結構,服務器作為中間層訪問數據庫,同時將數據信息返回至客戶端。由于客戶端、服務端與數據庫的分離增加了數據的安全性,當已有功能需要改變時,客戶端無須重新編譯。因此,該平臺不僅保障了系統(tǒng)安全,也避免了重要數據和功能的外漏,使整個系統(tǒng)穩(wěn)定安全運行。
參考文獻:
[1]周相麗,賀旭東.基礎水文數據庫導入導出工具設計與實現分析[J].河南水利與南水北調,2017(2):38-39.
[2]王飄.基于ArcEngine的水文空間數據庫管理系統(tǒng)開發(fā)及應用研究[D].武漢:華中科技大學,2018.
[3]董玲燕,馬瑞,楊春花.基于ArcSDE的數字流域模型系統(tǒng)數據庫構建方式研究[J].長江科學院院報,2011(12):103-106.
[4]況潤元,朱元峰,周凡.基于GIS的貢水流域水文信息分析系統(tǒng)設計與實現[J].水電能源科學,2013(2):180-182.
[5]王海峰,張偉.基于JavaSocket及數據庫連接池的農業(yè)監(jiān)測系統(tǒng)[J].物聯網技術,2016(2):27-28.