手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>delphi>列表

用Delphi建立通讯与数据交换服务器—Transceiver技术剖析(下)

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

以下是Port Builder中对comSource对象数组的实例化部分
begin //Create COM/ Receive Port
itmp:=high(comSource) 1;
// 获取comSource的当前最大个数,itmp为integer变量
SetLength(comSource,itmp 1); // 添加一个comSource数组成员
comSource [itmp]:=TCOMPort.Create(self);// 实例化成员
comSource[itmp].Name:= 'Receive' inttostr(isource);
//设置Name属性为'Receive' Port ID,isource为整型的当前PortID
comSource [itmp].Tag:= itarget;//设置为其所在Channel的target ID
NullTest:=rece.Fields['Address'].value;
//得到系统配置COMFace的值,NullTest为Variant变量
if (NullTest <>null) and (trim(NullTest)<>'') then
begin
comSource [itmp].ComFace:=NullTest; //将有效值赋与ComFace
NullTest:=rece.Fields['interval'].value;
//得到系统配置中COM对象获取数据的触发时间间隔
SetTimer(application.handle,isource,NullTest*60000,nil);
//为当前Port建立用于定时收取数据的触发时钟, isource为Port ID
end
else
comSource [itmp].Tag:=-1;//初始化失败,标识为无效Port
end;
comSource是用于在一定的时间间隔后对ComFace中定义的接口进行调用并获取数据的Source类Port,相应comTarget的实现与其类似,只是由于向comTarget的ComFace提交数据是一个实时过程,所以不需要用到触发间隔,省略建立时钟的两条语句即可。其它类型的Port对象创建和初始化大同小异。如,另一个MailTarget实现片段:
begin //Create SMTP/Send Port
itmp:=high(MailTarget) 1;
SetLength(MailTarget,itmp 1);
MailTarget[itmp]:=TIdSMTP.Create(self);
MailTarget[itmp].Name:=’send’ inttostr(itarget);
MailTarget[itmp].Tag:=3;// 设置为Target Port类型标识
NullTest:=rece.Fields['Address'].value; //邮件服务器地址
if (NullTest <>null) and (trim(NullTest)<>'') then
MailTarget[itmp].Host :=NullTest
else bValid:=false;
NullTest:=rece.Fields['Port'].value; //邮件服务器端口
if NullTest <>null then
(if NullTest<>0 then MailTarget[itmp].Port :=NullTest)
else bValid:=false;
NullTest:=rece.Fields['user'].value;//登录用户名
if NullTest <>null then
MailTarget[itmp].UserId :=NullTest
else bValid:=false;
NullTest:=rece.Fields['password'].value;//登录口令
……………
……………
end;
或许你会有这样的疑惑,大量的Transceiver Shell通讯组件在运行时被Port Builder创建,Transceiver Service的性能会高吗?事实上,Port Builder的使命是在ServiceCreate事件发生时一次性完成的,Shell Port的数目只会影响Transceiver Service的初始化速度,Shell Port的通讯速度和Transceiver Servicer的整体性能将不受影响,当然系统资源可能会占用更多一些。
v. 事件的动态分配和处理
在Transceiver Shell所支持的若干种通讯Port当中,使用TServerSocket(可能您更倾向于使用Indy的通讯组件,但这并不违背Transceiver Service的设计思想,只是Shell层面的修改或增加而已)实现的TCPSource是比较有特点的一种,因为TServerSocket作为一种Source Port,不同于COM或POP3之类需要定时触发的对象,它是在Transceiver Service启动后时刻处于监听状态,当有ClientSocket连接并发送数据时产生相应事件的组件。以下是TCPSource的实例化片段:
begin //Create TCP/Receive Port
itmp:=high(TCPSource) 1;
SetLength(TCPSource,itmp 1);
TCPSource [itmp]:=TServerSocket.Create(self);
TCPSource [itmp].OnClientRead:=TCPServersClientRead;
//分配OnClientRead事件的处理过程为TCPServersClientRead
TCPSource [itmp].OnClientError:=TCPServerClientError;
//分配OnClientError事件的处理过程为TCPServerClientError
TCPSource [itmp].Name:= 'Receive' inttostr(isource);
//设置Name属性为'Receive' Port ID
TCPSource [itmp].Tag:=itarget; //设置为其所在Channel的target ID
TCPSource [itmp].Socket.Data:=@ TCPSource [itmp].Tag;
//将此Port对象的target ID作为指针数据附于Socket对象上
……………
……………
end;
回来接着看我们的comSource的处理,在实例化时我们为其建立了触发时钟,但如何来处理时钟触发时的事件呢?同理,也是事件处理的动态分配。
comSource的时钟的处理定义可在ServiceCreate事件处理中加入: application.OnMessage:=Timer;
实现对消息处理的重载,当有Application的消息产生时,Timer就将被触发,在Timer事件中我们过滤处理时钟触发的WM_TIMER消息,就可以按Port ID和类型实现对特定Source Port的数据获取方法的调用:
Procedure TCarrier.Timer(var Msg: TMsg; var Handled: Boolean);
var stmp:string;
Obj:TComponent;
begin
if Msg.message =WM_TIMER then//处理时钟消息
begin//根据触发消息的Port ID找到定义此消息的对象
Obj:=FindComponent('Receive' inttostr(Msg.WParam));
if obj=nil then exit;//没有找到就退出处理
stmp:=obj.ClassName;//反射获得此Port对象的类型信息
if stmp='TIdPOP3' then GetPOP3(TIdPOP3(Obj));
if stmp='TIdFTP' then GetFTP(TIdFTP(obj));
if stmp='TFilePort' then GetFile(TFilePort(Obj));
if stmp='TCOMPort' then GetCOM(TCOMPort(Obj));
//调用COMSource的数据获取过程
……………
……………
end;
end;
vi. 获取数据
以下是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为约定的数据提取结束标志

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!