为了能让我们的服务程序更加稳定,有些细节问题必须解决。就如上一讲中提到的客户端拔掉网线,造成服务器上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中构建于D2009架构之上,并对此架构做了进一步的扩展,包括使用两个向导来创建新的 部署目标(VCL窗体,Window服务,控制台及面向Web的ISAPI,CGI或Web App Debugger).HTTP(S)传输协 议,HTTP验证,客户端回调函数...
Delphi2010 DataSnap白皮书(翻译参考书)
Android studio客户端连接 Delphi XE REST DataSnap服务器
翻译Marco Cantù的REST Servers in Delphi XE Using DataSnap,对于初次接触DATASNAP并尝试使用其REST方式开发WEB或多层服务器架构的人员对相关概念的正确认知极有帮助,同时也包含部分对DELPHI中使用JSON的方式有...
Delphi 10.1 Berlin DataSnap 开发手册 高清版 V2017-5-22.rar
官方介绍Delphi2010下的DataSnap技术白皮书。
用Delphi2010的DATASNAP开发三层数据库应用源码。
在Delphi中使用Rest Severs的pdf书籍和相关源码,是学习Delphi Rest架构的很好资料。
Delphi2010 DataSnap白页中文2010年3月31日.pdf
Delphi_2010,DataSnap白皮书,word版
花了一个星期的时间把Delphi 2010 Datasnap的三层架构搭了起来,对初学Datasnap非常有帮助,只需构搭了起来剩下的就是发挥你的工发大脑了。代码为分服务端和客户端
delphi xe10.1的datasnap 三层结构完整服务端开发源码,适合新手学习使用,我个人在网上找了很多资料,搭建起来的平台
Delphi xe10 DataSnap 源码, Delphi xe10 DataSnap源码
DataSnap Demo:TFDConnection、最大连接数、客户端回叫功能、多线程模拟、压力测试等,编译环境XE6 Update 1
分8个章节讲述了如何用Delphi XE8 DataSnap开发系统
Datasnap实现手机对服务器上数据库的操作(以sqlite数据库为例,通过Datasnap技术,让手机程序如何访问服务器上的数据库,并实现了对数据库的增删改操作)
REST Servers in Delphi XE Using DataSnap.pdf
Delphi10.1 Berlin DataSnap 开发手册 PDF及源码
安卓使用DATASNAP的例子。
演示了delphi xe5开发的DataSnap服务器和Windows、android客户端程序。 具体参看 http://www.cnblogs.com/ChinaEHR/p/3373364.html