zoukankan      html  css  js  c++  java
  • DataSnap如何监控Tcp/IP客户端的连接情况

    一个实例,如果客户端是TCP/IP是短连接的情况就没有必要了。

    一、GlobVar.pas单元,定义应用系统全局数据类型及变量:

     1 unit GlobVar;
     2 
     3 interface
     4 
     5 uses System.SysUtils, System.Classes,IdTCPConnection,System.Generics.Collections,
     6   Datasnap.DSTCPServerTransport,IdWinsock2,Data.DBXCommon,Datasnap.DBClient,
     7   Datasnap.DSServer, Datasnap.DSCommonServer;
     8 
     9 type
    10   pClientConns = ^TClientConns; // 客户连接
    11 
    12   TClientConns = record
    13     ClientId: integer;
    14     Ip: string;
    15     Port: string;
    16     LoginTime: TDateTime;
    17   end;
    18 
    19 const
    20   gb_MaxConnNum = 1000;//每个进程最大连接数设置为1000
    21 
    22 var
    23   gb_ClientConnects: TDictionary<TIdTCPConnection, pClientConns>; // 客户端连接字典
    24   gb_ConnnectCount:Integer=0;
    25 
    26 //.... 

    二、ServerContainer1.pas单元:

     1 uses GlobVar;
     2 //...
     3 procedure TServerContainer1.DSTCPServerTransport1Connect(Event: TDSTCPConnectEventObject);
     4 var
     5   p: pClientConns;
     6 begin
     7   try
     8     if gb_ConnnectCount >= gb_MaxConnNum then
     9     begin
    10       LogInfo('已超过系统授权的客户连接数');
    11       TIdTCPConnection(Event.Connection).Disconnect;
    12       Exit;
    13     end;
    14     InterlockedIncrement(gb_ConnnectCount);
    15     New(p);
    16     if Assigned(p) then
    17     begin
    18       p^.ClientId := Event.Channel.ChannelInfo.Id;
    19       p^.Ip := Event.Channel.ChannelInfo.ClientInfo.IpAddress;
    20       p^.Port := Event.Channel.ChannelInfo.ClientInfo.ClientPort;
    21       p^.LoginTime := Now;
    22       gb_ClientConnects.Add(TIdTCPConnection(Event.Connection), p);
    23       PostMessage(Application.SrvMainForm.Handle, WM_ADDUSER, wParam(p),lParam(TIdTCPConnection(Event.Connection)));
    24     end;
    25   except
    26     Exit;
    27   end;
    28 end;
    29 
    30 procedure TServerContainer1.DSTCPServerTransport1Disconnect(Event: TDSTCPDisconnectEventObject);
    31 var
    32   p: pClientConns;
    33 begin
    34   try
    35     if gb_ConnnectCount >= 1 then
    36       InterlockedDecrement(GlobalVar.gb_ConnnectCount);//GlobalVar.pas单元中定义了系统全局变量
    37     p := gb_ClientConnects.Items[TIdTCPConnection(Event.Connection)];
    38     if Assigned(p) then
    39     begin
    40       SendMessage(Application.SrvMainForm.Handle, WM_DELUSER, wParam(p), 0);
    41       gb_ClientConnects.Remove(TIdTCPConnection(Event.Connection));
    42     end;
    43   except
    44     Exit;
    45   end;
    46 end;

    三、SrvMainForm.pas

     1 procedure TSrvMainForm.AddUser(var msg: TMessage);
     2 var
     3   p: pClientConns;
     4 begin
     5   try
     6   lbl_MaxCount.Caption := IntToStr(gb_ConnnectCount);
     7   p := pClientConns(msg.WParam);
     8   if Assigned(p) then
     9   begin
    10     ClientDataSet1.Append;
    11     ClientDataSet1.FieldByName('Id').AsInteger := p^.ClientId;
    12     ClientDataSet1.FieldByName('Ip').AsString := p^.Ip;
    13     ClientDataSet1.FieldByName('Port').AsString := p^.Port;
    14     ClientDataSet1.FieldByName('LoginTime').AsDateTime := p^.LoginTime;
    15     ClientDataSet1.FieldByName('Conn').AsInteger := msg.LParam;
    16     ClientDataSet1.Post;
    17   end;
    18   except
    19     on E: Exception do
    20     begin
    21       LogInfo('TSrvMainForm.AddUser---' + E.Message);
    22       exit;
    23     end;
    24   end;
    25 end;
    26 
    27 procedure TSrvMainForm.DelUser(var msg: TMessage);
    28 var
    29   p: pClientConns;
    30 begin
    31   try
    32     lbl_MaxCount.Caption := IntToStr(gb_ConnnectCount);
    33     p := pClientConns(msg.WParam);
    34     if Assigned(p) then
    35     begin
    36       if ClientDataSet1.FindKey([p^.ClientId]) then  //Id字段请设置索引
    37         ClientDataSet1.Delete;
    38       Dispose(p);
    39     end;
    40   except
    41     on E: Exception do
    42     begin
    43       LogInfo('TSrvMainForm.DelUser---' + E.Message);
    44       Exit;
    45     end;
    46   end;
    47 end;

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    “Hello World”团队第一周博客汇总
    SFTP服务器之创建普通用户
    软工2017第五周——个人PSP
    "Hello world!"团队第一次会议
    软工2017第四周作业--结对编程之四则运算
    软工2017第四周作业结对编程——个人psp
    软工2017第四周作业结对编程——单元测试
    软工2017第四周作业——代码规范
    软工第三次作业——个人PSP
    iOS原生和React-Native之间的交互1
  • 原文地址:https://www.cnblogs.com/xieyunc/p/4839586.html
Copyright © 2011-2022 走看看