200分够吗?菜鸟认为很高难的问题:我使用了clientsocket和serversocket两个控件做程序,当客户端连接和断开连接服务器上都可以看的出来,这个

  • 主题发起人 主题发起人 苦命的人
  • 开始时间 开始时间

苦命的人

Unregistered / Unconfirmed
GUEST, unregistred user!
200分够吗?菜鸟认为很高难的问题:我使用了clientsocket和serversocket两个控件做程序,当客户端连接和断开连接服务器上都可以看的出来,这个我能实现,但是如果客户端假如说网线掉了这些客户没有主动断开连接的情况,我的服务器端就没有办法发现客户端断开了,怎么判断呢???(200分)<br />200分够吗?菜鸟认为很高难的问题:我使用了clientsocket和serversocket两个控件做程序,当客户端连接和断开连接服务器上都可以看的出来,这个我能实现,但是如果客户端假如说网线掉了这些客户没有主动断开连接的情况,我的服务器端就没有办法发现客户端断开了,怎么判断呢??

我估计是用这种方法,服务器向客户端发出信息,如果客户端没有返回信息就说明掉线了。
可是代码怎么实现呢?
 
苦命的人呀
我也和你有同样的问题
请哪位高手帮帮忙了
 
在非正常退出的情况下
ServerSocket的OnClientError可以查到这个错误的来源的IP与端口
 
在onError事件中判断,如下:
procedure TForm1.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
if ErrorEvent=eeConnect then
begin
Application.MessageBox('无法连接对方计算机,请查看对方计算机的文件接收器是否已打开及其IP地址设置是否有误!','提示',mb_ok+mb_iconError);
ErrorCode:=0;
end;
end;
 
我很想和你进行讨论。顺便也问一些问题。
首先在进行连接时可以设置超时,这样如果系统在通讯中没有进行操作就可以监测socket是否active。你的通讯是连接一直保持吗?也可以设置一个定时器,定时判断。
最好的办法是取得当前socket的状态,察看是否active来确定客户机是否还可用。
 
我觉得在服务器端只要不是最后一个客户端程序断开,就难以触发错误事件,还是依靠定时器好了。
 
每过一段时间要求客户端向服务端发送固定的消息,如果两个时间段都没有消息过来则判定客户端掉线。
代码的方法应该很简单呀,你不是可以通过服务端接受客户端的消息吗,自定一段消息代码然后判断不就可以了。比如说客户端发送"我在线",服务端就向他提供服务;没有则断开服务。
 
我来告诉你
客户端连接断开(不论什么原因只要断开)就会触发tserversocket的onclientdisconnect事件了
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
socket//在这里就知道是哪一个客户端断开了、地址、IP、什么的都可以知道了
end;
呵呵,。。。给分
 
maomaoel大侠,您费点事,把代码也写上吧!!
 
maomaoel大侠你是不是搞错了,
我在服务器端写上
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
showmessage('肯定有人断开了!!');
end;

我的客户端连上后,我拔了网线,服务器并没有任何反应啊???
 
啊,还要什么代码?
你想要实现什么样的功能?
我一般都是定一个类型为TCustomWinSocket的数组,
然后在tserversocket的onconnect(好象是这个具体的记不清)事件中把socket添加到这个数组中,就知道哪些客户连上来了
在onclientdisconnect事件中把socket从数组中减去,就知道哪些客户断开了
至于具体的什么IP 客户机器名,你在IDE中在 socket后面打一个.就会自动出来属性的了
自已动一下手了,全靠别人是没有进步的
 
在客户端的断开事件中写东西,给服务器发送消息
 
难呀,我也有这样的问题,如果在服务端用Connect来连接检查的话,见到一个已
断开的机器,要用好久的时间!

还有,我的代码基本上是参考DELPHI的实例写的只是没有MEMO,可是有时退出程序
会蓝屏!!!!!!!!!!!
 
maomaoel,yanyandt2两位大侠,我问的是非正常断开的情况下触发什么事件,你们的回答不对吧??客户端非正常断开,服务器好象什么反映也没有??
 
没反应?
不可能的了,
我的好几个程序,都是这样写的,不会错的了
不过没有象你那样写什么showmessage()
按我的方法试试
 
原来是非正常断开。。。。
抱歉。。。
我所知道的就是 当服务器端在一定时间内没有收到客户端的任何信息,那么
就算断开了。
 
非正常断开的情况下不会触发什么事件的。而且由于非正常断开的客户端没有给服务端
发断开连接通知, 因此服务端还会保留该连接线程,对资源是浪费的。
这种情况下, 什么事情都不会发生, 因此你用正常的手段,无法判断有没有断开。

恐怕只好借助Sockect通讯方面的函数定期对客户端进行轮询,如果客户端没有响应,说
明该客户端已经找不到了, 自然是脱钩了。

哦, Sockect通讯中, 当空闲若干时间后, 不响应或无操作, 自动断开。
这个时间比较长……

另外有什么高招? 咱听……
 
有的,非正常断开也会触发tserversocket的onclientdisconnect事件了
,tcp/ip会维护每个连接的,
 
tcp是没有网络断开通知的
定时发自己的keep-alive包
 
你可以在client端定时(如隔30s)向server发送一个数据包,说明你是在线的。
如果server在收到一个包后,在隔30s后,没有收到的在线数据包。那server就可以判断你已经断线。来处理。关闭与client的连接。
 
后退
顶部