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

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

 unit GlobVar;

 interface

 uses System.SysUtils, System.Classes,IdTCPConnection,System.Generics.Collections,
Datasnap.DSTCPServerTransport,IdWinsock2,Data.DBXCommon,Datasnap.DBClient,
Datasnap.DSServer, Datasnap.DSCommonServer; type
pClientConns = ^TClientConns; // 客户连接 TClientConns = record
ClientId: integer;
Ip: string;
Port: string;
LoginTime: TDateTime;
end; const
gb_MaxConnNum = ;//每个进程最大连接数设置为1000 var
gb_ClientConnects: TDictionary<TIdTCPConnection, pClientConns>; // 客户端连接字典
gb_ConnnectCount:Integer=; //....

二、ServerContainer1.pas单元:

 uses GlobVar;
//...
procedure TServerContainer1.DSTCPServerTransport1Connect(Event: TDSTCPConnectEventObject);
var
p: pClientConns;
begin
try
if gb_ConnnectCount >= gb_MaxConnNum then
begin
LogInfo('已超过系统授权的客户连接数');
TIdTCPConnection(Event.Connection).Disconnect;
Exit;
end;
InterlockedIncrement(gb_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;
gb_ClientConnects.Add(TIdTCPConnection(Event.Connection), p);
PostMessage(Application.SrvMainForm.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 gb_ConnnectCount >= then
InterlockedDecrement(GlobalVar.gb_ConnnectCount);//GlobalVar.pas单元中定义了系统全局变量
p := gb_ClientConnects.Items[TIdTCPConnection(Event.Connection)];
if Assigned(p) then
begin
SendMessage(Application.SrvMainForm.Handle, WM_DELUSER, wParam(p), );
gb_ClientConnects.Remove(TIdTCPConnection(Event.Connection));
end;
except
Exit;
end;
end;

三、SrvMainForm.pas

 procedure TSrvMainForm.AddUser(var msg: TMessage);
var
p: pClientConns;
begin
try
lbl_MaxCount.Caption := IntToStr(gb_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('LoginTime').AsDateTime := p^.LoginTime;
ClientDataSet1.FieldByName('Conn').AsInteger := msg.LParam;
ClientDataSet1.Post;
end;
except
on E: Exception do
begin
LogInfo('TSrvMainForm.AddUser---' + E.Message);
exit;
end;
end;
end; procedure TSrvMainForm.DelUser(var msg: TMessage);
var
p: pClientConns;
begin
try
lbl_MaxCount.Caption := IntToStr(gb_ConnnectCount);
p := pClientConns(msg.WParam);
if Assigned(p) then
begin
if ClientDataSet1.FindKey([p^.ClientId]) then //Id字段请设置索引
ClientDataSet1.Delete;
Dispose(p);
end;
except
on E: Exception do
begin
LogInfo('TSrvMainForm.DelUser---' + E.Message);
Exit;
end;
end;
end;

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

DataSnap如何监控Tcp/IP客户端的连接情况的更多相关文章

  1. [转]linux下iftop工具的安装与使用详解(图文)——实时的网络流量,监控TCP/IP连接(单机)

    原文链接:http://www.jbxue.com/LINUXjishu/10735.html 在linux中监控系统资源.进程.内存占用等信息,可以使用top命令.查看网络状态可以使用netstat ...

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

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

  3. TCP/IP详解--连接状态变迁图CLOSE_WAIT

    终止一个连接要经过4次握手.这由TCP的半关闭(half-close)造成的.既然一个TCP连接是全双工(即数据在两个方向上能同时传递,可理解为两个方向相反的独立通道),因此每个方向必须单独地进行关闭 ...

  4. 基于TCP/IP的长连接和短连接

    1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次 ...

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

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

  6. 2015/12/14 Python网络编程,TCP/IP客户端和服务器初探

    一直不是很清楚服务器的定义,对于什么是服务器/客户端架构也只有一个模糊的感觉.最近开始学习,才明白一些什么服务器和客户端的关系. 所谓的服务器,就是提供服务的东西,它是一个硬件或者软件,可以向一个或者 ...

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

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

  8. SQL Server 连接问题-TCP/IP

    原文:SQL Server 连接问题-TCP/IP 出自:http://blogs.msdn.com/b/apgcdsd/archive/2012/02/24/ms-sql-server-tcp-ip ...

  9. TCP/IP, WebSocket 和 MQTT

    按照OSI网络分层模型,IP是网络层协议,TCP是传输层协议,而HTTP和MQTT是应用层的协议.在这三者之间, TCP是HTTP和MQTT底层的协议.大家对HTTP很熟悉,这里简要介绍下MQTT.M ...

随机推荐

  1. NSURLConnection 网络超时的那些事(转别人整理的)

    NSURLConnection 网络超时的那些事(转别人整理的) 在ios平台上做网络开发最常用的两个类: NSMutableURLRequest *urlRequest = [[NSMutableU ...

  2. iOS 关于UIscrollView

    设置 滚动起始位置 [scrollView setContentOffset:CGPointMake(0, 0) animated:YES];

  3. 【Android 界面效果37】ViewStub的应用

    在开发应用程序的时候,经常会遇到这样的情况,会在运行时动态根据条件来决定显示哪个View或某个布局.那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在 ...

  4. Jax-ws开发实例

    初次接触Jax-ws(Java API xml web Service)感觉挺简单的,在这里写下我的所学的: 大概的顺序是:首先定义接口 ,然后写接口的实现类,最后编写客户端.步骤是挺简单的,来看看代 ...

  5. VMware系统运维(十二)部署虚拟化桌面 Horizon View 5.2 Viewcomposer安装

    1.首先打开viewcomposer 2.进入到安装向导 3.点击"Next" 3.接受协议,点击"Next" 4.选择安装位置,点击"Next&qu ...

  6. ubuntu server 系统,更换阿里云源(用户更新源)

    Ubuntu安装完毕后,默认使用的是官方的源,在国内访问速度很慢,这里介绍更换为阿里云的源方法. 步骤如下: 1.备份源配置文件 sudo cp /etc/apt/sources.list /etc/ ...

  7. 第03篇. 标准Web项目Jetty9内嵌API简单启动

    一直以来,想改变一些自己早已经习惯的事情. 到了一定年龄,便要学会寡言,每一句话都要有用,有重量. 喜怒不形于色,大事淡然,有自己的底线. --胖先生 昨天,简单的说了一下关于Jetty9的配置,大家 ...

  8. 使用tornado的gen.coroutine进行异步编程

    在tornado3发布之后,强化了coroutine的概念,在异步编程中,替代了原来的gen.engine, 变成现在的gen.coroutine.这个装饰器本来就是为了简化在tornado中的异步编 ...

  9. 关于cornerstone无法上传library文件的问题

    在CornerStone中先选中左边的项目: 然后在菜单栏里面选择View->ShowIgnoreItems, 再选择项目中的library文件,点击Add按钮即可上传到服务器:

  10. Stimulsoft Reports筛选数据来绑定显示2个报表

    今天用Stimulsoft Reports做报表的时候,遇到一个问题,需要一个报表中显示2个报表视图,我在百度和博客园中搜索了一下,发现这方面的资料很少,我自己最后把问题解决了之后,整理了一下给大家分 ...