读一读Scktsrvr.exe的源程序[1]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 halfdream 的 blog

 

 


读一读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;
就这么舒舒服服的六十来行。

本文关键:应用服务器,MIDAS,阻塞方式SOCKET
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top