上一页 1 ··· 148 149 150 151 152 153 154 155 156 ··· 204 下一页
摘要: 新的datasnap使用INDY10的线程池。不管你知不知道,DATASNAP都是使用线程池了,这和MIDAS不同,MIDAS默认是没有线程池的。跟踪INDY10线程池类TIdSchedulerOfThreadPool的代码:procedure TIdSchedulerOfThreadPool.Init;begin inherited Init; Assert(FThreadPool<>nil); if not IsDesignTime then begin if PoolSize > 0 then begin with FThreadPool.LockList do try 阅读全文
posted @ 2012-03-03 22:52 delphi中间件 阅读(3773) 评论(0) 推荐(0)
摘要: 其实不论什么方法,归根揭底都是通过传递对象的指针来达到效果的。方法一:procedure SendString(strMSG: string);var Data: tagCOPYDATASTRUCT; pBuf: PChar;begin GetMem(pBuf, Length(strMSG) + 1); try ZeroMemory(pBuf, Length(strMSG) + 1); StrPCopy(pBuf, strMSG); Data.cbData:= Length(strMSG); Data.dwData:= Length(strMSG); Data.lpData:= pBuf; S 阅读全文
posted @ 2012-03-03 08:41 delphi中间件 阅读(904) 评论(0) 推荐(0)
摘要: 主控程序(通常是EXE程序),各插件(DLL/BPL),它们都是独立的工程,它们组成一个工程组。1. 主控程序和各插件工程中,BUILD WITH RUNTIME PACKAGE都勾选上。整个程序运行的时候,保障了所有的VCL对象只有唯一的一份,杜绝了VCL对象相互之间发生冲突的可能性。此种方式最为稳定和安全,建议使用此方式。但此种方式有一个缺点:发布程序的时候,DELPHI RTL包,第三方控件的BPL运行时包要一起打包发布,否则程序将不能运行。此种方式编译出来的EXE/DLL/BPL一般体积会比较小,往往只有几百K,因为运行时包没有编译进来。2. 主控程序和各插件工程中,BUILD WIT 阅读全文
posted @ 2012-02-26 15:26 delphi中间件 阅读(2419) 评论(1) 推荐(0)
摘要: 网上有一些讲以RAD方式设置主从表的演示,但是在实际当中不实用。function TsvrDM.ApplyUpdates(const ModuleId: WideString;sqlId:ShortInt; Delta0, Delta1, Delta2, Delta3: OleVariant): Shortint;const sql='Select * from %s where 1<>1'; var aData: array of OleVariant; i:integer; conn:TADOConnection; qry:TADOQuery; dsp:TDat 阅读全文
posted @ 2012-02-26 14:23 delphi中间件 阅读(2072) 评论(0) 推荐(1)
摘要: TCLIENTDATASET.DATA, TCLIENTDATASET.DELTA, TDATASETPROVIDER.DATA,它们的DATA属性的类型都是OLEVARIANT。中间层和客户端之间通过OLEVARIANT来传递数据集的数据。为了提高数据传输的效率,发送方在传输之前可以先压缩数据,然后把压缩的数据发送给接收方。接收方收到发送方送来的压缩数据,先进行数据解压。使用开源的ZLIB进行数据的压缩和解压。XE2已经自带此控件,需要引用system.zlib单元。原理:将OLEVARIANT数据流化,然后对流进行压缩,还原成OLEVARIANT以后再发送。procedure Stream 阅读全文
posted @ 2012-02-26 14:20 delphi中间件 阅读(1915) 评论(1) 推荐(1)
摘要: midas支持使用OLEVARIANT序列化对象,最新的DATASNAP支持使用OLEVARAINT和JSON来序列化对象。下面的代码演示OLEVARINAT序列化TPARAMS, TPARAMETERS对象。OLEVARIANT本质上是一个BYTE数组。还原TPARAMS对象procedure VariantToParams(input:OleVariant;par:TParams);// TParam 's property: fieldType, paramName, ParamType, value, size// paramType default value ptinput 阅读全文
posted @ 2012-02-26 14:04 delphi中间件 阅读(2080) 评论(0) 推荐(0)
摘要: 最近在写一个基于XE2 DATASNAP的中间层,以前也写过基于DCOM的MIDAS中间层,看到网上一些同仁对中间层的提问。我摘录俩个典型的提问,如下:第一个提问:Midas三层程序,如何支持大量用户同时请求连接?系统结构: TClientDataSet -> TSocketServer -> scktsrvr.exe -> RemoteDataModule -> ADO 要求:允许500-1000个客户端同时“请求”连接,服务器和客户端均不能死掉。现状:在现有的程序中,只要同时“请求”连接的客户端达到一个较大的数量,例如80或100,应用服务器就停止响应了。客户端尝试 阅读全文
posted @ 2012-02-25 09:30 delphi中间件 阅读(6008) 评论(1) 推荐(1)
摘要: 获得客户端的信息 记得datasnap 2009时,要得到客户端信息,非官方的方法,要去搞什么DSConnectEventObject.ChannelInfo.Id,弄成 TIdTCPConnection。xe2就好得多了。仍然是在DSServer的OnConnect 事件里,DSConnectEventObject.ChannelInfo.ClientInfo就是客户端的信息。能得到啥? 看代码 TDBXClientInfo = recordIpAddress: String;ClientPort: String;Protocol: String;AppName: String;end;也就 阅读全文
posted @ 2012-02-23 22:50 delphi中间件 阅读(1384) 评论(0) 推荐(1)
摘要: 服务器端如何防止DDOS 前面说到DSServer的OnConnect是socket已经完全搭好client都调用connect的服务器方法了才触发的,如果我们到这里才来想起拒绝不合法的ip连接,已经挺晚了:socket已经连接好了,都已经创建线程开始通讯了。怎么做才能在最开始的socket握手里,就让捣蛋鬼死在萌芽中呢。要解决这个问题,当然得从TDSTCPServerTransport下手,因为ServerTransport才是真正负责通讯的,可以在它的OnConnect事件下手procedure TServerContainer1.DSTCPServerTransport1Connect( 阅读全文
posted @ 2012-02-23 22:49 delphi中间件 阅读(1373) 评论(0) 推荐(1)
摘要: TDSAuthenticationManager的用法 xe开始有了TDSAuthenticationManager,这个主要用来做用户认证,用法也很简单 服务器端 1.TDSAuthenticationManager有两个主要的事件 在这个事件里面,看看检测连上来的用户名,密码是否合法,valid 阅读全文
posted @ 2012-02-23 22:47 delphi中间件 阅读(3180) 评论(0) 推荐(1)
上一页 1 ··· 148 149 150 151 152 153 154 155 156 ··· 204 下一页