劉 爽,云 健
(大連民族學院計算機科學與工程學院,遼寧大連 116605)
C/C/S模式實時通信軟件設計與實現
劉 爽,云 健
(大連民族學院計算機科學與工程學院,遼寧大連 116605)
根據某引航站引航管理信息平臺的建設目標,設計了基于客戶端/客戶端 (中轉服務器)/服務器模式的實時通信軟件;介紹了該通信軟件的網絡拓撲結構,分析了服務器端和客戶端基于 TCP/IP協議的通信過程及接收發送數據工作流程;重點討論了如何利用嵌入式數據庫、變長鏈表及多線程技術實現數據通信的完整性、實時性和安全性,并給出了 LoadRunner對通信軟件的測試結果。實踐表明,該通信軟件運行可靠,傳輸穩定。
C/S模式;多線程;嵌入式數據庫;實時;通信
為確保港口水域運輸安全、有序,根據某引航站引航調度管理的實際需求開發了引航管理信息平臺。該平臺利用現代化的管理手段加強港口的信息交換,實現對港口中移動目標的實時監控和動態跟蹤,加強了調度引航的統一管理,以此達到提高整體工作效率、降低成本、促進管理的目的,為企業提供信息化建設的全面解決方案。
通信軟件是整個管理信息平臺的核心環節,實現了導航系統與監控系統、引航調度系統之間的通信,即向監控系統發送船舶、車輛動態信息,從監控系統接收它船的動態信息;向引航調度系統發送計劃請求信息、引航開始/結束時間、天氣預報請求信息、風速儀請求信息,從引航調度系統接收引航計劃、天氣預報信息和風速儀信息。管理信息平臺總體網絡拓撲結構如圖 1。
通信軟件分為服務器端、客戶端中轉服務器端、局域網客戶端 3部分。服務器端通過串口接收通信運營商轉發過來的船舶 A IS/GPS、車輛GPS定位數據,解析存入Oracle數據庫,根據配置文件讀取有效轉發中心 IP地址和端口號列表,建立監聽 Socket,接受客戶端連接請求,維護客戶端Socket鏈表。連接建立成功則把接收到的二進制數據流通過 TCP/IP協議發送到各客戶端中轉服務器處。中轉服務器接收到服務器發來數據后依據配置文件 UDPClient.txt,讀取各終端用戶的 IP地址和端口號,并根據用戶數目每 20個用戶創建一個套接字,然后通過UDP協議將二進制格式數據發送到局域網各客戶端,同時對接收到的數據解析以數據表格形式顯示。局域網客戶端只接收數據,按通信協議解析,以數據表格形式顯示或是疊加到電子海圖上顯示即可。
數據通信的效率決定了整個管理信息平臺的性能,因此采用了嵌入式數據、變長鏈式存儲及多線程技術來實現通信軟件的實時、準確、高效。

圖1 通信軟件網絡拓撲結構圖
引航管理信息平臺監控系統使用 C++作為開發語言,Visual Studio 2005作為開發工具,引航調度系統使用 Java作為開發語言,MyEclipse6.5作為開發工具,為實現與兩系統的兼容并保證通信的實時高效,通信軟件采用 C++作為開發語言。整個通信軟件設計開發過程采用面向對象方法,使用UML2.0作為描述工具。
服務器端工作過程[1-2]如下:首先與通信運營商轉發 GPS/A IS數據中心建立 TCP/IP連接,啟動接收數據線程,負責接收二進制數據文件;處理數據線程,負責解析二進制數據,在界面上顯示并存入服務器的 Oracle數據庫;監聽客戶端連接線程,負責建立用戶 Socket和監聽 Socket的連接;發送數據線程負責向合法客戶端(中轉服務器)發送二進制數據。其中的 Socket采用阻塞類 CSocket作為基類,CSocket類在非阻塞 Socket基礎之上實現了阻塞操作,在阻塞期間實現了消息循環[3-4]。
在服務器與客戶端(中轉服務器)通過 TCP/ IP協議建立連接過程中,服務器端維護一個合法客戶端請求鏈表,對長時間不接收數據的客戶端或是網絡連接出現故障的客戶端定期刪除更新,對合法客戶端接受請求發送數據。
客戶端(中轉服務器)工作過程如下:當客戶端應用程序向服務器發出連接請求時,啟動連接線程,負責與服務器建立網絡連接,定時檢查是否出現網絡故障或服務器重啟等情況,出現錯誤則重連。服務器首先讀取 config.txt文件,查找客戶端 IP地址是否合法,合法則接受連接請求。建立完連接后客戶端會再向服務器發送讀取數據請求,服務器端處理請求后開始發送數據。當指定端口開始有數據寫入,中轉服務器啟動讀數據線程,直接讀取網卡緩沖區數據,寫入到一個變長鏈表中,避免數據丟失;在視圖的初始化更新操作中啟動數據處理進程,從消息鏈表中讀取數據,逐條解析,插入或更新數據庫中數據,并顯示到界面上,處理完的數據則全部刪除。在接收數據的同時,啟動發送數據線程,讀取UDPClient.txt配置文件獲取局域網內各終端用戶的 IP地址和端口號,每 20個客戶端建立一個基于UDP協議的 Socket,之后開始持續傳送二進制數據文件。
第二級客戶端即局域網客戶端軟件功能較簡單,就是接收二進制數據,按通信協議解析,存入數據庫,可供監控系統調用在電子海圖上顯示監視目標的動態情況。
服務器端和兩級客戶端應用程序接收數據解析過程基本相同,即在指定端口接收數據,按通信協議格式解析接收到的數據,存入數據庫表,其活動圖如圖2。
兩級客戶端發送數據活動圖如圖 3。
服務器端應用程序通過短信向船載或車載終端發送天氣信息、風向信息,實現過程是把需要發送的數據封裝成規定的通信協議格式,由無線運營商轉發到終端 S IM卡上。而兩級客戶端通過服務器向終端發送引航計劃請求信息或是引航開始/結束時間等數據時過程類似,只是發送的目的地是指定的 IP地址和端口。

