基于Midas/Socket/Scktsrvr的三层程序,如何在连接环节限制连接数?(50)

  • 主题发起人 主题发起人 fatalexception
  • 开始时间 开始时间
F

fatalexception

Unregistered / Unconfirmed
GUEST, unregistred user!
 架构:TSocketConnection -> scktsrvr.exe -> RemoteDataModule 现状:大量客户端(如200个)同时发起连接请求,中间层或scktsrvr明明无法处理这么多的连接,却又不推辞,最终导致客户端、中间层和scktsrvr都死掉。 期望:让scktsrvr限制Socket的数量,超过限度(如20个)之后的客户端可以向scktsrvr发出连接请求,但scktsrvr不分配给Socket,拒绝连接;客户端超时之后,弹出对话框提示用户。 条件:1、在客户端,必须由应用程序自己来捕获“无法连接”这个错误,不能让操作系统擅自弹出对话框;2、在客户端,必须由应用程序自己指定尝试连接的超时时间,不能无限地等下去。3、在服务器端,scktsrvr拒绝“超限客户端”的连接请求之后,仍然正常监听;当现有客户端释放连接,导致连接总数低于限制值时,scktsrvr又可继续接纳客户端的连接请求。4、在服务器端,scktsrvr拒绝一个“超限客户端”的连接请求时,必须干净地关闭或拒绝创建Socket,干净地结束或拒绝创建Thread,不能在内存里积攒越来越多的“死Socket”“死Thread”。5、可少量改写scktsrvr,但不能大量改写或全部重写,不能换架构,不能用第三方构件。    因为以前开的帖子都没有满足题意的答案,导致分数浪费,本帖先开50分。有满足题意的答案后另奉500分,绝不食言。
 
现在的DELPHI 2010 可以控制这个问题,通过中间层的 DSSERVER打开来控制客户端数,每打开远程连接,用户数就加1,每退出一个客户数就减少1,再通过客户端的函数,写一个函数,去取到中间层的用户数就可以,目前好像可以连接31个用户,如果超过这个值就会死了。所以当打开客户时,你就判断这个用户数如果等于31就在客户端用其他端口(如果原来是211)212就可以了,这样就解决你的问题。
 
与delphi版本无关,只与自己的水平有关scktsrvr.exe来本就有诸多问题,你如果想用在复杂的生产环境中,必须自己修改源码中一些错误.
 
to dikars:  这个方案恐怕不行。如果需要客户端读取中间层上的用户数,自行判断,那么,第一,违背了业务逻辑与客户端分离的原则,而且这还是涉及连接权限的重要逻辑,必须由中间层处理;第二,仍然需要先成功建立连接,而且还要能成功调用服务器方法,这样中间层和scktsrvr.exe就已经被搞死了。
 
to aerobull: 是与水平有关。正是因为水平不足,才来发帖请教的啊。
 
我是这样实现的,在scktsrvr.exe 中封装一个中间层,端口可以较特殊比如8048,只实现一个Appserver接口可以获得连接数。这个中间层的连接不保存实例。1分钟后强制由scktsrvr断开。注意此端口的Remotedatamodule上没有任何数据控件。客户端,每次请求连接时,首先连接此中间层,取得连接数。符合要求时再连接其它的业务数据模块,端口不同于已封装的端口,比如 211,210等。
 
连接数和逻辑本来就没有关系,控制用户本来就很简单。DELPhi端口连接超过32个就会死机。只要控制中间层连接总数不超过32个的情况下就可以一直连接。你可以控制连接数为28个,如果再有用户连接时,就连接其他端口。自然就不会死机。
 
其实说明白一点就是控制线程数量。
 
谢谢dikars!我试着理解您的思路:专用于控制连接数的这个中间层,由于资源开销少,所以不容易死掉。是这个意思吗?我担心,用户数多到一定程度以后,这个中间层也会死掉。您有没有实测过这种方案的负荷上限?
 
后退
顶部