程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用Delphi建立通訊與數據交換服務器—Transceiver技術剖析(下)(5)

用Delphi建立通訊與數據交換服務器—Transceiver技術剖析(下)(5)

編輯:Delphi

以下是COMSource的數據獲取處理

procedure TCarrIEr.GetCOM(COMObj: TCOMPort);
var stmp:string;
COMInterface:OleVariant;
begin
try//根據ComFace的值建立COM組件對象
COMInterface:=CreateOleObject(COMObj.ComFace);
stmp:=COMInterface.GetData; //調用約定的接口方法,獲取數據
while stmp<>#0 do // #0為約定的數據提取結束標志
begin
DataArrive(stmp,COMObj.Tag);
//交由data Dispatcher統一處理, COMObj.Tag為對象所在Channel的Target Port ID
stmp:=COMInterface.GetData;
end;
COMInterface:= Unassigned;
except
COMInterface:= Unassigned;
end;
end;// 完成數據提取操作,釋放組件對象,直至下一次觸發調用

以下是TCPSource的數據獲取處理:

procedure TCarrier.TCPServersClIEntRead(Sender: TObject; Socket:TCustomWinSocket);
begin
DataArrive(socket.ReceiveText,integer(TServerWinSocket(sender).data^));
//交由data Dispatcher統一處理, 第二個參數為附於Socket對象sender上的Target Port ID指針值,
end;

不同類型的Source Port對象其接收數據的方式也不盡相同,但最終都將所接收到的數據交由data Dispatcher做統一處理。從實現層面講,每加入一種數據接收對象並實現其數據接收,就為Transceiver Shell實現了一種新的Source Port。注:此處作者只是實現了接收文本數據,可能用戶需要接收的是內存對象、數據流或二進制數據,對接收代碼稍做更改即可。

vii. 數據調度

Transceiver Service的數據調度是由data Dispatcher邏輯單元完成的,Data Dispatcher的主要任務是對從不同的Source Port接收到的數據進行統一的管理與控制、與Channel Controller協同工作,按Channel的定義向不同的Target Port進行數據分發、監視其發送結果成功與否,並根據發送結果和系統配置庫的設置決定數據是否需要提交到Queue Manager和Log Recorder進行緩沖和日志處理等等。接下來看看Source Port提交數據的DataArrive方法:

procedure TCarrIEr.DataArrive(sData:String;PortID:Integer);
var dTime:Datetime;
iLogID:integer;
bSendSeccess:Boolean;
begin
if sData='' then exit;//如數據為空則跳出
iLogID:=-1;
dTime:= now; //接收時間
if sData[length(sdata)]=#0 then sdata:=copy(sdata,1,length(sdata)-1);
//用於兼容C語言的的字符串格式
bSendSeccess:=DataSend(sdata,PortID) ;
//調用 Data Dispatcher發送調度方法,PortID為Target Port ID
if (TSCfg.LogOnlyError=false) or (bSendSeccess=false) then
iLogID:=writeLog(dTime, now,sData, PortID, bSendSeccess);
//根據系統配置信息中的日志處理規則和發送結果記錄日志
if (TSCfg.Queueing=True) and (bSendSeccess=false) then
PutQueue(dTime, now,sData, PortID, bSendSeccess, iLogID);
//根據封裝系統配置信息中Queue配置定義決定Queue處理
end;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved