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

一、GlobVar.pas单元,定义应用系统全局数据类型及变量:

 1 unit GlobVar;
 2
 3 interface
 4
 5 uses System.SysUtils, System.Classes,IdTCPConnection,System.Generics.Collections,
 6   Datasnap.DSTCPServerTransport,IdWinsock2,Data.DBXCommon,Datasnap.DBClient,
 7   Datasnap.DSServer, Datasnap.DSCommonServer;
 8
 9 type
10   pClientConns = ^TClientConns; // 客户连接
11
12   TClientConns = record
13     ClientId: integer;
14     Ip: string;
15     Port: string;
16     LoginTime: TDateTime;
17   end;
18
19 const
20   gb_MaxConnNum = 1000;//每个进程最大连接数设置为1000
21
22 var
23   gb_ClientConnects: TDictionary<TIdTCPConnection, pClientConns>; // 客户端连接字典
24   gb_ConnnectCount:Integer=0;
25
26 //.... 

二、ServerContainer1.pas单元:

 1 uses GlobVar;
 2 //...
 3 procedure TServerContainer1.DSTCPServerTransport1Connect(Event: TDSTCPConnectEventObject);
 4 var
 5   p: pClientConns;
 6 begin
 7   try
 8     if gb_ConnnectCount >= gb_MaxConnNum then
 9     begin
10       LogInfo('已超过系统授权的客户连接数');
11       TIdTCPConnection(Event.Connection).Disconnect;
12       Exit;
13     end;
14     InterlockedIncrement(gb_ConnnectCount);
15     New(p);
16     if Assigned(p) then
17     begin
18       p^.ClientId := Event.Channel.ChannelInfo.Id;
19       p^.Ip := Event.Channel.ChannelInfo.ClientInfo.IpAddress;
20       p^.Port := Event.Channel.ChannelInfo.ClientInfo.ClientPort;
21       p^.LoginTime := Now;
22       gb_ClientConnects.Add(TIdTCPConnection(Event.Connection), p);
23       PostMessage(Application.SrvMainForm.Handle, WM_ADDUSER, wParam(p),lParam(TIdTCPConnection(Event.Connection)));
24     end;
25   except
26     Exit;
27   end;
28 end;
29
30 procedure TServerContainer1.DSTCPServerTransport1Disconnect(Event: TDSTCPDisconnectEventObject);
31 var
32   p: pClientConns;
33 begin
34   try
35     if gb_ConnnectCount >= 1 then
36       InterlockedDecrement(GlobalVar.gb_ConnnectCount);//GlobalVar.pas单元中定义了系统全局变量
37     p := gb_ClientConnects.Items[TIdTCPConnection(Event.Connection)];
38     if Assigned(p) then
39     begin
40       SendMessage(Application.SrvMainForm.Handle, WM_DELUSER, wParam(p), 0);
41       gb_ClientConnects.Remove(TIdTCPConnection(Event.Connection));
42     end;
43   except
44     Exit;
45   end;
46 end;

三、SrvMainForm.pas

 1 procedure TSrvMainForm.AddUser(var msg: TMessage);
 2 var
 3   p: pClientConns;
 4 begin
 5   try
 6   lbl_MaxCount.Caption := IntToStr(gb_ConnnectCount);
 7   p := pClientConns(msg.WParam);
 8   if Assigned(p) then
 9   begin
10     ClientDataSet1.Append;
11     ClientDataSet1.FieldByName('Id').AsInteger := p^.ClientId;
12     ClientDataSet1.FieldByName('Ip').AsString := p^.Ip;
13     ClientDataSet1.FieldByName('Port').AsString := p^.Port;
14     ClientDataSet1.FieldByName('LoginTime').AsDateTime := p^.LoginTime;
15     ClientDataSet1.FieldByName('Conn').AsInteger := msg.LParam;
16     ClientDataSet1.Post;
17   end;
18   except
19     on E: Exception do
20     begin
21       LogInfo('TSrvMainForm.AddUser---' + E.Message);
22       exit;
23     end;
24   end;
25 end;
26
27 procedure TSrvMainForm.DelUser(var msg: TMessage);
28 var
29   p: pClientConns;
30 begin
31   try
32     lbl_MaxCount.Caption := IntToStr(gb_ConnnectCount);
33     p := pClientConns(msg.WParam);
34     if Assigned(p) then
35     begin
36       if ClientDataSet1.FindKey([p^.ClientId]) then  //Id字段请设置索引
37         ClientDataSet1.Delete;
38       Dispose(p);
39     end;
40   except
41     on E: Exception do
42     begin
43       LogInfo('TSrvMainForm.DelUser---' + E.Message);
44       Exit;
45     end;
46   end;
47 end;

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/xieyunc/p/4839586.html

