三层通讯与客户端分发问题(200分)

  • 主题发起人 主题发起人 PLS.Wang
  • 开始时间 开始时间
P

PLS.Wang

Unregistered / Unconfirmed
GUEST, unregistred user!
目前客户端文件client.exe,intrcpt.dll,用SocketConnection.
想把intrcpt.dll合并到client.exe中,这样分发时只有一个可执行文件,不想用从自身分离出intrcpt.dll到硬盘中,然后在winexec('regsvr32.exe /s '+path+'intrcpt.dll').用其它的方法实现它,比如在内存中映射DLL,生成GUID,可以设置SocketConnection的InterceptGUID
还有一个问题,设想客户端传给中间层的都是一个存储过程的代号,而中间层返回给客户端的记录集或一个返回码(是否成功),不要写CommandText(担心表结构,执行任意SQL,不安全),而且为了中间层与数据库统一接口,最好只用一个DataSetProvider和一个ADOStoredProc或其它DataSet.应该有办法,比如定义方法什么的,大家多给我一些建议啊!!!
如有其它更好的办法那是最好了,请大家帮帮忙吧,为这事我头都大了...
 
用 DCOM 连接 就不要附加文件
 
DCOM也要动态连接库!midas.dll,qtintf.dll!这两个是必不可少的!
 
uses
midas;
静态加入,可以扔掉Midas.dll
 
怎么才能将qtintf扔掉?
 
晕~~~~~~~~这么难吗??????我可以加分啊!!!!!!!!!!!
拜托大家了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
要想安全的话,倒有个方法:
一直用socketconnection和服务端的传输数据在三层数据库中,从来没有注意到它们之间
的数据传输,只是想着,管它了,网络的事,前段时间在delphi中的demos中发现
demos/midas/intrcpt.dpr例子,呵呵,再看了半天的vcl发现可以将client端发送的
给server的数据,和server发送给client的数据是可以进行压缩的。呵呵,不敢藏私,
share给大家。
1:
准备工作,先delphi光盘中的/info/extras/zlib/zlib.pas进行编绎,然后copy 到lib路径中,因为要压缩数据,必须要有压缩功能,这个delphi已经自带,它是基于流的方式对接口idatablock(tdatablock实现,其实就是对tmemorystream的*作)数据进行压缩和解压的。做了这个后,才能进行下面的工作。
2:
open /demos/midas/intrcpt/intrcpt.dpr
complier....(如没有做第一步,嘿嘿...)
生成intrcpt.dll
将intrcpt.dll copy to system directory,或者你的程序下面。
注册它:regsrvr32 intrcpt.dll (为什么,这个嘛...)
记住intrcpt.dpr的那个guid,你也可以自己重新生成一个(按shift+ctrl+g)
3:
server:
open scktsrvr.exe,相信各位都很熟悉那界面,端口(tlistbox),thread cache size(tedit), guid(tedit),好,我们要做的事,就是将注册的intrcpt.dll那个guid填到这个guid(tedit)框框中,
只需填自己程序的的那个端口的guid啊,别乱填,如果有别人用这个程序,出了什么,别找我。ok,apply.
client:
你写的程序中肯定有tsocketconnection,它有个属性interceptguid: string;好了,将intrcpt.dll的guid填上去,它是跟server中的一样的。ok.还有别忘了,regsrvr32 intrcpt.dll 在你的客户端。不然,程序虽不会raise,但是server传过来的数据是压缩的....
好了,呵呵。就这些了。3步骤,很清楚吧(不会吧,还不懂,倒)
原理
scktsrvr.exe其实是一堆tserversocket,一个端口代表了一个tserversocket,每个tserversocket是基于多线程方式与客户端进行数据交换。它写了个tserverclientthread(在服务端中的客户端)的扩展
,多加了对客户端数据接收的管理解析,还有activitydatetime,guid,一般不管它。但是我们用到的压缩只是跟这个guid有关,其它费话少说。
server接受一个client连接,则加一个tserverclientthread到本地中,用来监控client read 和close事件,所以server中的scktsrvr中我们只要了解了tserverclientthread动作方式就行了。
(
题外话:server socket中有客户端连接后,记录clientsocket.handle,并且将根据这个handle产生一个tserverclientwinsocket对象加入到connections(tlist)对象中,当任何对这个client的动作也就是说server 发送和接收数据都是根据这个client handle来进行的,相应的serversocket中的connections中的clientsocket也发生相应的变化。
)
有两个类跟这个tserverclientthread(实现isenddatablock接口)有关
1: tdatablockinterpreter(对发送过来的数据进行解析interpretdata(data: idatablock))
解析数据(水平有限,对它真是还是一知半解,有错请指出)
接口类idatablock,由tdatablock通过tmemorystream的读写来实现,其中signature是其主要标识,说明这个idatablock的数据类型 ,tdatablockinterpreter根据signature来对应进行相应的调用, 如:
client端连接后,在server要运行应用服务器(application server),
client端需要得到servername 列表,
client端得到server 的databroker的列表,
client端断开连接后,server要close应用服务器(application server),
client和server的数据交换,也是由它来解析。
所以这个idatablock的数据很重要,而我们的压缩和解压就是针对于它,但是tdatablockinterpreter是得到data才对它解析,因而我们要在send 和recv 之前对它解压和压缩。这个任务在tsockettransport身上。
2: tsockettransport;(数据进行发送和接收, 实现itransport接口)
server端:
在server端,tsockettransport其实就是一个用来管理对clientsocket实例,它将clientsocket.handle生成一个对象后,clientsocket发送和接收过来的data,在发送data之前,它将调用interceptoutgoing(data: idatablock)函数,这个函数的功能是:
如果interceptguid <> '',那么它将根据这个guid生成一个com(obj)对象,obj.dataout(data: idatablock),也就是我们注册的那个压缩的dll中的那个压缩函数,将压缩过后的data再发送出去。这就完成compress and send data.(我试过那个压缩功能,压缩比大概是1/9,像zip压缩比差不多).
由客户端传过来的数据调用interceptincoming(data: idatablock)函数,这就不多说了,data := 解压后的data. 压缩和解压过后的data交由tdatablockinterpreter去解析,完成一次数据交换。
client端:... ...
测试发现在局域网内的效果不大(可能是局域网内速度本来就很快,还有压缩和解压也需要时间),但有一个很大的好出就是起到了加密的效果,
大家知道如果你知道服务端的ip,并且服务也是开着的,那么你就可以马上用delphi编一个Client端并能连上服务器;但如果服务端用到了Intrcpt.dll的话你的Client就必须要注册这个Intrcpt.dll你才能连上服务端,当然你不能随便找个Intrcpt.dll就可以,因为Client端的Intrcpt.dll的Guid必须和服务端的一样
 
好,研究的不错。学习。
 
后退
顶部