zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    git版本控制工具的使用(2)
    如何才能够系统地学习Java并发技术?
    Java集合类常见面试知识点总结
    想了解Java后端学习路线?你只需要这一张图!
    你不可错过的Java学习资源清单
    Java后端工程师必备书单(从Java基础到分布式)
    Java工程师修炼之路(校招总结)
    ​为什么我会选择走 Java 这条路?
    从Java小白到收获BAT等offer,分享我这两年的经验和感悟
    从零基础到拿到网易Java实习offer,我做对了哪些事
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2947462.html
Copyright © 2011-2022 走看看