SeverSocket如何立刻相应Client端非正常中断连接。(100分)

  • 主题发起人 主题发起人 hxg
  • 开始时间 开始时间
H

hxg

Unregistered / Unconfirmed
GUEST, unregistred user!
SeverSocket如何立刻相应Client端非正常中断连接。
如客户端非正常关机等。
 
在ClientDisconnect得到通知
在ClientError里取得socket errorcode
 
利用
try
except
end
但有时(很少)不行
 
zhang16:
当客户端非正常关机时,根本就不存在ClientSocket以及其事件了。
 
to hxg:
我说的是在SeverSocket的OnClientDisconnect事件中而不是ClientSocket,
同理ClientError也是SeverSocket的OnClientError事件。
 
对于异步的serversocket有onclientdisconnect事件,对于同步不就没有这个事件了吗?
对于同步的socket应该如何处理?
 
我试了一下,当客户端非正常关机时,服务端的SeverSocket的OnClientError
和OnClientDisconnect事件没有反应。(请注意:客户端非正常关机)
 
这个问题问得太不专业了!其实我也不知道!
 
to hxg
我试过,可以啊,我不知道为什么你的不可以。
to 侠圣
同步的SOCKET,是不是该用到Thread的3个事件来判断:OnGetThread、OnThreadStart、OnThreadEnd.
 
我试过,确实没有办法检测出来(你突然拔掉网线或者关闭客户端的电源等情况)。
折中的方式是client定时给server发送信息,如果服务器在一个时间内没有收到
client的信息,就认为中断了。
 
对,一般只能采用woodstock的方法,很多INTERNNET行情软件就是这样,没发出命令的时候隔一定时间
发出一在线信号,否则服务器主动断开连接,好象OICQ也一样,隔会也发在线信号
 
to silicon:
专业不专业无所谓,关键是要解决实际问题。我现在再开发一个C/S项目,
必须要再服务器端运行一个服务程序,用以监控和对客户的请求做出反映,如
在线用户监控、一个客户向另外特定的客户发送消息,以适时刷新另外客户的
数据。也就是说,有多个客户与服务器连接,服务器通过Socket.connections
来连接相应的客户。如果在某个客户非正常断线(非正常关闭电源等),服务器
端必须立刻刷新在线用户以及所有的连接,因为这时的Connetions可能是其它
的客户了。
To woodstock:
显然,每隔一段时间检查连接不能满足我的要求,因为,在下一个检查之前,
可能有新的用户登录或客户之间通过服务程序进行通讯等。
有没有其它办法?
 
>在下一个检查之前,可能有新的用户登录或客户之间通过服务程序进行通讯等
在ServerSocket中,每个连接占用的Connection是不一样的。只要针对每个Connection做一个时间记录
就可以了。
>这时的Connetions可能是其它的客户了
让每个客户登录时发出一个ID信号不就可以了?
还有,如果ServerSocket没有检测到客户端的断开,它是不可能让别的连接占用未被释放的Connection的。
Connection被占用的唯一情况是:发生Socket错误或服务器主动与客户端断开连接后又有新的客户登录。
而ServerSocket肯定能够检测到这种情况的。

另见LID=526441
 
to creation-zy:
你的办法好象可行。
>> 如果ServerSocket没有检测到客户端的断开,
它是不可能让别的连接占用未被释放的Connection的。

你的意思是说:比如原来有n个连接,如果其中一个客户断非正常
断电,而恰好另一个客户与服务器连接,这时连接数为n+1吗?
另外,如果在1..n个连接中间,一个客户m连接中断了,此时服务器向
第m连接发送消息,如果检验ID失败,能否重新刷新所有服务端连接,即
释放m连接,并将m+1连接更新为m连接等等?
 
你自己维护一个包含TCustomWinSocket和用户数据的列表
在连接的时候加入
在断开的时候删除
在一定错误的时候也删除
在一定时间没在线信号发来也删除,这样你要做什么也满足了,
检验ID失败,就可以断开连接了
 
to hxg:
是的。
至于重新刷新连接能否实现我就不知道了,不过我觉得这些是由ServerSocket负责管理的,
一个连接释放之后自然会将空处填补,程序不用管,也管不了。
 
我发现,在某一客户突然断线后,服务端的连接还存在,但向该
客户发送消息,将等待好几分钟才得到错误码10053的错误。请问
当向中断的客户发送消息,如何立刻捕捉到。
 
Server 上的socket连接能支持多少个?

有人作过具体的实验吗?200-300个能支撑住吗?
 
非常关注!!!!
 
后退
顶部