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

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

編輯:Delphi

以上是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;

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