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