|
在編製工程時,有時需要在兩個客戶端間進行數據通信。比如,客戶端A和客戶端B需要實現聊天功能,當客戶端A在畫麵中敲入一行文字“你好!”時,希望在客戶端B的相應畫麵中立刻收到並顯示這行文本。同樣,客戶端B也可以向客戶端A發送文本。
在老版本軟件中,實現這項功能將是一件很麻煩的事。我們自然想到使用數據庫點來進行通訊。我們可以在客戶端A中建立一個數據庫點AtoB,通過遠程數據源將其參數DESC連接到客戶端B中的AtoB.DESC上,當客戶端A畫麵輸入文字時,立刻將其賦值給AtoB.DESC,由數據庫通知另一端的AtoB.DESC發生變化,還要在客戶端B上編寫數據改變腳本,當AtoB.DESC改變時通知客戶端B的畫麵做相應反應。同樣,重複上一過程實現由客戶端B到客戶端A的數據通知,而且我們需要再創建一對新的數據庫點BtoA,因為聊天過程中數據往返是並行的,所以通訊應該在兩對數據庫點中進行。
倘若我們發送的不僅僅是簡單文本,而是其他信息呢?比如:一條包含若幹整型、實型、字符串等信息的數據,一條關於畫麵切換、腳本執行的指令文本。盡管依然可以通過一個數據庫點的DESC參can數shu進jin行xing傳chuan遞di,可ke是shi在zai接jie收shou端duan如ru何he將jiang所suo接jie收shou到dao的de信xin息xi按an期qi望wang的de格ge式shi解jie析xi呢ne?也ye許xu可ke以yi考kao慮lv再zai創chuang建jian若ruo幹gan數shu據ju庫ku點dian,每mei個ge數shu據ju庫ku點dian隻zhi傳chuan遞di一yi個ge數shu據ju,這zhe樣yang一yi來lai又you帶dai來lai新xin的de問wen題ti:無法預知數據的個數、格式,解析這些數據也會帶來大量腳本編寫工作;如果是多個客戶端間通訊,那麼上麵所說的工作將要重複的次數=從m個客戶端中取出2個客戶端的組合個數,例如:從3個客戶端中取出2個客戶端的組合個數為3、從10個客戶端中取出2個客戶端的組合數是50。那麼這將是一項令人望而卻步的工作。另外,新增的數據庫點無疑對項目成本來說是個挑戰。
youmeiyouyizhongshouduan,keyibushiyongshujukudianjiunengshixiankehuduanjianshujutongxin,erqiechuandideshujuyiguifandexingshifasonghejieshou,bingtigongfangbiandejiexifangfa?daanshi:有。紫金橋軟件6.5版本新增的會話組件就可以專門解決這類問題。
簡介
會話組件是一種實現客戶端之間通訊的窗口組件。它通過同一數據網絡中的某個DB作為通訊中介,在不同客戶端之間實現異步數據通信,其運行的一般原理圖如下。
 
會話組件運行在客戶端的窗口中,而db.exe僅僅作為數據通信的中介。上圖中帶箭頭的直線代表數據流向,其中紅色的直線及虛線表示了客戶端A發送給客戶端B的數據走向情況,藍色的直線及虛線則表示了客戶端B發送給客戶端A的數據走向情況。在這個數據網絡中,任何客戶端之間都可以使用會話組件進行數據通信。
概念介紹
客戶端:指view.exe或infoview.ocx(IE客戶端)。
通信組:zaiyigewangluozhongsuoyouxuyaoxianghutongxindekehuduanzuchengleyigetongxinzu。zhegewangluokeyishiyitaiwangwangluo,keyishichuankouwangdeng。tongxinzuzhongderenheyigechengyuanjunkeyihezuzhongqitachengyuanjinxingshujutongxin。tongxinzukeyijiaocha,jiyigekehuduankeyitongshiweilianggetongxinzuzhongdechengyuan。
會話名:在一個通信組中,每個會話組件對象在通信時使用的唯一標識。
中介節點:在(zai)一(yi)個(ge)通(tong)信(xin)組(zu)中(zhong),為(wei)所(suo)有(you)成(cheng)員(yuan)客(ke)戶(hu)端(duan)提(ti)供(gong)通(tong)訊(xun)媒(mei)介(jie)的(de)網(wang)絡(luo)節(jie)點(dian)。同(tong)一(yi)個(ge)組(zu)中(zhong)的(de)所(suo)有(you)客(ke)戶(hu)端(duan)的(de)中(zhong)介(jie)節(jie)點(dian)必(bi)須(xu)指(zhi)向(xiang)該(gai)網(wang)絡(luo)中(zhong)的(de)同(tong)一(yi)個(ge)節(jie)點(dian)。這(zhe)個(ge)節(jie)點(dian)可(ke)以(yi)是(shi)這(zhe)個(ge)網(wang)絡(luo)中(zhong)的(de)任(ren)意(yi)一(yi)個(ge)有(you)DB.exe運行的節點,該節點所在計算機中的客戶端可以不參與數據通信。
具體實現
- 配置中介數據源
選定中介節點後,在需要進行數據通信的客戶端中建立指向中介節點的數據源,如果本機恰好為中介節點,那麼使用“本地”數據源就可以了。
- 創建組件對象
進入客戶端工程的組態環境中,創建一個窗口,然後打開子圖選擇畫麵,找到“組件、複雜精靈/高級”選項卡,雙擊“會話組件”圖標,一個會話組件被創建在當前窗口中,將其命名。
- 配置組件對象
雙擊組件,出現配置界麵,如下圖所示:
 
