Delphi2010中DataSnap高级技术(5)—建立稳定服务程序之TCP心跳包的使用

转载 2011年01月11日 15:27:00

为了能让我们的服务程序更加稳定,有些细节问题必须解决。就如上一讲中提到的客户端拔掉网线,造成服务器上TCP变成死连接,如果死连接数量过多,对服务器能长期稳定运行是一个巨大的威胁。

另外,经过测试,如果服务器上有TCP死连接,那么服务程序连接数据库,也会产生那个一个死连接。这样的话,给数据库服务器也造成威胁。所以,服务器程序编写的好坏,直接影响系统的稳定性!

如何解决TCP死连接的问题,有多种方法,其中最有效的就是心跳包技术。

我们在DSServer的OnConnect事件中加入心跳包代码

uses IdTCPConnection,IdWinsock2

........

type
  TCP_KeepAlive = record
    OnOff: Cardinal;
    KeepAliveTime: Cardinal;
    KeepAliveInterval: Cardinal;
end;

........

procedure TServerContainer1.DSServer1Connect
  (DSConnectEventObject: TDSConnectEventObject);
var
  Val: TCP_KeepAlive;
  Ret: DWord;
  ClientConnection: TIdTCPConnection;
begin
  ClientConnection := TIdTCPConnection(DSConnectEventObject.ChannelInfo.Id);
  Val.OnOff := 1;
  Val.KeepAliveTime := 5000;
  Val.KeepAliveInterval := 3000;
  WSAIoctl(ClientConnection.Socket.Binding.Handle, IOC_IN or IOC_VENDOR or 4,
    @Val, SizeOf(Val), nil, 0, @Ret, nil, nil);
end;

观察上述代码,我们把心跳包放到服务端上执行,如果服务器的某个TCP连接在5秒钟没有收到数据,将会发送向对端发送心跳包,间隔3秒钟,连续发送5次(参数详解见上一讲高级技术4)。如果5次以后对端还没有应答,服务器将结束该TCP连接。TCP的连接可以使用 netstat -p tcp 命令查看。

当该TCP结束后,delphi编写的服务程序会自动结束和数据库的连接。我用的是FireBird数据库,大家可以使用命令查看 SELECT MON$USER, MON$REMOTE_ADDRESS,
  MON$REMOTE_PID,
  MON$TIMESTAMP
 FROM MON$ATTACHMENTS

现在服务器的tcp死连接和数据库的死连接都清除了,我们的系统将能长期稳定的运行


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sunstone/archive/2009/12/17/5023718.aspx

相关文章推荐

Delphi2010中DataSnap高级技术(5)—建立稳定服务程序之TCP心跳包的使用

原文出处:http://blog.csdn.net/sunstone/archive/2009/12/17/5023718.aspx 为了能让我们的服务程序更加稳定,有些细节问题必须解决。就如上一讲中...

Delphi2010中DataSnap高级技术(6)—加强服务程序对访问者的控制能力

Delphi2010中DataSnap高级技术(6)—加强服务程序对访问者的控制能力
  • shuaihj
  • shuaihj
  • 2011年01月11日 15:28
  • 2356

Delphi2010中DataSnap高级技术(4)—TCP keepAlive和KeepAliveInterval参数详解

Delphi2010中DataSnap高级技术(4)—TCP keepAlive和KeepAliveInterval参数详解
  • shuaihj
  • shuaihj
  • 2011年01月11日 15:26
  • 2720

[转]Delphi2010中DataSnap高级技术(4)—TCP keepAlive和KeepAliveInterval参数详解

====================================================== 注:本文源代码点此下载 =============================...

Delphi2010中DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明

Delphi2010中DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明
  • shuaihj
  • shuaihj
  • 2011年01月11日 15:29
  • 2323

Delphi开发的后台服务程序也可以7x24小时长时间稳定运行

现在用Delphi的人越来越少了,不过没关系,编程的经验应该是可以相通的,并不限于某种语言工具。我最开始也只是用C/C++,但后来我发现Delphi也挺好,在日常的信息系统开发中更具优势,因此就更偏向...
  • huzgd
  • huzgd
  • 2011年02月15日 00:11
  • 7466

Delphi2010 服务程序修补 示例

  • 2012年11月24日 16:25
  • 1KB
  • 下载

Delphi2005建立网络服务程序

  • 2012年01月10日 10:54
  • 101KB
  • 下载

Delphi Xe DataSnap Rest + Flex 开发 基本探索5(Rest 服务参数传递)

在读本文章前请参考 前面的文章 介绍

VS2010 ATL服务程序编写全攻略(一) - 建立ATL服务

网上有很多关于编写ATL服务程序的代码和文章,但多数仍使用Visual C++ 6.0的ATL服务程序框架。对于XP系统,Visual C++ 6.0提供的框架能够正常工作,但对于Vista、Wind...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi2010中DataSnap高级技术(5)—建立稳定服务程序之TCP心跳包的使用
举报原因:
原因补充:

(最多只允许输入30个字)