如果客户端是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;

转载于:https://www.cnblogs.com/hnxxcxg/archive/2013/03/07/2947462.html

datasnap 如何监控客户端的连接情况相关推荐

  1. DataSnap如何监控Tcp/IP客户端的连接情况

    一个实例,如果客户端是TCP/IP是短连接的情况就没有必要了. 一.GlobVar.pas单元,定义应用系统全局数据类型及变量: 1 unit GlobVar; 2 3 interface 4 5 u ...

  2. 使用PowerShell 监控运行时间和连接情况

    概念 Powershell 是运行在windows机器上实现系统和应用程序管理自动化的命令行脚本环境.你可以把它看成是命令行提示符cmd.exe的扩充,不对,应当是颠覆. powershell需要.N ...

  3. zabbix连接mysql_zabbix的简单操作(监控客户端MySQL数据包库)

    环境准备: 192.168.175.102    zabbix服务端 192.168.175.106    zabbix客户端(监控MySQL) 命令:iptables -F        #清空防火 ...

  4. 解决连接oracle报错 尝试加载Oracle客户端库时引发BadImageFomatException。如果在安装64位Oracle客户端组件的情况下以32位模式运行,将出现此问题的报错。

    解决连接oracle报错 尝试加载Oracle客户端库时引发BadImageFomatException.如果在安装64位Oracle客户端组件的情况下以32位模式运行,将出现此问题的报错. 参考文章 ...

  5. NanoMQ Newsletter 2022-08|v0.11:MQTT 5.0 + MQTT over QUIC 桥接,新增 HTTP API 监控客户端状态

    8 月,NanoMQ 继续保持稳步更新.最新的 0.11.0 版本已于 8月底正式发布(https://github.com/emqx/nanomq/releases/tag/0.11.0).此版本继 ...

  6. 搭建部署zabbix监控客户端Linux系统

    一.zabbix监控系统 1.zabbix的作用和特点 1)zabbix的作用 基于web界面的企业开源监控系统 2)特点 开源 监控内容多样化 监控客户端故障通知消息类型多样化 强大的统计功能 支持 ...

  7. [ 搭建Redis本地服务器实践系列三 ] :图解Redis客户端工具连接Redis服务器

    原文:[ 搭建Redis本地服务器实践系列三 ] :图解Redis客户端工具连接Redis服务器 上一章 [ 搭建Redis本地服务器实践系列二 ] :图解CentOS7配置Redis  介绍了Red ...

  8. Socket简介及客户端服务器连接实例

    注:  在客户端游戏开发中,使用HTTP进行网络通信的比较少,一般使用的都是Socket进行通信.而HTTP一般用于网页或者网页游戏. [Socket简介] 1.套接字(socket)概念 套接字(s ...

  9. 远程桌面连接错误:由于安全设置错误,客户端无法连接到远程计算机。

    [1]问题情境描述 win7远程桌面连接UBuntu. 当输入远程机UBuntu的IP(确保正确)后,点击连接.弹出连接错误(见下节). 注意:计算机操作中遇到的有些问题与生活中的极其相似,因为计算机 ...

最新文章

  1. JDK9,像Unix脚本一样执行Java代码
  2. size_t是什么数据类型?为什么要用size_t替代int、unsigned int、unsigned long、unsigned long long
  3. 信号之函数的可重入性
  4. 将自己的dcm数据制作成LUNA16数据集提供数据样式之代码整理
  5. JDK动态代理的实现原理
  6. c语言二叉树反序列化,序列化和反序列化二叉树
  7. Jquery第二章常用方法,一二级菜单淡入淡出,event事件,复选框的全选反选第一节
  8. Winform--处理MDI父窗体与子窗体的交互
  9. 移动端 短信发送,一键拨号功能
  10. SVN安装以及使用教程
  11. C语言队列的基本实现
  12. 网络安全/渗透测试工具AWVS14.9下载/使用教程/安装教程
  13. Unity3d学习笔记-Demo实现
  14. 如何禁止某个程序修改计算机,电脑如何禁止某个程序运行?
  15. Android JS交互-记录我所遇到的
  16. Windows/Linux下C++对于UUID的跨平台封装
  17. 如何查看手机上chrome浏览器的console日志打印
  18. CSR867x — uart串口调试和AT指令
  19. NBA 球星杜兰特的加密投资版图
  20. 使用sklearn划分训练集、验证集、测试集

热门文章

  1. 35+非常棒的视差滚动(Parallax Scrolling)效果WordPress主题
  2. 《当程序员的那些狗日日子》(十二)公司里的靓丽风景
  3. “theform._eventtarget 为空或者不是对象”,解决办法
  4. 项目交付为什么失败?-记我在某个项目中的迷思
  5. TFS数据库变成可疑状态的处理
  6. perl随机打乱数组
  7. visual c++ for .net(新语法)
  8. c语言求出两个最大素数,求两个正整数的最大公约数      思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法。通式分别为 f(x, y) = f(y, x%y...
  9. 描述文件安装失败无法连接到服务器_iOS13 Beta安装失败解决办法
  10. sqlserver 安装共享功能什么意思_网络多功能电力仪表安装要注意什么