在“數據源”處選擇事先指定的中介數據源。
在“自身名稱”處填寫本會話組件對象的會話名。
在“對方名稱”處填寫當前發送數據的目標會話組件對象的會話名。
- 數據發送
數據發送的是通過會話組件的提供的兩個函數來實現的:
BOOL Send(String FuncionName, ObDataTable Tab)
BOOL SendTo(String DestName, String FuncionName, ObDataTable Tab)
這兩個函數的功能是向目標客戶端發送一條信息,其中參數Tab為ObDataTable 類型的對象指針,Tab中包含了本次發送的所有信息。參數DestName為指定的目標客戶端的會話名。也就是說,如果使用函數Send則目標客戶端為組態時指定的客戶端,如果使用函數SendTo則可以動態指定目標客戶端。
參數FuncionName為wei目mu標biao客ke戶hu端duan會hui話hua組zu件jian所suo在zai窗chuang口kou的de自zi定ding義yi函han數shu名ming,這zhe個ge函han數shu是shi回hui調tiao函han數shu,當dang目mu標biao客ke戶hu端duan收shou到dao這zhe條tiao信xin息xi後hou會hui自zi動dong調tiao用yong這zhe個ge窗chuang口kou函han數shu。其qi函han數shu形xing式shi規gui定ding為wei:
void FuncName(String SrcName, ObDataTable& Tab)
其中參數SrcName為本條信息的發送客戶端的會話名,Tab為發送的內容。
- 數據接收
數shu據ju接jie收shou是shi通tong過guo上shang述shu回hui調tiao函han數shu來lai處chu理li的de。在zai接jie收shou端duan會hui話hua組zu件jian對dui象xiang所suo在zai窗chuang口kou中zhong創chuang建jian回hui調tiao函han數shu,注zhu意yi回hui調tiao函han數shu的de名ming字zi及ji參can數shu類lei型xing一yi定ding要yao與yu規gui定ding一yi致zhi。用yong戶hu可ke以yi在zai回hui調tiao函han數shu體ti內nei編bian寫xie收shou到dao信xin息xi後hou的de處chu理li動dong作zuo。
在一個雙向數據通信的結構體係中,一個客戶端既是數據發送端同時也是數據接收端,所以每個客戶端都要實現數據發送和數據接收。
進階
- 會話組件對象與客戶端
huihuazujiandebenzhishichuangkouzujian,zhejiuyiweizhetongyikehuduanzhongkeyichuangjianduogehuihuazujianduixiang,danshimeigehuihuazujianduixiangyinggaiyongyouweiyidehuihuaming。keyitongguorangzhexiehuihuazujianduixiangzhixiangbutongzhongjieshujuyuan,laishixianyubutongtongxinzuchengyuankehuduandetongxun。
- 動態切換中介數據源
假設在組態時指定了會話組件的中介數據源為DS1,那麼在運行時可以通過調用數據源函數SetNetAddr來動態切換其指向的網絡結點,從而切換中介數據源。
- 如何發送廣播
通過會話組件提供的函數void GetUserNames(String Array Names),可以在運行時得到當前通信組中所有通信成員的會話名,然後針對所有會話名發送信息以便達到廣播的目的。
- 通過會話組件能傳遞哪些數據
從會話組件的發送及回調函數來看,數據是通過數據表對象(ObDataTable)來傳遞的,ObDataTable是一種比較實用的表格,可以同時傳遞多行多列的文本、數值等數據,但是無法直接傳送文件。
- 關於超時
yinweishejiwangluotongxin,suoyizaiwangluozhuangkuangjiaochashenzhishiduankaideqingkuangxiawufabaozhengshujutongxindechangtongxinghejishixing,yincixuyaozixingchulifasongchaoshi。yibanzaijieshoudaoshujuhouyinggaimashangfanhuiyitiaoxinxigaozhifasongduanbentiaoshujuyijingchenggongjieshou,ruguofasongduanmeiyouzaiguidingshijianneishoudaofankuixinxi,zerenweishichaoshi。
|