[求助]datasnap为什么http连接也会产生tcp死连接

datasnap为什么http连接也会产生tcp死连接

来源:csdn

【xe6下,用http连接方式连接datasnap服务器,端口如38081 服务器指定lifecycle为Session方式 当客户连接服务器后进行数据库查询,我跟踪过TDSServerModule模块,会在调用方法是创建,如果调用过方法,关闭客户端是服务器的TDSServerModule会释放 用netstat -ano | findstr "38081"  查看会有一个tcp连接   TCP    0.0.0.0:38081          0.0.0.0:0              LISTENING       8796  TCP    192.168.0.169:38081    192.168.0.208:2017     ESTABLISHED     8796  TCP    [::]:38081             [::]:0                 LISTENING       8796 ------------------------------------------------------ 如果客户端调用过服务器的方法,然后断开客户端网络,再接通网络,然后客户端 再调用服务器的方法会返回错误 Socket Error # 10054 Connection rest by peer 如果把客户端的连接关掉重连,又会产生一个新的tcp连接,而且老的还在   SQLConnection1.Connected := False;     SQLConnection1.Connected := True;   TCP    0.0.0.0:38081          0.0.0.0:0              LISTENING       8796   TCP    192.168.0.169:38081    192.168.0.208:2017     ESTABLISHED     8796   TCP    192.168.0.169:38081    192.168.0.208:2069     ESTABLISHED     8796   TCP    [::]:38081             [::]:0                 LISTENING       8796 这样子如果网络有问题的话,岂不是会产生很多无效的连接和内存占用? 请问如何解决这个问题,十分感激】 dongyonggan:

会不会是第二次的时候没有重新创建。因为第一次关闭的时候已经释放掉了。

2014-10-27

lyhoo163:

服务器指定lifecycle为Session方式:

这是delphi默认属性。Session会为每个来自客户端的链接,建立一个线程来实例化。创建一个内在连接(线程),供客户端直接使用。这个线程和实例化并不释放,直到客户端中断连接。如果有100个以上客户端,那么你的服务器将会有100线程和实例,对服务器硬件和内存是个考验。

2014-10-28

lyhoo163:

它的释放机制如下:

1、如果客户端正常下线,它释放;

2、如果客户端非正常下线,如:网络断线,EXE出现异常,它也释放。

所以,当客户端出现意外,已经造成服务器释放的情况下,客户端再现读取数据,就会出现

再调用服务器的方法会返回错误

Socket Error # 10054 Connection rest by peer

如何解决,需要软件重新连接,才能正常读取数据。

2014-10-28

lyhoo163:

特别是,DataSnap通过外网连接时,学会出现异常断线。解决这一问题:

1、可以采取心跳的办法,定时检查出现异常,重新连接。

2、在读取或写数据时,可以先前通过读取一个小的数据,试探一下,异常尝试就连接,连接不成功,提示信息。

2014-10-28

luodang007:

谢谢大侠回复

,不过我想知道的问题是,我用的是http方式连接的服务器,为什么会有一个tcp连接(网络小白请原谅

),而且当我把客户端的网卡禁用再启动后,我就无法连接服务器了,这时我就进行了重连,重连可以成功,不过之前那个tcp连接就死掉了,而且那个session创建的datamodule之类的东西也没释放。

我在网上看服务器那边主动释放session都是基于tcp ip连接来的,http根本没人提及,但实际上如果客户端断网的话,会产生一个死session直到重启服务器,如果网络不太稳定的话,服务器感觉很容易耗尽资源,求如果处理

2014-10-28

gykthh:

这种方法 建议你的connetion控件 动态创建 使用后释放

每打开一次会占用一个连接  close也不行 只能释放

不然会一直占用连接的 直到内存占完 死机

2014-10-28

luodang007:

感谢回复

我看用webservice写的话里面就是每次创建后释放,但是这样子不会造成内存碎片过多的后果么,自己没能力来重新写内存分配机制,而且用短连接的话,第一次连上会比较慢吧,所以每次查询都会慢不少。

综上所述,我想问问有没有能在datasnap服务器那么主动杀掉使用http连接服务器时产生的那个tcp连接

网上查到都是用DSTCPServerTransport1Connect事件中获取tcp连接通道,然后杀掉的

而TDSHTTPService没有类似的事件,也获取不了连接通道

用http连接的主要看资料说可以穿透防火墙,外网访问用这个好

2014-10-28

gykthh:

我试过的 不造成的  同样一个方法 在IE里面调用 一直按f5刷新 机器还是正常的

使用前者 按几次 就挂掉了

2014-10-28

luodang007:

好吧,这样子用是可以用,不过更希望有http长连接的处理方案,一周后如果没有更满意回答就结贴吧

ps这个东西搞完后还是去学。net吧,用delphi的感觉越来越少了

2014-10-28

lyhoo163:

我的DataSnap服务器,试过当关闭网卡,造成tcp ip断线,服务器的动态连接会自动释放。

我在服务器上弄了一个计数器,显示释放了。

2014-10-29

lyhoo163:

这是DataSnap的基本功能,这做不到。谁都不能使用的DataSnap了。

2014-10-29

luodang007:

可是我的就是没释放啊

如果我用tcp连接服务器,加上KeepAlive 后,禁用客户端网卡,重新启动网卡后,过了设定时间,服务器会断掉tcp连接,但如果网卡不启用,那个tcp连接也一直都在。

如果是http连接服务器,我就发现那边有个什么sessiontimeout,不过设置成12000,禁网卡后过了12秒也不会自动断tcp连接啊。

请问大侠有什么特别的设置吗?万分感谢

2014-10-29

luodang007:

大侠如果有时间的话,可以看下xe6安装目录下有个\Embarcadero\Studio\14.0\Samples\Object Pascal\DataSnap\Authorization目录,编译里面的AuthServerProject.dproj和SimpleDelphiClient.dproj,然后把客户端放一台机器填写host,选择http后,调用ReverseString函数成功,禁用网卡。服务器用netstat -ano | findstr "8081"命令查看,可以看到一个连接8081的tcp连接一直是ESTABLISHED 的状态

2014-10-29

lyhoo163:

建议你在服务器,增加一个连接计数器,查看断线后是否内存(TRemoteDataModule)释放。

2014-10-30

luodang007:

我是在TDSServerModule的DSServerModuleDestroy、DSServerModuleCreate事件里面加了断点,如果客户端做完查询操作,创建了TDSServerModule,正常关闭客户端时,会进入DSServerModuleDestroy断点;如果是客户端断网重连,发现又重新进入了DSServerModuleCreate,而之前创建的那个TDSServerModule,只有当关闭服务器时才能进入断点

2014-10-31

gaoxumei:

这个问题一真困扰,不知道大神解决了没有。。。

服务器时间长了,客房端经常有不正常下线的,大量资源占用,最后服务器端直接失去响应

2016-01-05

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。

http://www.pinlue.com/style/images/nopic.gif
分享
评论
首页