Client:TSocketConnection 和Server: Scktsrvr关系----压缩数据传输方案

Client:TSocketConnection 和Server: Scktsrvr关系----压缩数据传输方案

一直用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端:
    说完Server端,客户端的道理也是差不多的。唯一不同的是Server端中不调用ITransport.SetConnected()方法,因为它是根据ClientSocket.Handle生成的对象,也就是它是已经连接的对象,而Client端的TSocktConnection调用Connected := True时,其实就是调用ITransport.SetConnect将一个ClientSocket连接到Server端中的TServerSocket中,然后TServerSocket根据这个ClientSocket.Handle生成了一个TServerClientThread对象保存在本地中,开始对这个ClientSocket的监控(FD_Read, FD_Close消息事件).

注:
  IDataBlock由TDataBlock实现,主要是管理TMemoryStream来存放数据
  ITransport由TSocketTransport实现,主要是用TClientSocket来连接TServerSocket,并和它进行交换数据。
  ISendDataBlock在Scktsrvr.exe中由TServerClientThread实现,通过TSocketTransport来发送数据.

说了这么多,想必各们很明白了吧。:)
各位还可以扩展一下,对压缩之外,还可以对这个流(Data:IDataBlock)进行加密,那更过瘾,如果实现了,多谢告诉我一声 

时间: 2024-09-08 07:44:05

Client:TSocketConnection 和Server: Scktsrvr关系----压缩数据传输方案的相关文章

Mysql Client链接Mysql Server的认证方式

参见:http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol#Password_functions 我意译一下,大致就是以下内容: 4.0版本之前 1.服务器发送随机字符串(scramble_buff)给客户端. 2.客户端把用户明文密码加密一下,然后将hash加上服务器的随机字符串加密一下变成新的scramble_buff.(参见sql/password.c:scramble()). 3.客户端将加密后的scrambl

Asp.Net小技巧之在client端调用server端事件

asp.net|client|server|技巧 Asp.Net小技巧之在client端调用server端事件: string strCMD = Page.GetPostBackClientHyperlink(ControlName,Parameter); OtherControlName.Attributes.Add("ClientEventName", strCMD); 小注:   在上述两行代码中,利用Page.GetPostBackClientHyperlink方法来取得对服务

project web access-project 2013与project server 的关系?

问题描述 project 2013与project server 的关系? 2C 我是一个project的初学者,现在能应用project制造甘特图,但是还不了解project与project server与project web access之间的关系,如何建立公司的客户端等,对这一套系统的认识非常模糊.请高手指教,如果建立project web access ,他们之间的关系是怎样的. 解决方案 Microsoft Project Server 是一个配套程序,与 Microsoft Pro

十五天精通WCF——第三天 client如何知道server提供的功能清单

原文:十五天精通WCF--第三天 client如何知道server提供的功能清单  通常我们去大保健的时候,都会找姑娘问一下这里能提供什么服务,什么价格,这时候可能姑娘会跟你口述一些服务或者提供一份服务清单,这样的话大 家就可以做到童嫂无欺,这样一份活生生的例子,在wcf中同样是一个道理,只有client了解service能提供哪些功能,client才可以根据server提供的功能进行 消费,那问题来了,service怎么把功能提供给client进行选择呢???这个就是我这一篇要聊的wsdl(w

java 网络传输 abel-java, client传值控制server端 JLabel上的text值, 可是值一直不变

问题描述 java, client传值控制server端 JLabel上的text值, 可是值一直不变 client端代码: public class KeyboardGUI{ public final String PASSWORD = "123"; public JFrame frame; public JTextField textField; public JLabel lblOnoff; public Socket socket; /** * Launch the appli

?Socket?,允许多个Client同时连接Server,但是又Server端先后处理这些Request,该怎么办呢?

问题描述 ?Socket?,允许多个Client同时连接Server,但是又Server端先后处理这些Request,该怎么办呢? 解决方案 解决方案二:即使是同时连接,在你的server端监听到Client连接的时候,把他们加到一个Object列表,这样就有先后处理的依据了解决方案三: 解决方案四:无论如何同事,都有一个先后顺序的,或者有请求被等待的,所以直接多线程处理就好解决方案五:Clients会被保存起来,用多线程实现处理

apache AH01630: client denied by server configuration错误

AH01630: client denied by server configuration: /usr/local/apache/htdocs/recx/ 先给大家看看我按照apache-2.2.x配置虚拟机的内容: NameVirtualHost 192.168.10.81:80  代码如下 复制代码 <VirtualHost 192.168.10.81:80> ServerAdmin rocdk890@gmail.com directoryIndex  index.html index.

3.5. 压缩数据传输

服务器将html或脚本输出压缩,用户从服务器取得数据后由浏览器解压 压缩数据传输实现方法: apache mod_deflate lighttpd compress module 原文出处:Netkiller 系列 手札 本文作者:陈景峯 转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明.

探究SQL Server 2008备份压缩

问题 大型数据库的数据库备份和维护窗口总是受阻,特别是当我们需要完全数据库备份来初始化一个数据 库镜像或事务日志传送会话的时候.当我们浏览SQL Server 2008的新特性时,我们发现由一个叫做数据 库备份压缩的特性,可以用它来显著地降低备份和恢复操作.你能给我们详细地介绍下如何使用它吗? 专家解答 数据库压缩是SQL Server 2008的一个新特性,它可以显著地降低备份和恢复操作.默认情况下,备份 压缩是在服务器实例级别上关闭的.不像其它提供不同级别压缩的第三方软件,SQL Serve