2011年10月14日星期五

datasnap的初步 TDSTCPServerTransport的TCPServer

都知道TDSTCPServerTransport的后面默认其实是Indy来工作的,RO做通讯时,却可选择Indy,Synapse等,其实datasnap的设计者,也留下了口子给你扩展的。


TDSTCPServerTransport的Server其实和Indy无关,有关的是IIPTCPServer接口。也就是只要你实现了IIPTCPServer接口,就可以给TDSTCPServerTransport做Server。默认的IIPTCPServer接口的实现者是TIdTCPServerPeer,代码在IndyPeerImpl.pas里。
请看这一行
initialization 
  PeerFactory.RegisterPeer(IPImpId, IIPTCPServer, TIdTCPServerPeer);
这里就将IIPTCPServer 和 TIdTCPServerPeer关联起来了。TIdTCPServerPeer有一个TIdTCPServerIP的成员,而TIdTCPServerIP继承自TIdTCPServer。从而和Indy勾上了。
function TDSTCPServerTransport.CreateTcpServer: IIPTCPServer;
begin
  Result := PeerFactory.CreatePeer(IPImplementationID, IIPTCPServer, nil) as IIPTCPServer;
end;
这里创建IIPTCPServer时,其实PeerFactory根据RTTI,创建了一个TIdTCPServerPeer的实例。

留意一下 CreatePeer的第一个参数IPImplementationID,这个参数是TDSTCPServerTransport的属性,Help文档里啥也没解释,其实EMBT就是打算靠这个来给你做扩展的。缺省情况IPImplementationID为空,对应着了IndyPeerImpl.pas。



没有评论:

发表评论