xe2心跳设置相关资料

delphi盒子sdhzth(通慧):

delphi xe2下的datasnap心跳包设置

1、在servercontainer文件中,先增加一个private变量,
      FConnections:TDictionary<TIdTCPConnection,TDSTCPChannel>;
2、在servercontainer1.datamoduleCreate(Sender:Tobject)中添加:
      FConnections:=TDictionary<TIdTCPConnection,TDSTCPChannel>.Create;  
3、在servercontainer1.DSTCPServerTransport1Connect中添加:
      FConnections.Add(TIdTCPConnection(Event.Connection), Event.Channel);
      Event.Channel.EnableKeepAlive(10000);//心跳包设置为10秒
4、在servercontainer1.DSTCPServerTransport1Disconnect中添加
      FConnections.Remove(TIdTCPConnection(Event.Connection));
      大家可以测试一下。
fiscan6430 (fiscan6430):将Transport的KeepAliveEnablement设置成kaEnabled,然后设置KeepAliveTime和KeepAliveInterval两个参数,如果意外断线的话,能够在Transport的Disconnect事件中获得。

http://bbs.2ccc.com/topic.asp?topicid=396438

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

SUNSTONE的Delphi笔记

http://blog.csdn.net/sunstone/article/details/5016363
 

 

Delphi2010中DataSnap,如果客户端异常掉线或拔掉网线,那么在服务端会留下一个TCP连接,这个连接会变成死连接(经过测试,如果windows的TCP保持连接禁用的话,三个小时该死连接还不消失)。如果大量客户端并发,出现的死TCP连接过多,服务器内存和端口将会增加,直到占满服务器的端口和耗尽内存为止。如果这样的话,服务器无法健壮稳定的运行。

 

大家可以另开线程来监控客户端连接,但是今天要给大家讲解的不是这个方法,而是使用TCP协议自带的心跳包功能解决这个问题。

 

大家先了解一下 TCP keep-alive原理

 

一个TCP keep-alive 包是一个简单的ACK,该ACK包内容为一个比当前连接sequence number 小于一的包。主机接受到这些ACKs会返

回一个包含当前sequence number 的ACK包。
Keep-alives一般被用来验证远端连接是否有效。如果该连接上没有其他数据被传输,或者更高level 的 keep-alives被传送,keep-alives 在每个KeepAliveTime被发送。(默认是 7,200,000 milliseconds ,也就是2个小时)。

如果没有收到 keep-alive 应答,keep-alive 将在每 KeepAliveInterval 秒重发一次。KeepAliveInterval 默认为1秒。如 Microsoft 网络功能中很多部分中采用的 NETBT 连接,更常见的是发送 NETBios keep-alives,所以,在 NetBios 连接中通常不发送TCP keep-alives。
TCP保持连接默认被禁用,但是微软Sockets应用程序可以使用SetSockOpt函数去启用他们。


请看下面的类

 

type
  TCP_KeepAlive = record
    OnOff: Cardinal;
    KeepAliveTime: Cardinal; // 多长时间(ms)没有数据就开始send心跳包 
    KeepAliveInterval: Cardinal // 每隔多长时间(ms)send一个心跳包,发5次(系统值)
end;

 

KeepAliveTime: TCP连接多长时间(毫秒)没有数据就开始发送心跳包,有数据传递的时候不发送心跳包
KeepAliveInterval: 每隔多长时间(毫秒)发送一个心跳包,发5次(系统默认值)

 

如果客户端网络中断,服务器系统发送心跳包后,服务器会自动解除TCP连接。这一点,大家可以使用 netstat -p -tcp 命令查看

 

接下来我们将结合Delphi2010 DataSnap技术使用心跳包功能!敬请关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值