圖2 接收數據處理活動圖

圖3 兩級客戶端發送數據活動圖
3.1 嵌入式數據庫
為降低應用程序與大型數據庫交互的代價,第一級客戶端采用嵌入式數據庫 Sqlite3[2]。
Sqlite3作為嵌入式數據庫,占有資源少,小巧、速度快。Sqlite3與 access一樣是文件型數據庫,就是說,一個數據庫就是一個文件,在此數據庫里可以建立很多的表,建立索引、觸發器等等,但實際上就是一個文件。備份這個文件就備份了整個數據庫,占用存儲空間非常小。
Sqlite3不需要任何數據庫引擎,即使用Sqlite3來保存一些用戶數據,也不需要安裝數據庫。它提供了一系列 C函數接口,通過這些接口,傳遞一些標準 SQL語句就能夠操縱數據庫。
Sqlite3使用讀、寫鎖控制對數據庫的訪問。典型地,其他嵌入式的 SQL數據庫引擎同時只允許一個進程連接到數據庫。目前,只有 Sqlite3的SQL數據庫引擎能處理如此多的并發操作,即允許多個進程同時打開一個數據庫,同時讀一個數據庫。當有任何進程需要寫數據時,必須在更新過程中鎖住數據庫文件。
3.2 多線程技術
多線程編程技術[6]是將程序任務分成多個并行的子任務,特別是在網絡編程中,很多可以并發執行的功能利用多線程可以提高程序的快速響應。為了保證用戶總能夠在很短的時間內完成與應用程序的交互,本文的通信軟件服務器端和一級客戶端都采用了多線程技術。
服務器端應用程序主要由接收數據線程、處理數據線程、監聽客戶端連接線程、發送數據 4個線程組成。程序開始即啟動監聽客戶端連接線程,負責建立用戶 Socket和監聽 Socket的連接。連接建立后啟動接收數據線程,負責接收二進制數據文件;處理數據線程由接收線程啟動,負責解析二進制數據,在界面上顯示并存入服務器數據庫。
客戶端中轉服務器應用程序啟動 4個線程,包括連接線程、接收數據線程、處理數據線程、發送數據線程,完成數據的接收和解析、顯示、傳送功能。
使用多線程技術就存在數據同步問題。該通信軟件在測試過程中就出現了二級客戶端數據與服務器數據不同步,且數據過少問題。經調試發現,對接收數據的變長鏈表加鎖時間存在問題。在對鏈表未加鎖操作之前,可能會出現將處理線程切換到接收線程的情況,當再切換到該線程的時候,m_s MsgQueue的大小就發生了變化,隨著鏈表數量的增大,查找時間越來越長,而放到鏈表后面的數據長期得不到執行,就產生了程序運行不順暢,數據更新慢現象。針對這一情況,把加鎖操作時間點提前,保證每次線程跳到 OnProcess Message()函數時一次執行完畢,避免發生鏈表數量越來越大的現象。
3.3 變長鏈式存儲
鏈式存儲可以零散分配存儲空間,比線性存儲結構插入、刪除等操作的效率更高。通信軟件中的服務器和兩級客戶端接收數據的線程都使用了變長鏈表來存儲接收的數據,一是保證存取操作效率,二是變長適應了不同數量終端的需求。
同時把變長鏈表和多線程結合使用。如中轉服務器數據處理線程中當鏈表中的元素個數位于100和 200之間時該線程的優先級提高到THREAD_PR IOR ITY_ABOVE_NORMAL,當優先級在 200以上時將優先級提高到 THREAD_PR IOR ITY_H IGHEST,低于 100時設成正常模式。此外在鏈表數據量大于零時將休眠時間縮短到 10 ms,否則提高到 500 ms。對鏈表的動態維護一是防止鏈表中留有過多數據得不到及時的入庫和發送,二是防止 CPU分配過少資源給接收線程,使接收緩沖區留有過多數據得不到及時接收,能夠自適應調整線程的優先級,合理利用 CPU資源。
由于通信軟件的關鍵性能在于高效傳輸數據,對界面要求不多,因此這里不再給出界面效果,只給出測試軟件 LoadRunner[7]對 200個移動目標同時發送數據的測試結果。圖 4為W indows資源圖。

