摘要:
對連接上來的連接,進行檢測,以防止客戶端異常關閉,或線路異常斷開,而服務器不知道,得到一個半連接這種情況。當然可以在協議裡加一個心跳包,然後服務器端定時檢測,過一段時間就去輪訓一次,看哪些連接超過多少時間沒有反應。超時就關閉。但這樣有點不爽,要自己寫代碼來完成。還要鎖定連接列表,代價挺大的。記得以前在網上看到可以用 TCP 的 KeepAlive 保活機制來做,但也看到人說沒有效果。我想定TCP協議的那此人,不會定一些無用的功能吧,但MSDN上卻沒看到什麼有價值的東東。難道MS沒有實現它們?我決定試試。1. Delphi 的 WinSock2.pas 不全,要加入一些東東,如下:constIO 阅读全文
摘要:
影响ClientDataSet处理速度的一个因素TClientDataSet是Delphi开发数据库时一个非常好的控件。有很强大的功能。我常常用ClientDataSet做MemoryDataSet来使用。还可以将ClientDataSet的数据保存为XML,这样就可以做简单的本地数据库使用。还有很多功能就不多说了。在使用ClientDataSet的过程中关于怎样提高处理速度这个问题,我就我个人的一点点体会和大家分享一下。通常情况下我们一般都是用...ClientDataSet-->DataSource-->DBComponent这样的结构,处理数据的时候就直接操作ClientDa 阅读全文
摘要:
那种往应用服务器中拖放一堆TDataSet, TDaTaSetProvider控件的做法,非常的笨拙。可以通过使用对象池来改进之。数据集对象池unit ServerMethodsUnit1;interfaceuses SysUtils, Classes, DSServer, DB, Generics.Collections, DSService, Provider, ADODB;type TServerMethods1 = class(TDSServerModule) procedure DSServerModuleCreate(Sender: TObject); private { Priv 阅读全文
摘要:
当开发人员开始创建Delphi的DataSnap应用时很常见的数据库连接定义方式是每个数据模块建立一个连接。这样做将产生大量的数据库连接,并产生很多问题。DelphiXe,提供了Session管理,更容易实现控制客户端连到服务器的数据库连接。客户端应用程序bu不会知道这些,服务器将完成所有的事情。当我们创建一个DataSnap服务器时,最好的做法就是定义一个服务器容器(数据模块),其中包含DataSnap服务器组件和注册所有的服务器应用程序所需的类。在这个容器中,我们将定义一个负责处理服务器的数据库连接的方法。作为一个例子,我已经实现了服务器容器上的一个的getConnection方法。这个方 阅读全文
摘要:
先简单介绍下什么叫marshalling? marshalling有点类似于序列化,它指的是一个转换的过程。将一个对象用一种适当的数据格式保存或转换。它一般用于不同两个程序间的通信和数据交换。与之对应的Unmarshalling故名思意也就是类似于反序列化的过程。 那么2010中是如何支持Marshalling 的呢?举个小例子说明:第一步:创建一个自定义的类 TPerson = class FirstName: String; LastName: String; Age: Integer; end;我们创建了一个简单的类,里面只有几个简单类型的field第二步:marshalling这个Pe 阅读全文
摘要:
使用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 阅读全文
摘要:
Delphi2010中DataSnap,如果客户端异常掉线或拔掉网线,那么在服务端会留下一个TCP连接,这个连接会变成死连接(经过测试,如果windows的TCP保持连接禁用的话,三个小时该死连接还不消失)。如果大量客户端并发,出现的死TCP连接过多,服务器内存和端口将会增加,直到占满服务器的端口和耗尽内存为止。如果这样的话,服务器无法健壮稳定的运行。大家可以另开线程来监控客户端连接,但是今天要给大家讲解的不是这个方法,而是使用TCP协议自带的心跳包功能解决这个问题。大家先了解一下 TCP keep-alive原理一个TCP keep-alive 包是一个简单的ACK,该ACK包内容为一个比当 阅读全文
摘要:
针对服务器和客户端软件,如何发布呢?经过研究发现,分发方法非常简单!服务器发布方法: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通讯的话,还需在客户 阅读全文
摘要:
作为一个服务器软件,必须做到对客户端强有力的控制,想要控制,就必须得到客户端的网络基本信息,比如客户端IP和端口。有了客户端IP就能随心所欲操控客户端,比如终止某些客户端的连接、限制功能等等。在delphi2010中的datasnap服务器如何获得客户端ip,的确花了我点时间,奇怪为什么这个功能不做的更人性化点呢,功能总是藏着掖着。还得让程序员像寻宝一样摸索,浪费时间。现在把我整理的结果奉献给大家,免得大家在花时间研究这个。另外,通过研究发现,DSConnectEventObject.ChannelInfo.Id 属性实际上是内存地址,并不是一个简单的数字。以下代码红色部分是关键。uses I 阅读全文
摘要:
这几天一直在研究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 阅读全文