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;

  • 相关阅读:
    js日历,使用datepicker.js,ui.core.js,jquery-1.7.1.js
    android设置按钮按下的不同效果图
    a标签阻止跳转的方法
    获取浏览器中选中部分,比如文本等
    Android Studio does not point to a valid jvm
    Drawerlayout
    webviewactivity
    ViewFilpper
    Physik
    Betriebssystem
  • 原文地址:https://www.cnblogs.com/china1/p/3334434.html
Copyright © 2011-2022 走看看