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;

  • 相关阅读:
    css权重
    面试题目之 怪异模式和严格模式
    写点东西,以便回忆-2014最后一天,安好
    background-position 用法详细介绍
    css样式自动换行/强制换行
    浏览器兼容之Chrome浏览器: -webkit-text-size-adjust: none;
    html5常用基本标签
    css样式编辑
    Bootstrap 基本用法(续)
    Bootstrap 基本用法
  • 原文地址:https://www.cnblogs.com/fhweixin/p/13743015.html
Copyright © 2011-2022 走看看