一个基于midas三层结构的程序外网断线的问题(还有谁碰到过类似问题,是如何解决的呀,应该不只我一个吧) (30分)

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

fjx_jwf

Unregistered / Unconfirmed
GUEST, unregistred user!
我用写了一个基于midas三层结构的程序,应用服务器采用ado与sqlserver2000连接,
客户端采用tsocketconnection连接
但是在使用时发现在局域网内网的客户端从来不会发生掉线
而外网客户端采用adsl上公网接入却发现如果一直操作不会发生断线,而
如果三分钟不做任何操作时就要断线,为什么呢,
 
1.socket server有一个选项:timeout,你可以设为:0。这样服务端不会主动断开客户端。
2.SocketConnection 有一个AfterDisconnect 事件,你在这个事件里写些代码,一但发现短开网络,就关闭程序。这样数据不会出错了。
 
应该与socketserver的timeout的值无关,因为我在内网用同一个端口就没有出现掉线
 
我现在也遇到这个问题:
外网2,3分钟不用就短网。而在同一个端口下的内网确没事。
timeout=0
 
我现在只好暂时每隔100秒执行一个select 0 来解决,不过有谁知道到底是为什么会出现呀
我经过多次测试都是刚好两分钟就掉线
 
我写的一个程序,用了7-8个月了,没出现过这种问题呀。
那你把timeout改为120(分钟)试试看呢?你自己拨号连上去看看会不会断,是不是网络的问题。
如果以后解决这个问题要留下解决方法哦
 
我建议你跟踪SocketServer程序,我们就是根据自己的一些学要在上面做了一些修改,效果很好
 
to sooven:timeout改为120分钟外网还是一样如果两分钟不作任何操作就断了
to xujh:你是如何跟踪的
 
说另一个有趣的解决话题:
你为什么要保持SocketConnection的连接总是为True呢?(除了浪费服务器的资源外,好像没有更好的理由)。
在你需要的时候设置Socket的连接是Open的,取得或更新数据后就Close连接不是更好的方法吗?(至少我是这样做的)
虽然我没有看过SocketServer的源码,但是想必写这个东东的人一定也不希望你在广域网中没有传输任何数据的情况下一直保持连接状态,因为这样迟早要把服务器拖垮。
 
to blue_morning:有点道理哈
还有更好的方法吗
 
另外为什么从scktsrvr中取得外网的客户端的ip地址是网关地址192.168.0.1 而内网却完全正确
 
有点道理哈
还有更好的方法吗
不是有点道理,本来就是正确的。
---------------------------
另外为什么从scktsrvr中取得外网的客户端的ip地址是网关地址192.168.0.1 而内网却完全正确
非常抱歉,我好像一直都没有去关心过SocketServer上显示的东西,主要是去关心我写的业务逻辑。如果你需要得到正确的客户端机器说明。那么在用户Login的时候,客户端读取这些信息送到服务器端保存就可以了。在用户LoginOut时删除这些数据
---------------------------------
如果SocketServer已经没有连接的问题了,就专注你的程序要解决的问题吧。
 
to blue_morning:非常感谢,我会尽快给你加分
换个问题:在scktsrvr中显示的列表中有一个socket的handle,我想这个handle应该是与
remote data module 中的一线程相关联吧?既一个用户登录后在scktsrvr中应产生一个新的线程的sockethandle 同时remote data module也产生一个新的线程与之对应
现在是我如何才能在客户端取得所对应remote data module线程的sockethandle呢
这儿的分太少,因为我只有这么多了,可以去http://www.delphibbs.com/delphibbs/dispq.asp?lid=2436652拿分
 
接受答案了.
 
个人觉得是不关联的,Socket只是实现了通信的实体。
而remote data module中的线程模型在你创建remote data module时决定。
李维的“系统篇”好像有讲remote data module线程模型的。你参考看看。
-》现在是我如何才能在客户端取得所对应remote data module线程的sockethandle呢
你想要的目的是什么,我看看能不能帮助你。
有分我去报到去了。我可是爱分如命的。 :)
多谢多谢
 
to blue_morning:是因为在scktsrvr中显示的列表中有一个socket的handle,我想这个handle应该是与
remote data module 中的一线程相关联吧?既一个用户登录后在scktsrvr中应产生一个新的线程的sockethandle 同时remote data module也产生一个新的线程与之对应
因为我想从客户端取得sockethandle,因为在scktsrvr中不能取得外网客户端的计算机ip地址,而得到的是网关的ip地址,在局域网内是正常的。因为我的应用服务器是与scktsrvr写在一起的,并且我的系统客户端是与网卡mac地址绑在一起的,所以必须取得sockethandle以把mac地址传到scktsrvr中进校验
 
老大,你这样做法也太死板和复杂了吧。
用户Login时用一个函数读起MAC地址和用户名,密码一同发过来,在AppSvr中验证不行吗?
我就不信用户在登录完后要热插拨网卡。
另外好久没有来,一看时间怕是耽误你了。就死马当活马医吧。
另外我重新看了Remote DataModule中线程李维书上的介绍,确实是单线程。所以新的线程的sockethandle 同时remote data module也产生一个新的线程与之对应是不可能的。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部