DataSnap如何监控Tcp/IP客户端的连接情况相关推荐

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

    如果客户端是TCP/IP是短连接的情况就没有必要了. type pClientConns = ^TClientConns; // 客户连接 TClientConns = record clientid ...

  2. mysql服务器是否支持tcp/ip连接,(3)MySQL客户端与服务端的TCP/IP及socket连接方式-Go语言中文社区...

    MySQL客户端与服务端的TCP/IP及socket连接方式 客户端与服务器模型 客户端与服务端模型 TCP/IP方式连接 解释说明 TCP/IP套接字方式是MySQL在任何平台下都提供的连接方式,也 ...

  3. Linux命令:netstat【监控TCP/IP网络,可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息】【TCP的11种状态】

    netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表.实际的网络连接以及每一个网络接口设备的状态信息. netstat [选项] 选项 描述 -a 显示所有网络连接和监听的所 ...

  4. 监控TCP/IP网络的工具netstat介绍

    说明 netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表.实际的网络连接以及每一个网络接口设备的状态信息,以及与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检 ...

  5. 笨办法学C 练习45:一个简单的TCP/IP客户端

    练习45:一个简单的TCP/IP客户端 原文:Exercise 45: A Simple TCP/IP Client 译者:飞龙 我打算使用RingBuffer来创建一个非常简单的小型网络测试工具,叫 ...

  6. 网络原理 | TCP/IP中的连接管理机制 重要协议与核心机制

    应用层.传输层.网络层.数据链路层.物理层 一.应用层协议 应用层 是程序猿最最经常打交道的一层 其他四层,都是操作系统.驱动.硬件,实现好了的,咱们不需要管 (除非你是系统工程师,驱动开发工程师-- ...

  7. TCP/IP系列——长连接与短连接的区别

    1 什么是长连接和短连接 三次握手和四次挥手 TCP区别于UDP最重要的特点是TCP必须建立在可靠的连接之上,连接的建立和释放就是握手和挥手的过程. 三次握手为连接的建立过程,握手失败则连接建立失败. ...

  8. C# TCP/IP客户端与服务端数据与文件的传输

    用C#写的 一个简单的TCP通信,主要的功能有: (1) 多个客户端与服务器间的数据交流 (2)可以实现群发的功能 (3)客户端与服务端可以进行文件的传输 主要用到的知识: TCP里的 socket ...

  9. tcp/ip客户端与服务器

    单击"发送数据"把数据发送到指定IP地址的指定端口号 using System; using System.Collections.Generic; using System.Co ...

最新文章

  1. Maven学习(一) - Maven基础
  2. 简单读懂微生物基因组的泛基因组学
  3. 基于alipay用到的
  4. File,FileInfo;Directory,DirectoyInfo的区别
  5. 利用yum升级操作系统版本(目前最新6.6)
  6. 【WebRTC---源码篇】(二)PeerConnectionFactory
  7. STM32-串口接收、发送数据实验-程序代码分析
  8. hexo+git+github+域名搭建个人博客提示404_不用花一分线,松哥手把手教你上线个人博客...
  9. LINQ语法之into
  10. MySQL OCP认证(文末附参考题)
  11. 前端开发【WEUI框架】移动端H5页面开发
  12. web测试点和app测试点
  13. MPP架构、常见OLAP引擎分析
  14. 我努力了18年,不是为了和你一起喝咖啡姐妹篇
  15. win7的计算机策略组,win7组策略如何打开以及如何禁用组策略
  16. c语言char类型怎么输出,c语言中char类型数组的输出问题--输出时为何需要符?...
  17. 实现微信公众号自定义分享功能,分享给朋友,分享到朋友圈,点击链接,获取点击分享者的openid。
  18. 安装JDK报错“当前页面的脚本发生错误”解决方案
  19. idea提示红色但是代码没有错误,编译通过
  20. 【Tool工具】LICEcap 推荐 GIf录制工作- 如何简单录制一个gif(Mac Window都可)

热门文章

  1. 浅析企业建站都需要了解哪些基础内容?
  2. 浅析网站SEO整站优化的优势!
  3. 网站关键词排名骤降的原因及解决办法
  4. qt5编程入门 第2版_2小时入门SparkSQL编程
  5. 开发日记-20190606 关键词 闲散度日
  6. 数据库索引数据结构总结——ART树就是前缀树
  7. 需要排序的最短子数组的长度——是一个排序好的数组,中间某一部分被打乱了,让你找出打乱的那个子数组...
  8. lucene .doc文件格式解析——见图
  9. parquet文件格式——本质上是将多个rows作为一个chunk,同一个chunk里每一个单独的column使用列存储格式,这样获取某一row数据时候不需要跨机器获取...
  10. 限制数据记录查询数量