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

    技术2022-05-19  28

    原文出处:

    http://blog.csdn.net/sunstone/archive/2009/12/17/5023718.aspx

     

    为了能让我们的服务程序更加稳定,有些细节问题必须解决。就如上一讲中提到的客户端拔掉网线,造成服务器上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死连接和数据库的死连接都清除了,我们的系统将能长期稳定的运行。


    最新回复(0)