摘要: DataSnap 2009的服务器对象的生命周期依赖于DSServerClass组件的设置当DSServer启动时从DSServerClass组件读取LifeCycle属性的值注意:LifeCycle的值由于在启动时就已经读取 启动后再修改LifeCycle的值将没有任何效果LifeCycle属性的值可以是以下三种字符串之一1.Session该选项为默认设置每个连接都会建立一个独立的服务器对象为客户端提供服务,服务器对象在连接关闭后释放因此多个客户端访问的是不同的服务器对象,是线程安全的2.Invocation对于每次服务端方法调用建立一个独立的服务器对象为客户端提供服务,服务器对象在调用结束 阅读全文
posted @ 2011-09-23 23:49 Max Woods 阅读(403) 评论(0) 推荐(0) 编辑
摘要: 在过去客户端要调用远程服务器的方法需要通过在TLB里添加接口并且在服务器对象中实现在DataSnap 2009中调用远程服务器的方法是基于delphi的RTTI机制的想要一个类允许被远程调用需要做以下两点1.把该类和DSServerClass连接在一起procedure TMainForm.DSServerClassGetClass(DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass);begin PersistentClass := TSM;end;DSServerClass的OnGetClass就是用.. 阅读全文
posted @ 2011-09-23 23:48 Max Woods 阅读(339) 评论(0) 推荐(0) 编辑
摘要: Delphi 的MIDAS出来了这么多年终于有改进的版本了COM-FREE的DataSnap 2009真是清爽了很多DataSnap 2009 除了不支持回调和Intercept组件以外 其它的该有的都有了 而且还有很多强大的特性第一篇就先写点DataSnap 2009连接方面可能要用到的东西以后再继续写写关于生命周期的管理 对象池的应用 以及远程管理 远程方法调用等方面的东西吧。首先 建立个DataSnap 2009的服务器工程一共用到三个组件DSServer 服务配置组件 用于绑定其它的组件DSServerClass 可以看作是一个类的工厂 用于导出需要远程调用的服务端模块DSTCPSer 阅读全文
posted @ 2011-09-23 23:47 Max Woods 阅读(349) 评论(0) 推荐(0) 编辑
摘要: DataSnap 2009的客户端采用了原始的TClientSocket组件实现了通讯层 即简单效率也不错但是如果我们想要设置连接超时怎么办?想要设置代理服务器又该怎么办呢?能不能利用我们常用的网络控件(indy ics synapse...)来替代呢?在这里我基于synapse控件实现了一个自己的DataSnap客户端驱动注: synapase是一套比较不错的开源的第三方控件 这里我们要使用它的TCP控件来扩展支持代理服务器的使用 synapse 官方网址 http://www.synapse.ararat.cz/doku.phpsynapse svn地址 https://synali... 阅读全文
posted @ 2011-09-23 23:42 Max Woods 阅读(388) 评论(0) 推荐(0) 编辑
摘要: DataSnap服务器可以通过方法调用向客户端返回数据流,当然,也可以从客户端向服务器上传数据流,都是通过方法调用的方式来实现的。下面以一个简单的例子来演示。服务器端实现:{$METHODINFO ON} TFUService = class(TPersistent) public function ReplaceFile(FileName: string; FileStream: TStream): Integer; function GetFile(schema, FileName: string): TStream; end;{$METHODINFO OFF}//GetFile方法向客户 阅读全文
posted @ 2011-09-23 23:41 Max Woods 阅读(489) 评论(0) 推荐(1) 编辑
摘要: 如果DataSnap服务器方法的执行时间比较长,这时候可能需要在客户端用进度条显示当前服务器方法的执行进度。要实现这种需求,现在可以利用DataSnap的回调功能,此功能是从Delphi 2010版本开始被引入的。要实现回调,服务器方法需要暴露给客户端一个或多个类型为TDBXCallback的参数。例如:...{$METHODINFO ON} TServerMethods1 = class(TComponent) private { Private declarations } public { Public declarations } function LongTimeRunFunc(In 阅读全文
posted @ 2011-09-23 23:40 Max Woods 阅读(359) 评论(0) 推荐(0) 编辑
摘要: 之前说到中间层通过向客户端暴露方法的方式提供服务,实现数据库数据的读取和更新。方法调用的方式,其潜在的意义,就是说中间层不保存客户端状态信息,就像WEB服务一样,客户端需要自己保存自己的状态信息。进一步说,就是中间层具体提供方法的业务对象实例,不是也不应该专属于某个客户端,它应该能够为不同的客户端调用提供服务。如果我们把业务对象实例放到对象池中集中存放,调用方法时随用随取,方法结束即放回池中。这样就可以实现业务对象实例服务于不同的客户端调用请求。更重要的是,利用对象池,能够最大化服务器各种资源的使用效率,而且对客户端的响应也更快了,因为业务对象实例早就创建好了,取来即用。其实,DataSnap 阅读全文
posted @ 2011-09-23 23:39 Max Woods 阅读(624) 评论(0) 推荐(0) 编辑
摘要: 有时候安装一些组件以后会出现: [Fatal Error] Project1.dpr(1): Unit not found: 'System.pas' or binary equivalents (DCU,DPU) 的错误,不知道什么原因,刚开始只有重装Delphi才解决问题,后来察看Borland官方网站得知,其实只是环境库路径丢失造成的,解决方法很简单,如果你D7安装默认的路径,则只需要打开Delphi菜单,选择Tools->Environment Options然后选择Library标签,在Library Path添加如下内容就行了: --------------- 阅读全文
posted @ 2011-09-23 23:35 Max Woods 阅读(347) 评论(0) 推荐(0) 编辑