zoukankan      html  css  js  c++  java
  • delphi datasnap 心跳包

    为了能让我们的服务程序更加稳定,有些细节问题必须解决。就如上一讲中提到的客户端拔掉网线,造成服务器上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 命令查看。

    上述代码还不能直接使用,还需要引用一个winsock2.pas
    请到
    http://download.csdn.net/source/2921601 下载,下载后需要直接添加文件并引用文件即可

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

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

    http://blog.csdn.net/zhangxiaonanwin/article/details/6048912

  • 相关阅读:
    设计模式(观察者模式,MVC模式)
    设计模式(单例,委托模式)
    iOS API
    iOS介绍
    多种服饰颜色搭配
    国内npm镜像使用
    iOS开发拓展篇—应用之间的跳转和数据传
    iOS开发网络篇—使用ASI框架进行文件下载
    iOS开发网络篇—数据缓存(使用NSURLCache)
    iOS开发网络篇—发送json数据给服务器以及多值参数
  • 原文地址:https://www.cnblogs.com/findumars/p/5608615.html
Copyright © 2011-2022 走看看