Delphi中編制分布式多層應(yīng)用系統(tǒng)服務(wù)資源瀏覽器_第1頁
Delphi中編制分布式多層應(yīng)用系統(tǒng)服務(wù)資源瀏覽器_第2頁
Delphi中編制分布式多層應(yīng)用系統(tǒng)服務(wù)資源瀏覽器_第3頁
Delphi中編制分布式多層應(yīng)用系統(tǒng)服務(wù)資源瀏覽器_第4頁
Delphi中編制分布式多層應(yīng)用系統(tǒng)服務(wù)資源瀏覽器_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、Delphi中編制分布式多層應(yīng)用系統(tǒng)服務(wù)資源瀏覽器作者:陳立平 本文選自:賽迪網(wǎng) 2002年12月25日 本文詳細介紹了在Delphi7中如何利用TSocketConnection控件設(shè)計開發(fā)一個通用的分布式多層應(yīng)用系統(tǒng)客戶端輔助開發(fā)工具分布式多層應(yīng)用系統(tǒng)服務(wù)資源瀏覽器。 在用Delphi開發(fā)分布式多層應(yīng)用系統(tǒng)過程中,對于開發(fā)客戶端程序的人員來說,了解分布式多層架構(gòu)應(yīng)用服務(wù)器所提供的資源(如:服務(wù)名稱、提供者名稱等)是一項經(jīng)常遇到的工作。利用這些參數(shù),客戶端才能夠正確地與服務(wù)器端程序連接并工作。 然而,在實際工作過程中,這些資源名稱大都是以口頭或E-Mail的方式,告知客戶端開發(fā)人員;而一旦這

2、些資源名稱被改或者此類名稱在一個開發(fā)服務(wù)器上較多時,就會發(fā)生程序不能與服務(wù)器正確連接的情況,或者造成服務(wù)名資源管理上的混亂。 另外,客戶端開發(fā)人員只有在開發(fā)出客戶端程序之后,才能夠與服務(wù)器端程序進行連接并進行測試,沒有前期通用的輔助工具與服務(wù)器進行交互,無形中增加了通信的開銷,降低了開發(fā)工作的效率。 那么,有沒有好的實現(xiàn)方法能夠做到自動列出指定服務(wù)器上的開發(fā)資源名稱,并能夠與之進行動態(tài)地連接和交互呢?這就是筆者開發(fā)多層應(yīng)用系統(tǒng)服務(wù)資源瀏覽器的原始初衷。關(guān)鍵技術(shù)對于分布式多層應(yīng)用系統(tǒng)來說,客戶端程序可通過DCOMConnection和SocketConnection控件與服務(wù)器端程序進行連接,這

3、里我們使用SocketConnection進行連接工作。因為,SocketConnection控件不但可以通過IP地址來連接COM服務(wù)器,而且也可以主機名方式來連接COM服務(wù)器。 關(guān)于分布式多層應(yīng)用系統(tǒng)服務(wù)資源瀏覽器實現(xiàn)的關(guān)鍵技術(shù)如下: 1如何取得指定IP地址或主機名稱上的服務(wù)資源名稱列表 利用SocketConnection控件的GetServerList方法可取得服務(wù)器上的服務(wù)名稱列表。詳細信息見程序。 2如何取得指定IP地址計算機,指定服務(wù)資源名稱的提供者名稱列表 利用SocketConnection的GetServer.AS_GetProviderNames來取得提供者名稱列表。詳細信

4、息見程序。 通過以上方法,我們可以取得指定IP地址計算機上的服務(wù)名稱列表和提供者名稱列表,客戶端就可以利用這些信息與服務(wù)器動態(tài)進行連接了。 程序具體實現(xiàn)1 界面制作 在Delphi7中,制作如下圖所示的界面。 說明:SocketConnection控件與服務(wù)器連接主要需要三個參數(shù):Address(IP地址)或Host(主機名),端口號(默認(rèn)是211,在服務(wù)器端可通過Borland Socket Server(scktsrvr.exe)程序設(shè)置監(jiān)聽的端口號),LoginPrompt(登錄是否提示輸入用戶名和密碼屬性)。通過讓用戶輸入的方式,可提高程序的靈活性。 2程序?qū)崿F(xiàn)中所用的公共函數(shù)和方法

