• datasnap 如何监控客户端的连接情况


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

    type
    pClientConns = ^TClientConns; // 客户连接
    TClientConns = record
    clientid: integer;
    ip: string;
    port: string;
    logintime: TDateTime;
    end;

    type
    G_ClientConnects: TDictionary<TIdTCPConnection, pClientConns>; // 客户端连接字典

    procedure TServerContainer1.DSTCPServerTransport1Connect
    (Event: TDSTCPConnectEventObject);
    var
    p: pClientConns;
    begin
    try
    if G_ConnnectCount >= G_MaxConnNum then
    begin
    LogInfo('已超过系统授权的客户连接数');
    TIdTCPConnection(Event.Connection).Disconnect;
    exit;
    end;
    InterlockedIncrement(G_ConnnectCount);
    New(p);
    if Assigned(p) then
    begin
    p^.clientid := Event.Channel.ChannelInfo.Id;
    p^.ip := Event.Channel.ChannelInfo.ClientInfo.IpAddress;
    p^.port := Event.Channel.ChannelInfo.ClientInfo.ClientPort;
    p^.logintime := Now;
    G_ClientConnects.Add(TIdTCPConnection(Event.Connection), p);
    PostMessage(Application.MainForm.Handle, WM_ADDUSER, wParam(p),
    lParam(TIdTCPConnection(Event.Connection)));
    end;
    except
    exit;
    end;
    end;

    procedure TServerContainer1.DSTCPServerTransport1Disconnect
    (Event: TDSTCPDisconnectEventObject);
    var
    p: pClientConns;
    begin
    try
    if G_ConnnectCount >= 1 then
    InterlockedDecrement(GlobalVar.G_ConnnectCount);
    p := G_ClientConnects.Items[TIdTCPConnection(Event.Connection)];
    if Assigned(p) then
    begin
    SendMessage(Application.MainForm.Handle, WM_DELUSER, wParam(p), 0);
    G_ClientConnects.Remove(TIdTCPConnection(Event.Connection));
    end;
    except
    exit;
    end;
    end;

    procedure Tf_MainForm.AddUser(var msg: TMessage);
    var
    p: pClientConns;
    begin
    try
    Label4.Caption := IntToStr(G_ConnnectCount);
    p := pClientConns(msg.WParam);
    if Assigned(p) then
    begin
    ClientDataSet1.Append;
    ClientDataSet1.FieldByName('id').AsInteger := p^.clientid;
    ClientDataSet1.FieldByName('ip').AsString := p^.ip;
    ClientDataSet1.FieldByName('port').AsString := p^.port;
    ClientDataSet1.FieldByName('time').AsDateTime := p^.logintime;
    ClientDataSet1.FieldByName('conn').AsInteger := msg.LParam;
    ClientDataSet1.Post;
    end;
    except
    on E: Exception do
    begin
    LogInfo('Tf_MainForm.AddUser---' + E.Message);
    exit;
    end;
    end;
    end;

    procedure Tf_MainForm.DelUser(var msg: TMessage);
    var
    p: pClientConns;
    begin
    try
    Label4.Caption := IntToStr(G_ConnnectCount);
    p := pClientConns(msg.WParam);
    if Assigned(p) then
    begin
    if ClientDataSet1.FindKey([p^.clientid]) then
    ClientDataSet1.Delete;
    Dispose(p);
    end;
    except
    on E: Exception do
    begin
    LogInfo('Tf_MainForm.DelUser---' + E.Message);
    exit;
    end;
    end;
    end;

  • 相关阅读:
    Linux网卡上添加多个IP
    TCP_Wrappers基础知识介绍
    工作、生活、思考、人生、经验、总结
    网络层安全
    centos7.0 安装nginx
    linux 下配置jdk
    yii2.0 中的队列
    centos7.0 activemq的安装
    solrCloud
    线性顺序表
  • 原文地址:https://www.cnblogs.com/fhweixin/p/13743015.html
Copyright © 2020-2023  润新知