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