摘 要: 提出一種具有平臺獨立性的基于Email的5層數據交換模型,以實現在異構的網絡、操作系統和數據庫管理系統之間交換數據。分析了該模型的工作原理和使用環境,分層設計并實現了該模型,最后給出了具體應用實例。
關鍵詞: Email 數據交換 防火墻 SMTP POP3
網絡技術和數據庫技術已經成為計算機軟件應用領域的二大熱點,同時,基于Intranet/Internet環境下企業、部門之間數據交換的次數越來越多,情況也越來越復雜。使用傳統的編程模式很難滿足一些特殊數據交換的要求。例如,勝利油田物資供應處價格管理科需要把所有供應商的產品報價及時匯總,進行統計、比較。這些供應商中有一部分是油田內部的企業(這些企業只能與油田局域網連通),還有一部分是分布在全國各地的供應商(這些企業只能與Internet連通)。如何通過網絡將數據進行匯總,一直是一個難題。解決該問題最簡單的方法就是使用B/S模式建立一個Web服務器,所有用戶都通過Web瀏覽器訪問該服務器。但是因為油田Intranet和外部Internet之間除了可以發送和接收電子郵件外,其他服務(如FTP、HTTP等)均被防火墻斷開。所以必須在Intranet和Internet上分別建立2個Web服務器,本文將介紹如何用Email數據交換模型來合并這2個服務器上的數據。
1 Email數據交換模型的工作原理
在Internet上,Email是常用的網上服務之一。用戶將郵件提交給郵件服務器后,還需要由服務器進行一系列的傳遞操作,才能將郵件傳送到目的地址所在的郵件服務器。這一傳送過程的實現依賴于簡單郵件傳輸協議(Simple Mail Transfer Protocol,SMTP)。SMTP定義了一套有效的郵件傳遞規則,它以協議的方式規定了網絡中全部郵件服務器共同遵守的準則。電子郵件服務除了依賴于SMTP之外,還需要郵局協議(Post Office Protocol,POP)的支持。SMTP負責郵件的傳遞:從客戶機到郵件服務器,以及服務器之間的傳遞工作。在傳遞過程中,如果網絡忙或者線路狀況不好,郵件服務器會每隔一定時間重新嘗試發送郵件,所以即使網絡不是很穩定,也可以發送成功。而POP協議能夠讓客戶檢索到由SMTP發送來的郵件,并將其下載到用戶本機。
該模型使用SMTP將需要交換的數據發送到特定的郵件服務器中,然后由郵件服務器完成郵件的發送工作;在接收端使用POP協議,定時檢測郵件服務器中是否有新郵件到達。如果有則判斷是否合法,若合法,則自動將數據下載到客戶端,然后自動保存到本地數據庫中。
2 Email數據交換模型的設計與實現
Email數據交換模型的體系結構如圖1所示。可以看到,該模型共分為5層。最底層(第1層)是Email服務器層(Email Server Layer),負責數據文件的發送和接收;最高層(第5層)是數據庫管理系統層(DBMS Layer),在通信終端存儲管理數據;中間各層分別是數據文件層(Data File Layer)、壓縮文件層(Compressed file Layer)和Email層;它們分別完成數據的導出、導入,壓縮、解壓數據文件,將壓縮文件封裝成Email、拆分提取數據文件等。
2.1 DBMS Layer的設計
數據庫管理系統層是最高層,用于存儲管理數據。在基于Internet或Intranet的異構數據庫環境中,數據庫可能包括Oracle、Sybase、MS SQL Server、DB2和ACCESS等類型。
2.2 Data File Layer的設計與實現
由于各終端的數據庫對數據的存儲結構、組織方式、信息描述存在差異,同時各個操作系統(Windows、Unix、Linux等)也可能存在差異,所以,這一層要完成2個功能:①導出,從源數據庫將特定條件下的數據轉換到指定格式的數據文件。②導入,把導出的數據文件轉換到目的數據庫中。根據不同的應用環境要求,數據文件可以是以下3種。
(1)XML半結構化數據文件
XML(Extensible Markup Language)是專門為Web應用設計的SGML(Standard Generalized Markup Language)的一個優化子集。數據交換是XML最重要的用途之一。由于XML具有可擴展性、自描述性和跨平臺性,所以使得不同計算機應用系統之間交換數據變得容易起來。XML同HTML類似,也是一種元標記語言,具有自描述性,同時也具有可擴展性,即使用者可以根據系統的要求創建新的標記。此外,XML是一種跨平臺的獨立于系統的標記語言。XML現已成為網絡系統中應用較廣的一種數據交換格式。
在導入、導出XML數據時,可以使用常用的編程語言,調用XML文件的接口SAX(Simple API for XML)或者DOM(Document Object Model)等對XML文件進行讀寫。
總體上看,XML能很好地實現異構數據庫之間的透明互操作,是一個不錯的數據交換媒介。但是如果每次導出部分數據,而且可能多次導出時,這種方法可能在目的數據庫中存在重復的數據,此時必須在插入數據前,先刪除重復的數據。
(2)SQL語句集合文件
SQL語句集合文件就是系統將源數據庫端的數據操縱語言都記錄下來,當用戶導出數據時,將這些操縱數據的SQL語句另存為固定格式的文件。在目的數據庫端,再重新執行這些SQL語句。SQL語句集合文件示例如下:
DELETE FROM 報價WHERE 廠家=′Intel′;
UPDATE報價SET 價格=2000 WHERE物碼=′20050501001′;
INSERT INTO 廠家VALUES(′intel′,′北京′,′010-88888888′,′CPU′);
這種方法在編寫導入、導出程序時非常簡單。但要注意,如果在異構數據庫之間交換數據,部分SQL語句可能要進行適當改寫。例如:如果源數據庫是ORACLE,則語句“UPDATE報價set物碼=substr(物碼,8,3)”,在目的數據庫SQL Server中應該是“UPDATE報價set物碼=substring(物碼,8,3)”,在目的數據庫ACCESS中應該是“UPDATE報價set物碼=mid(物碼,8,3)”。這些轉換影響了系統的跨平臺性。
(3)結構化數據庫文件的設計
結構化數據庫文件就是指類似ACCESS、EXCEL、DBF和TXT等的數據庫文件。這些基于文件管理的數據庫可以作為數據交換的媒介。在源數據庫端,將要傳輸的數據插入到中間數據庫文件中。在目的數據庫端將這些中間數據庫文件的數據插入到數據庫中。
在這類文件中,需要保證源數據庫、中間數據庫和目的數據庫中表的結構相同。這樣導入和導出程序就可以直接查詢,然后插入即可。
這種方法編寫程序簡單,但也存在跨平臺的問題,存在像XML那樣的可能會出現重復記錄的問題。用戶可以根據自己的實際情況,選擇不同的中間數據文件。
2.3 Compressed File Layer的設計與實現
在源數據庫端對導出的文件進行壓縮,在目的數據庫端對接收到的數據文件進行解壓,以便減小文件的大小,提高傳輸的速度。
可以在編程語言中調用一些常用壓縮文件,如Winzip。以下是在ASP(Active Server Pages)編程語言中調用Winzip的示例。
Set WshShell=server.CreateObject(″Wscript.Shell″)
path=Server.MapPath(″\″)
IsSuccess=WshShell.Run(path&″\wzzip.exe ″& path&″\import.zip″&path &″\dbf_downld\*.*″,1,true)
如果交換的數據文件都較小,則可以不對數據文件進行壓縮和解壓。
2.4 Email Layer的設計
發送端在這一層完成Email的封裝工作,接收端完成郵件的拆分工作。一個Email主要包括標題(Subject)、正文(Body)和附件(Attachment)等。其中在Attachment中加入壓縮文件,在Body中加入相關的備注信息,在Subject中加入特定的標識(以便系統能自動識別是否為需要傳輸的文件,避免其他垃圾郵件)。例如,在標題中用“EDC:”開始,這樣在接收到郵件后,就要首先判斷標題是否是以“EDC:”開始,如果是則為合法郵件,否則就不是。目的數據庫端主要流程如圖2所示。
2.5 Email Server Layer的設計與實現
發送端在這一層用SMTP協議完成Email的發送工作,接收端用POP3協議完成郵件的接收工作。在系統中,可以使用Socket編程完成郵件的發送和接收。但是,這種方法編寫程序比較復雜,本文不予討論。也可以使用一些第三方組件來完成郵件的發送和接收。例如:W3 Jmail可以滿足該模型的要求。以下是用該組件在VB中實現郵件的發送和接收。
//發送郵件
Dim msg As New jmail.Message
msg.MailServerUserName=txtUsername
msg.MailServerPassWord=txtPassword
msg.From=txtFromEmailAddress
msg.AddRecipient txtToEmailAddress
For i=0 To lstAttachments.ListCount - 1
lstAttachments.ListIndex=i
msg.AddAttachment(lstAttachments.Text)
Next i
msg.Subject=txtEmailSubject
msg.Body=txtEmailBodyOfMessage
msg.Send(txtEmailServer)
//接收郵件
Dim pop3 As New jmail.pop3
pop3.Connect txtUsername,txtPassword,txtEmailserver
For i=1 To pop3.Count
Set msg=pop3.Messages.Item(i)
Print msg.Body
Print msg.Subject
pop3.DeleteSingleMessage(i)
Next
3 基于Email的數據交換實例
該實例可以解決本文開頭提出的勝利油田物資供應處價格管理科的供應商報價問題。其系統的拓撲結構如圖3所示。
系統分別在油田的Intranet和外部Internet上設立2個Web服務器,分別供油田內部企業和全國各地其他企業上報產品價格。Internet網上的用戶在報完價格后,在本地保存,同時用戶可以點擊上報,將數據文件導出、壓縮、封裝郵件、發送郵件;局域網內的Web服務器定時到Email服務器(該Email服務器在Intranet和Internet上都可以訪問)上收取郵件、解壓、導入數據。最終在Intranet上的數據是完整的數據,供應處的領導可以隨時進行查詢,對各個廠家的報價、同一廠家各個時間的報價等進行比較。
這樣,該系統就可以穿過油田局域網和外部Internet的HTTP、FTP等協議的防火墻,通過SMTP和POP3協議完成數據的匯總,極大地方便了用戶的使用。
4 結束語
基于Email的數據交換模型是使用SMTP協議和POP3協議,完成不同數據庫數據的交換。該模型可以跨越除SMTP/POP3之外的防火墻,具有平臺獨立性,可以在異構的網絡、操作系統和數據庫管理系統之間交換數據,適應惡劣的網絡環境,完成傳統的數據交換模型無法或者很難完成的工作。該模型具有非常廣的應用和推廣價值。
參考文獻
1 朱韻篪,程代杰.基于XML的分布式數據交換中間件模型設計.計算機工程與設計,2003;24(8)
2 黃紅明,尹志兵,熊桂喜.基于XML的數據交換技術的研究及其在大型系統中的應用.計算機應用研究,2003;20(12)
3 劉驚雷,王香紅,華臻.基于WinSock的電子郵件后臺監聽程序設計.計算機工程,2003;29(1)