摘要: 当开发人员开始创建Delphi的DataSnap应用时很常见的数据库连接定义方式是每个数据模块建立一个连接。这样做将产生大量的数据库连接,并产生很多问题。DelphiXe,提供了Session管理,更容易实现控制客户端连到服务器的数据库连接。客户端应用程序bu不会知道这些,服务器将完成所有的事情。当我们创建一个DataSnap服务器时,最好的做法就是定义一个服务器容器(数据模块),其中包含DataSnap服务器组件和注册所有的服务器应用程序所需的类。在这个容器中,我们将定义一个负责处理服务器的数据库连接的方法。作为一个例子,我已经实现了服务器容器上的一个的getConnection方法。这个方 阅读全文
posted @ 2011-02-04 21:41 delphi中间件 阅读(991) 评论(0) 推荐(0) 编辑
摘要: 先简单介绍下什么叫marshalling? marshalling有点类似于序列化,它指的是一个转换的过程。将一个对象用一种适当的数据格式保存或转换。它一般用于不同两个程序间的通信和数据交换。与之对应的Unmarshalling故名思意也就是类似于反序列化的过程。 那么2010中是如何支持Marshalling 的呢?举个小例子说明:第一步:创建一个自定义的类 TPerson = class FirstName: String; LastName: String; Age: Integer; end;我们创建了一个简单的类,里面只有几个简单类型的field第二步:marshalling这个Pe 阅读全文
posted @ 2011-02-04 15:47 delphi中间件 阅读(1031) 评论(0) 推荐(0) 编辑
摘要: 使用dbexpress控件面板中的TSqlServerMethod控件来调用 下面使用示例代码来说明:服务器的自定义方法代码:function TServerMethods1.inBeginSteam(inStream:widestring): boolean;var mem:TStringstream;begin try result:=False; if inStream='' then exit; mem:=TStringstream.Create(inStream,TEncoding.Unicode); mem.SaveToFile('C:/ccc.pdf 阅读全文
posted @ 2011-02-04 15:45 delphi中间件 阅读(394) 评论(0) 推荐(0) 编辑
摘要: Delphi2010中DataSnap,如果客户端异常掉线或拔掉网线,那么在服务端会留下一个TCP连接,这个连接会变成死连接(经过测试,如果windows的TCP保持连接禁用的话,三个小时该死连接还不消失)。如果大量客户端并发,出现的死TCP连接过多,服务器内存和端口将会增加,直到占满服务器的端口和耗尽内存为止。如果这样的话,服务器无法健壮稳定的运行。大家可以另开线程来监控客户端连接,但是今天要给大家讲解的不是这个方法,而是使用TCP协议自带的心跳包功能解决这个问题。大家先了解一下 TCP keep-alive原理一个TCP keep-alive 包是一个简单的ACK,该ACK包内容为一个比当 阅读全文
posted @ 2011-02-04 15:09 delphi中间件 阅读(690) 评论(0) 推荐(0) 编辑
摘要: 针对服务器和客户端软件,如何发布呢?经过研究发现,分发方法非常简单!服务器发布方法:1.在unit ServerMethodsUnit1单元中,添加uses MidasLib;(添加MidasLib的目的是省去发布Midas.dll)2.我用的是火鸟数据库,只需拷贝dbxfb.dll和fbclient.dll分发的服务器软件只需三个文件:你的服务器程序、dbxfb.dll 和 fbclient.dll客户端发布方法:1.在客户端程序中加上uses MidasLib;(添加MidasLib的目的是省去发布Midas.dll)2.如果服务器使用了http协议作为datasnap通讯的话,还需在客户 阅读全文
posted @ 2011-02-04 15:01 delphi中间件 阅读(483) 评论(0) 推荐(0) 编辑
摘要: 作为一个服务器软件,必须做到对客户端强有力的控制,想要控制,就必须得到客户端的网络基本信息,比如客户端IP和端口。有了客户端IP就能随心所欲操控客户端,比如终止某些客户端的连接、限制功能等等。在delphi2010中的datasnap服务器如何获得客户端ip,的确花了我点时间,奇怪为什么这个功能不做的更人性化点呢,功能总是藏着掖着。还得让程序员像寻宝一样摸索,浪费时间。现在把我整理的结果奉献给大家,免得大家在花时间研究这个。另外,通过研究发现,DSConnectEventObject.ChannelInfo.Id 属性实际上是内存地址,并不是一个简单的数字。以下代码红色部分是关键。uses I 阅读全文
posted @ 2011-02-04 14:57 delphi中间件 阅读(863) 评论(0) 推荐(0) 编辑
摘要: 这几天一直在研究Delphi 2010的DataSnap,感觉功能真是很强大,现在足有理由证明Delphi7该下岗了。DataSnap有三种服务模式,其中Service Application方式建立的windows服务没有描述,描述部分是空的,感觉总是欠缺点什么。现找到办法添加描述:procedure TServerContainer2.ServiceAfterInstall(Sender: TService);var reg: TRegistry;begin reg := TRegistry.Create; try with reg do begin RootKey := HKEY_LOC 阅读全文
posted @ 2011-02-04 14:53 delphi中间件 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 1)作为一个服务程序,如果不限制客户端访问数量,后果将是很可怕的。如果有人恶搞,服务器不堪重负,内存将耗尽,最终服务器将宕机。如何限制访问者的数量呢?我们可以设置一个变量,来记录来访者的数量,如果超过我们既定的数字,那么后续的连接服务器请求,都将被断掉。2)限制了访问数量,但是如果不做密码身份认证,无关的人员也将能登陆服务器!解决办法是客户端传入用户名和密码,如果用户名和密码不正确,连接将被挂断。在客户端的SQLConnection1中driver分类的username和password属性设置好用户名和密码。3)尽量不要设置DSTCPServerTransport1的Maxthreads属性 阅读全文
posted @ 2011-02-04 14:48 delphi中间件 阅读(305) 评论(0) 推荐(0) 编辑
摘要: Lifecycle 三种属性: Session、Invocation、Server如果乱用这三种属性,你的服务程序有可能崩溃,数据混乱,内存占用大,效率低等问题!下面我对这三种属性的使用环境逐一介绍:1. Session说明:这是delphi2010中默认属性,也是delphi推荐设置。Session会为每个来自客户端的链接,建立一个线程来实例化。实例化是什么概念呢?就是这个线程把所有你将要用到的类、函数等等都建立好了,等待你客户端直接使用。这个线程和实例化并不释放,直到客户端中断连接。如果有300个客户端,那么你的服务器将会有300线程和实例,对服务器硬件和内存是个考验。适用环境:这个设置是 阅读全文
posted @ 2011-02-04 14:44 delphi中间件 阅读(213) 评论(0) 推荐(0) 编辑
摘要: //author: cxg{ For example :procedure TForm1.ComboBox1Change(Sender: TObject);begin SetActiveLanguage(ComboBox1.Text);end;procedure TForm1.FormCreate(Sender: TObject);begin ComboBox1.Items.AddStrings(SearchLanguagePack);end;}unit uLanguage;interfaceuses Windows, Messages, SysUtils, Classes, Graphics 阅读全文
posted @ 2011-02-04 13:29 delphi中间件 阅读(374) 评论(0) 推荐(0) 编辑
摘要: 有很多朋友认为,datasnap 2010 只可以与DBX 捆绑在一起,而如果是想用ADO的话,哪就得放弁DATASNAP 2010 了,这个想法是错误的,datasnap 2010 是调用了DBX 库中的一些相关的东西,也就是我们如果用ADO来连接目标库的话,哪么我们还是需要USES DBX相关的单元,但是这并不影响我们使用ADO新版本也不是完全都如意,如果你还在用SQL SERVER 2000的话,哪么你想用DBX的话,你的客户端必需要装到sql server 2008的客户端,否则,一系列的错误,会搞的你不知是什么一回事!用了delphi 2010 的新的datasnap后,我们可以对 阅读全文
posted @ 2011-02-04 08:20 delphi中间件 阅读(264) 评论(0) 推荐(0) 编辑