利用ScktSrvr打造多功能Socket服务器.doc
文本预览下载声明
利用ScktSrvr打造多功能Socket服务器
利用ScktSrvr打造多功能Socket服务器
时间:2009-1-14 来源: 作者:本站 编辑:admin 访问次数: 37 【关闭】
Socket服务端编程中最重要的也是最难处理的工作便是客户请求的处理和数据的接收和发送,如果每一个Socket服务器应用程序的开发都要从头到尾处理这些事情的话,人将会很累,也会浪费大量时间。试想,如果有一个通用的程序把客户请求处理和数据的接收、发送都处理好了,程序员只需要在不同的应用中对接收到的数据进行不同的解析并生成返回的数据包,再由这个通用程序将数据包传回客户端,这样,程序设计的工作将会轻松许多。
用Delphi进行过三层数据库应用开发的程序员一定对Borland公司的Borland Socket Server(ScktSrvr.exe)不陌生。这是一个典型的Socket服务器程序,认真读过该软件的源程序的人一定会赞叹其程序编写的高明。其程序风格堪称典范。但它是专用于配合Borland的MIDAS进行多层应用开发的。它能不能让我们实现上面的设想,以便我们应用到不同的应用中去呢?
随我来吧,你会有收获的。
首先,让我们搞清楚它的工作方式和过程,以便看能不能用它完成我们的心愿,当然改动不能太大,否则我没耐心也没有能力去做。
从主窗体的代码开始:不论是以系统服务方式启动程序或直接运行程序,当程序运行时,都会执行主窗体初始化方法:
TSocketForm.Initialize(FromService: Boolean);
该方法代码简单易读,为节省篇幅在此不列出它的源代码。该方法从注册表键“HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Socket Server”中读取端口信息,每读到一个端口,则:创建一个TSocketDispatcher的实例,并调用该实例的ReadSettings方法读取注册表数据来初始化该实例,然后激活该实例。
TSocketDispatcher继承自TServerSocket,是服务端Socket,当激活时便进入监听状态,监听客户端连接。当有客户端连接时,触发TSocketDispatcher实例的GetThread事件过程:
procedure TSocketDispatcher.GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread := TSocketDispatcherThread.Create(False, ClientSocket,
InterceptGUID, Timeout, SocketForm.RegisteredAction.Checked, SocketForm.AllowXML.Checked);
end;
该事件过程为每一个客户端连接创建一个TSocketDispatcherThread类的服务线程为该客户端服务,其核心过程就是TSocketDispatcherThread的ClientExecute方法。对该方法的分析可以知道,它主要工作有两个:一是创建一个传送器对象(TSocketTransport)负责与客户端进行数据传输,二是创建一个数据块解析器对象(TDataBlockInterpreter)负责解析传送器对象接收到的客户端请求数据包。
procedure TSocketDispatcherThread.ClientExecute;
var
Data: IDataBlock;
msg: TMsg;
Obj: ISendDataBlock;
Event: THandle;
WaitTime: DWord;
begin
CoInitialize(nil); //初始化COM对象库
try
Synchronize(AddClient); //显示客户信息
FTransport := CreateServerTransport; //创建传送器对象, 注意FTransport和下面的FInterpreter是线程对象的属性而不是局部变量
try
Event := FTransport.GetWaitEvent;
PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE); //建立线程消息队列
GetInterface(ISendDataBl
显示全部