李 博,成方林,葉 穎,王 鵬,張翼飛
(國家海洋技術中心 天津 300112)
基于Socket的邊遠島傳輸系統(tǒng)設計與實現*
李 博,成方林,葉 穎,王 鵬,張翼飛
(國家海洋技術中心 天津 300112)
為了保證邊遠海島系統(tǒng)監(jiān)控數據在傳輸過程中的安全性、完整性、實時性以及傳輸效率,文章結合Socket網絡編程接口和多線程技術,提出了在邊遠海島數據傳輸系統(tǒng)中采用服務器端和客戶端程序的系統(tǒng)機構。以實際業(yè)務化監(jiān)控過程中進行測試,結果表明系統(tǒng)可以有效地保證傳輸數據的安全性、完整性和實時性,增加了傳輸數據的線程數量、發(fā)送數據緩沖區(qū)域和接受數據緩沖區(qū)域提高數據傳輸效率。
邊遠海島;套接字;數據傳輸;多線程
邊遠海島數據的利用與監(jiān)控系統(tǒng)由岸基數據中心、島基子系統(tǒng)和通信子系統(tǒng)組成,岸基數據中心與島基子系統(tǒng)通過無線衛(wèi)星和地面專線兩種方式進行通信。其中,島基子系統(tǒng)由遠程視頻子系統(tǒng)、被動聲吶子系統(tǒng)、水下地質災害子系統(tǒng)、陸源地震子系統(tǒng)以及集成工作站組成,集成工作站負責接收、處理、顯示、發(fā)送、備份各子系統(tǒng)傳來的數據。岸基數據中心由衛(wèi)星接收系統(tǒng)、輔助決策系統(tǒng)和岸基數據服務器組成。其中,岸基數據服務器完成專線數據接收、處理、備份以及為服務決策系統(tǒng)提供數據源。
在邊遠海島數據傳輸系統(tǒng)中,利用套接字作為通信系統(tǒng)的接口可以實現數據的跨平臺傳輸,采用多線程可以有效提高傳輸效率。本文將介紹在邊遠島監(jiān)控系統(tǒng)中以套接字和多線程為基礎的數據傳輸子系統(tǒng)的設計與實現。
本系統(tǒng)采用了Socket套接字和多線程技術。Socket套接字是一種廣泛的、開放的、支持多種協議的網絡編程接口。該協議支持單一的通信,既Internet域。各通信進程通過這個域互相之間用Internet協議進行通信。套接字(socket)是通信的基石,是支持網絡通信的基本單元??梢詫⑻捉幼挚醋霾煌鳈C間的進程進行雙向通信的端點。一個正在被使用的套接字接口都有它的類型和與其相關的進程。套接字可以分為兩類:流套接字(stream socket)和數據報套接(datagram socket)。流套接字是面向連接的,通信雙方進行數據交換前,必須建立一條路徑,這樣既確定了它們之間存在的路由,又保證了雙方都是活動的并可彼此響應的。本系統(tǒng)采用了流套接字作為網絡編程的接口[1]。
多線程是為了使得多個線程并行的工作以完成多項任務,以提高系統(tǒng)的效率。線程是在同一時間需要完成多項任務的時候被實現的。多線程塊模型(MTA)在每個進程里只有一個塊而不是多個塊。這單個塊控制著多個線程而不是單個線程。所有的線程都是相同的塊的一個部分,并且可以共享,比單線程模型執(zhí)行速度都要快。
2.1 系統(tǒng)設計及建模
本系統(tǒng)的開放環(huán)境為Eclipse 2.6及JDK 6.0,開發(fā)語言為J2EE[2]。本系統(tǒng)分為服務器端和客戶端,其中服務器端運行在岸基數據中心的服務器上,客戶端運行在海南值班室的集成工作站上。系統(tǒng)的設計思想是:海南值班室內將各子系統(tǒng)生成的數據通過輔助傳輸程序以文件拷貝的方式發(fā)送到客戶端??蛻舳瞬捎梦募A輪詢的方式對各子系統(tǒng)拷貝到客戶端的文件所在文件夾進行掃描,再根據服務器的IP地址和服務器設定的端口連接到岸基數據中心的服務器端,然后經過文件壓縮、計算、打包等步驟將文件發(fā)送到服務器端。服務器端連續(xù)監(jiān)聽自己定義的端口,當接收到客戶端發(fā)送的文件后,對文件進行解壓、分發(fā)、計算等??蛻舳艘约皞鬏斴o助程序都需要有配置文件,里面記錄經常需要更改的參數,如傳輸文件的目的地址、接收文件路徑、文件類型、文件備份路徑等??蛻舳税l(fā)送數據后,根據文件類型將文件備份,服務器端接收文件后將文件放置到設定的目錄下,待集成展示系統(tǒng)和輔助決策系統(tǒng)使用。服務器和客戶端應用程序開啟時,都會在相應的路徑建立一個txt文件作為日志文件記錄接收或發(fā)送的數據文件的信息[3]。
端口是一種抽象的軟件結構 (包括一些數據結構和緩沖區(qū))[4]。當某一進程通過系統(tǒng)調用和某一端口建立連接后,傳輸層傳給該端口的數據都被該進程所接收,同樣,進程發(fā)送給傳輸層的數據都通過該端口輸出。每個端口都擁有一個端口號,端口號用于表示同一臺計算機不同的進程(應用程序)。一般1024以下的為系統(tǒng)端口,如HTTP的端口號為80,FTP的端口號為21等。本系統(tǒng)中,服務器端預留端口1111和1112,分別負責監(jiān)聽客戶端信息以及接收客戶端發(fā)送的數據??蛻舳祟A留端口1111和1112分別負責監(jiān)聽服務器端信息反饋和發(fā)送數據包。系統(tǒng)在客戶端以及服務器端采用多線程技術。服務器端的主線程負責接收由客戶端發(fā)送的數據并在日志中記錄相關信息,輔助線程負責監(jiān)聽客戶端連接請求并建立相應連接。圖1為數據接收端的用例圖。
圖1 數據接收端的用例圖
客戶端的主線程負責發(fā)送數據并在日志文件中添加相應記錄信息,輔助線程負責發(fā)起與服務器端的連接請求并建立與服務器的連接。圖2為數據發(fā)送端的用例圖。
圖2 數據發(fā)送端的用例圖
2.2 數據接收端程序設計
數據接收端程序主要功能函數如下:
(1)監(jiān)聽端口函數:
Socket sock=new Socket(“100.100. 100.20”,1111);//監(jiān)聽100.100.100.20的1111端口//情況
TCPListener tcpls=new TCPListener (127.0.0.1,1111);//利用本機的1111端口進行//監(jiān)聽
tcpls=sock.connect();
(2)接收文件數據:
//接收文件
File f=new File();
f=sock.receive(buffer,totalrec,left, SocketFlag,None);
//寫日志文件,記錄數據塊號
Stream Writer stw=null;
stw=new Stream Writer(m_rec_log_ dir,true);
stw.Writelog(tmplog);
stw.close();
(3)解壓
ZipInputStream s;
s=new ZipInputStream(File.Openr Read (Fileto Un Zip));
int sz=s.Read(data,0,data.length ());
Stream Writer.write(0,data,sz);
(4)接收信息反饋
sock.send(FileNameandblocknum,Totalsend,left,Socket Flag.Non);
2.3 數據發(fā)送端程序設計
(1)連接數據接收端
ServerSocket serv=new ServerSocket (1111);//啟動本地1111端口建立socket連接
Socket sock=serv.accept();//接受連接(2)數據壓縮
ZipInputStream s;
s=new Zip OutputStream(File.Create (ZipfileName));
BufferedOutputStream buffer=new Buffered OutputStream(1024);
s.Write(buffer,0,buffer.length);
(3)數據發(fā)送
File f=new File(String path);//path設定為傳輸文件的路徑,文件夾
File ff[]=f.list();
DataOutputStream dos=new DataOutput-Stream(sock.get OutputStream());
dos.writeLong(ff[0].byte[1024]);//設置文件輸出流,設置每次傳輸數據的大小為//1024
(4)發(fā)送信息反饋
sock.receive(FilenameandBlock Num,Totalrecv,left,Socketflag.Non);
3.1 系統(tǒng)配置與運行結果
專線和Vsat是數據傳輸的途徑,對于實際業(yè)務化運行的系統(tǒng)而言可以認為其是透明的。在此我們以專線傳輸為基礎對傳輸系統(tǒng)進行實驗。根據邊遠海島項目實際的應用需求我們在文件發(fā)送端進行系統(tǒng)配置,其配置文件為一個Access數據庫,表1中錄入的信息如表1所示。
表1 數據傳輸系統(tǒng)配置信息
其中:第一列為傳輸接收端的ip地址;第二列為數據發(fā)送端所傳輸文件所在路徑;第三列為數據接收端接受文件的路徑;第四列為數據發(fā)送端的數據備份路徑;第五列為信息存儲類別,實時信息按照文件形成的時間存儲到備份路徑,一般信息統(tǒng)一存儲在備份路徑。
3.2 測試結果及其分析
對2011年6月19日至12月16日的數據進行傳輸實驗,其運行結果如下所述:① 水文氣象系統(tǒng)數據傳輸:實現實時傳輸,每個文件的平均傳輸時間為0.5 s,文件大小約10 k。②水聽聲吶數據傳輸:實現實時傳輸,每個文件的平均傳輸時間為1 s,文件大小約37 k。③視頻數據傳輸:實現連續(xù)不間斷傳輸,每個文件的平均傳輸時間為8 s,文件大小從1 k~7 M不等,其中多數文件在200 k左右。④磁力計數據文件:實現連續(xù)不間斷傳輸,每個文件輸出時間為4 s,文件大小為50 k。⑤水下地震儀文件:實現連續(xù)傳輸,每個文件傳輸時間15 s,文件大小為6.8 M。⑥陸源地震信息文件:實現連續(xù)傳輸,每個文件傳輸時間9 s,文件大小2.1 M。
由于系統(tǒng)中的水文氣象信息、水聽聲吶信息的生成周期為每分鐘1個文件,磁力計、水下地震儀信息為每20分鐘1個文件,陸源地震信息文件每小時1個文件,視頻系統(tǒng)根據掃描范圍內經過船只數量確定文件,且平均每小時15個文件,因此本系統(tǒng)基本實現邊遠島文件傳輸需求。同時,利用多線程技術有效保障了不同信息的同步傳輸。
本系統(tǒng)的發(fā)送端與接收端之間通過Socket進行連接,因此不需要考慮系統(tǒng)所處的運行環(huán)境。將多線程引入系統(tǒng)的傳輸設計中,提高了網絡的數據傳輸效率。直接應用J2EE提供的類大大簡化了程序設計與實現。
[1] 汪曉平,俞俊,李功.精通JAVA網絡編程[M].北京:清華大學出版社,2005.
[2] 耿詳義,張躍平.JAVA 2實用教程(第二版)[M].北京:清華大學出版社,2004.
[3] 徐小蕾,蘇厚勤.分層系統(tǒng)Socket通信軟件的設計與實現[J].計算機應用與軟件,2009,26(1):173-175.
[4] 周炎濤,李立明.TCP/IP協議下網絡編程技術的實現[J].航空計算技術,2002,32(3):122-125.
國家海洋公益性項目“邊遠島的利用與監(jiān)控技術研究與示范”(200805079).