以上是Data Dispatcher的DataArrive方法,其中Queue的處理是按照系統配置信息和發送狀態決定的,也可以調整為強制性的隊列化處理。下面是Data Dispatcher的DataSend方法,用於將數據按Target Port類型分發處理:
Function TCarrIEr.DataSend(sData:String;PortID:Integer):boolean;
var Obj:TComponent;
begin
DataSend:=false;
Obj:=FindComponent('Send'+inttostr(PortID)); //根據Port ID找到對象
if (obj=nil) or (obj.Tag =-1) then exit;
//對象不存在或因初始化失敗已被標識為無效Port
case obj.Tag of
1:DataSend:=PutTCP(TClIEntSocket(obj),sdata);
3:DataSend:=PutSMTP(TIdSMTP(obj),sdata);
5:DataSend:=PutFTP(TIdFTP(obj),sdata);
7:DataSend:=PutHTTP(TIdHTTP(obj),sdata);
9:DataSend:=PutFile(TFilePort(obj),sdata);
11:DataSend:=PutMSMQ(TMSMQPort (obj),sdata);
13:DataSend:=PutDB(TDBPort(obj),sdata);
15:DataSend:=PutCOM(TCOMPort (obj),sdata);
……………
……………
end;
end;
值得注意的是,如果沒有使用對象數組,而是每種類型的Port只有一個實例的話,處理數據分發處理的更佳辦法應該是使用回調(Callback)函數,但在現在的情況下,那將導致不知應該由對象數組中哪一個成員處理數據。另外,現在的處理方法使Transceiver Kernel與Transceiver Shell沒有徹底剝離,應該尋求更加抽象、獨立性好的處理方法。
viii. 數據發送
以下是TCP的發送
Function TCarrier.PutTCP(TCPOBJ:TClIEntSocket;sdata:string):Boolean;
var itime:integer;
begin
PutTCP:=false;
try
TCPOBJ.Close;
TCPOBJ.Open;
itime:=gettickcount;//起始時間
repeat
application.ProcessMessages;
until (TCPOBJ.Active=true) or (gettickcount-itime>5000);
//連接成功或5秒超時就跳出循環
if TCPOBJ.Active then
begin
TCPOBJ.Socket.SendText(sdata);
PutTCP:=true;//發送數據成功時,返回值才為True
end;
TCPOBJ.Close;
Except
TCPOBJ.Close;
end;
end;