5、/檢驗IP地址是否合法的函數(shù)function IsLegalIp(Str: string): Boolean;var I, K, DotCnt : Integer; Num: string; Arr: Array 1.4 of string;begin Result := False; DotCnt := 0; /由0.9, .組成 For I := 1 to Length(Str) do begin if Not (StrI in 0.9, .) then Exit else if StrI = . then inc(DotCnt); end; /點分隔符號數(shù)量應(yīng)該=3 if DotCnt

6、3 then Exit; For K := 1 to 3 do begin I := Pos(., Str); Num := Copy(Str, 1, I - 1); Delete(Str, 1, I); ArrK := Num; end; Arr4 := Str; try DotCnt := 0; For I := 1 to 4 do begin K := StrToInt(ArrI); /每字節(jié)的值應(yīng)介于0255之間 if (K = 0) and (K = 255) then Inc(DotCnt); end; /四個字節(jié)都滿足0255之間,則合法 if(DotCnt = 4) then

7、Result := True; except end;end;/在窗體的private節(jié)中添加如下procedure SetStatusText(PanelId: Integer; Text: string);procedure TMainFrm.SetStatusText(PanelId: Integer; Text: string);begin StatusBar1.PanelsPanelId.Text := Text;end; 3在Caption為取得服務(wù)列表按鈕的OnClick事件中書寫如下代碼: /以下為該按鈕OnClick事件處理代碼procedure TMainFrm.Butto

8、n8Click(Sender: TObject);var I : Integer; Cn: OleVariant; Str: string;begin Button1.Enabled := False; /設(shè)置連接按鈕不可用 Button2.Enabled := False; /設(shè)置關(guān)閉按鈕不可用 try SocketCn.Close; if IsLegalIp(Edit1.Text) then SocketCn.Address := Edit1.Text else SocketCn.Host := Edit1.Text; /設(shè)置登陸是否提示 SocketCn.LoginPrompt := C

9、heckBox3.Checked; /設(shè)置端口號 SocketCn.Port := SpinEdit1.Value; /取得服務(wù)列表 Cn := SocketCn.GetServerList; /如何將OleVariant字符串?dāng)?shù)組加入ServerListBox中 For I := VarArrayLowBound(Cn, 1) to VarArrayHighBound(Cn, 1) do begin Str := String(CnI); end; Button1.Enabled := True; /設(shè)置連接按鈕可用 except Raise; end;end; 4在Caption為連接按鈕

10、的OnClick寫如下代碼: procedure TMainFrm.Button1Click(Sender: TObject);var I : Integer; Name: string; Names: OleVariant; T1, T2: TTime;begin if ServerListBox.ItemIndex = -1 then begin MessageBox(Handle, 請選擇所使用的服務(wù)名稱, 提示, Mb_Ok + Mb_IconInformation); Exit; end; SocketCn.Close; /關(guān)閉,防止重復(fù)打開 try /指定SocketCn的服務(wù)名稱

11、 SocketCn.ServerName := ServerListBox.ItemsServerListBox.ItemIndex; /計算連接時間 T1 := Now(); SocketCn.Open; T2 := Now(); SetStatusText(1, 連接用時: + TimeToStr(T2 - T1); /取得Provider if SocketCn.Connected then begin Cds.RemoteServer := SocketCn; T1 := Now(); T2 := Now(); For I := VarArrayLowBound(Names, 1) t

12、o VarArrayHighBound(Names, 1) do begin Name := string(NamesI); end; SetStatusText(2, 取得Providers用時: + TimeToStr(T2 - T1); end; if SocketCn.Connected then Button2.Enabled := True; /設(shè)置關(guān)閉按鈕可用 except Raise; end;end; 5在Caption為關(guān)閉按鈕的OnClick寫如下代碼: procedure TMainFrm.Button2Click(Sender: TObject);begin if S

13、ocketCn.Connected then begin SocketCn.Close; end; Button2.Enabled := False; /設(shè)置Button2不可用end; 6在Caption為打開SQL(有結(jié)果)按鈕的OnClick寫如下代碼: /用于從所選的Provider中取得數(shù)據(jù),對于查詢可輸入SQL語句,對于表可直接/Open,即:CommandText := procedure TMainFrm.Button3Click(Sender: TObject);var T1, T2: TTime;begin if ProviderListBox.ItemIndex -1 t

14、hen begin try Cds.Close; /關(guān)閉客戶數(shù)據(jù)集控件 Cds.ProviderName := ProviderListBox.ItemsProviderListBox.ItemIndex; T1 := Now(); Cds.CommandText := Trim(Memo1.Text); Cds.Open; /有結(jié)果集的打開方式 T2 := Now(); SetStatusText(3, 查詢用時: + TimeToStr(T2 - T1); except Raise; end; end else MessageBox(Handle, 請選擇要使用的Provider, 提示,

15、 Mb_Ok + Mb_IconInformation);end; 7在Caption為運行SQL(無結(jié)果)按鈕的OnClick寫如下代碼: procedure TMainFrm.Button4Click(Sender: TObject);var T1, T2: TTime;begin if ProviderListBox.ItemIndex -1 then begin try Cds.Close; Cds.ProviderName := ProviderListBox.ItemsProviderListBox.ItemIndex; Cds.CommandText := Trim(Memo1.

16、Text); /設(shè)置SQL命令 T1 := Now(); Cds.Execute; /沒有返回結(jié)果的執(zhí)行方式 T2 := Now(); SetStatusText(3, 查詢用時: + TimeToStr(T2 - T1); except Raise; end; end else MessageBox(Handle, 請選擇要使用的Provider, 提示, Mb_Ok + Mb_IconInformation);end; 8在Caption為保存數(shù)據(jù)按鈕的OnClick寫如下代碼,用于將 procedure TMainFrm.Button5Click(Sender: TObject);beg

17、in if Cds.Active then begin With TSaveDialog.Create(Self) do begin if Execute then begin Cds.SaveToFile(FileName); end; end; end else MessageBox(Handle, 當(dāng)前數(shù)據(jù)集尚未打開, 提示, Mb_Ok + Mb_IconInformation);end; 9在Caption為裝載數(shù)據(jù)按鈕的OnClick寫如下代碼: procedure TMainFrm.Button6Click(Sender: TObject);begin With TOpenDia

18、log.Create(Self) do begin if Execute then try Cds.LoadFromFile(FileName); except Raise; end; end;end; 10Caption為保存更新按鈕的OnClick寫如下代碼: procedure TMainFrm.Button7Click(Sender: TObject);begin Cds.ApplyUpdates(0); /ClientDataSet保存更新end; 程序運行結(jié)果以下為在Windows98下本機測試的運行結(jié)果。在Windows2000Server和Internet網(wǎng)絡(luò)測試環(huán)境下,也測試通過;因安全考慮,具體網(wǎng)絡(luò)遠程測試用IP地址恕不見告。 說明: 1、在運行此程序之前,服務(wù)器端程序必須保證在系統(tǒng)中運行過,以完成服務(wù)注冊工作。 2、上圖右下腳標(biāo)題為Server的窗口為服務(wù)程序,在SocketCn連接時自動激活。 3、圖中,若選擇QueryProvider,則可以使用SQL腳本(包括數(shù)據(jù)語言-DDL);若選擇TableProvider,則不用輸入SQL語句(保證SQL命令為空),直接打開即可查看和編輯數(shù)據(jù)。 4、如果是本地測試,要首先運行Delphibin目錄下的scktsrvr.exe,用于網(wǎng)絡(luò)端口監(jiān)聽 和接收客戶端的連接。 5、對于服務(wù)器端程序來

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論