圖 4 通信軟件測試W indows資源圖
其縱坐標是資源使用率 (Resources Usage)。W indows資源圖描述W indows主機的系統資源摘要。最高的一條曲線為 CPU使用率,第二、第三條曲線為以 K字節計算和M字節計算的物理內存可用字節數,最低的第四條曲線是磁盤驅動器忙于讀或寫入提供服務所用的時間百分比。由此圖可知,服務器的 CPU使用率均值為 66.164%,磁盤驅動器忙的時間百分比均值為 4.99%,可用物理內存在 2149.57 M左右,說明通信軟件性能能夠滿足 200個用戶并發操作的請求。
本文開發的系統目前已在某引航站交付使用,系統運行穩定。本系統服務器和兩級客戶端之間的數據傳輸采用客戶端/客戶端/服務器模式,基于 Visual Studio 2005開發平臺編程實現,而服務器、客戶端軟件均采用多線程技術。實踐表明,嵌入式數據庫、變長鏈表和多線程技術可以實現高性能可靠的數據通信。
[1]劉爽,賈傳熒,陳鵬.基于 C/S結構的車輛監控系統設計與實現[J].計算機工程與設計,2005,26(12): 3320-3323.
[2]劉爽,史國友,張遠強.基于 TCP/IP協議和多線程的通信軟件的設計與實現 [J].計算機工程與設計, 2010,31(7):1417-1420,1522.
[3]施煒,李錚,秦穎.W indows Sockets規范及應用 -W indows網絡編程接口 [M].北京:清華大學出版社,2000.
[4]吳暾華.網絡視頻監控系統中數據傳輸的實現 [J].計算機工程與設計,2004,25(6):971-974.
[5]OWENSM.The Definitive Guide to SQLite[M].New York:Apress,2006.
[6]HUGHES C,HUGHES T.C++面向對象多線程編程[M].周良忠,譯.北京:人民郵電出版社,2003.
[7]于涌.軟件性能測試與 LoadRunner實戰[M].北京:人民郵電出版社,2008.
(責任編輯 劉敏)
Design and I mplementation of Real-t ime Commun ication Software in Client/Client/ServerM ode
L IU Shuang,YUN Jian
(College of Computer Science&Engineering,Dalian NationalitiesUniversity,Dalian Liaoning 116605,China)
To achieve the goal of a pilotage management infor mation platfor m for some piloting station,we designed real-time communication software based on the client/client(relay server)/servermode.Thispaperpresents the network topology of the software and analyzes the communication process between the server and the client through TCP/IP and the workflow of data reception/transmission.The discussion is focused on how to ensure the integrity,real time and security of data communication using embedded databases,variable-length chain tables and multithreading technology. It also gives the result of communication software tests made with LoadRunner.It turns out that the sof tware runs reliablywith steady trans mission.
client/servermode;multithread;embedded database;real-time;communication
book=9,ebook=234
TP393.09
A
1009-315X(2010)05-0477-04
2010-6-21
大連民族學院博士啟動金資助項目(20076207)。
劉爽 (1977-),女,滿族,遼寧錦州人,副教授,博士,主要從事智能交通系統、機器學習研究。