读一读scktsrvr.exe的源程序
使用delphi做多层开发的朋友们都应该对scktsrvr.exe这个程序不陌生的,
borland公司在delphi中给出了它的源代码。
这是一个900来行的程序,程序不算长,
现在我只选其中部分仔细读一读。
走的线路大致是,从服务器接到客户端连接,处理客户端的一个请求(这儿
选了客户端向服务器发出的'取应用服务器列表'请求)
服务器接受了客户端连接后,
因为serversocket采用的是阻塞模式,服务器执行了下面这个线程来
服务客户端:
//scktmain.pas
procedure tsocketdispatcherthread.clientexecute;
var
data: idatablock;
msg: tmsg;
obj: isenddatablock;
event: thandle;
waittime: dword;
begin
coinitialize(nil); //初始化com
try
synchronize(addclient); //在程序界面上显示客户信息,
//用同步保证addclient线程安全性
ftransport := createservertransport;
try
event := ftransport.getwaitevent;
peekmessage(msg, 0, wm_user, wm_user, pm_noremove);
getinterface(isenddatablock, obj);
if fregisteredonly then
finterpreter := tdatablockinterpreter.create(obj, ssockets) else
finterpreter := tdatablockinterpreter.create(obj, '');
try
obj := nil;
if ftimeout = 0 then
waittime := infinite else
waittime := 60000;
while not terminated and ftransport.connected do
try
case msgwaitformultipleobjects(1, event, false, waittime, qs_allevents) of
//msgwaitformultipleobjects保持线程同步之用,
//本文暂不细说它.
wait_object_0: //有数据来了
begin
wsaresetevent(event);
data := ftransport.receive(false, 0); //从客户端接收数据块
if assigned(data) then
begin
flastactivity := now;
finterpreter.interpretdata(data);//下面接着分析这儿
data := nil;
flastactivity := now;
end;
end;
wait_object_0 + 1:
while peekmessage(msg, 0, 0, 0, pm_remove) do
dispatchmessage(msg);
wait_timeout:
if (ftimeout > 0) and ((now - flastactivity) > ftimeout) then
ftransport.connected := false;
end;
except
ftransport.connected := false;
end;
finally
finterpreter.free;
finterpreter := nil;
end;
finally
ftransport := nil;
end;
finally
couninitialize;
synchronize(removeclient);
end;
end;
就这么舒舒服服的六十来行。