clientsocket 怎么判断端口已断开,然后重新连接.(50分)

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

fengfan

Unregistered / Unconfirmed
GUEST, unregistred user!
写socket通信程序,使用TcpClient进行连接服务器,现在的问题是当TcpClient 连接服务器后,因为异常断开后,客户端并不知道断开,该怎么知道断开并自动进行重新连接啊.
 
用超时来判断
客户端连接服务器应该有个时间戳,在规定的时间内没有回应就超时退出
 
你定时往服务器发一个测试数据,如果出现错误信息(出现OnError事件),通常就是已经断开了
 
用TCPClient的Disconnect事件来做
begin
TcpClient.active := false;
TcpClient.open;
end;
 
对tcp/ip来说,如果时异常断开,最快也要2个小时才能知道,并且还要设置了有关参数的。
为了保证常连的socket正常工作,最好的解决方法是socket双方定义一条网络测试的消息,
定时发送和接收,如果发送或者接收不成功,就断开重新连接。如:srv端发一个123,cli
端收到后回一个456。
 
to :henrynj ,
怎样实现啊,是不是又要写timer控件了.

to :SS2000
好像出现错误并不是断开吧,而且我现在测试的是断开了以后发送数据都提示成功啊.而且你不发数据就不知道断开了.这也不符合要求.

to :hualex

好像没有用啊.根本就不写状态.

to :chenxz

这样不是也要用到timer 控件啊.
 
fengfan,
你断开后,发送数据成功?
你搞错了,snedbuf是成功,但并不表明发送到对方那里去了(只是放入缓冲区里了,或则只是发出去了,但并不知道是否到达目的地,就像发信,你只是给邮局了,但并不知道对方是否收到,说不定过了半月,又给你退回来了,查无次人),通常会延时一段时间后才会有错误报告,触发OnError。出现错误并不是断开?不知道你什么意思?

>>你不发数据就不知道断开了.这也不符合要求.
从原理上讲,你连接上以后,不作任何操作,是不可能知道是否断开了!所以,不会有符合你的要求的方法。还有另一个折中的办法,利用另一个client不停的连接server,如果连不上了,就说明链路不通了(可能更不符合你的要求)

所以,这个问题应该首先从原理上分析有什么办法,再看用哪种更简单方便。
我告诉你的方法是最简的方法之一,不存在不符合要求的问题。你之所以有这样的要求,是因为你对TCP/IP的原理不清楚才提出来的。
 
Stream := TWinSocketStream.Create(Socket, waitTime);
try
FillChar(Buff, 1024, 0);
if Stream.WaitForData(waitTime) then
begin
if Stream.Read(Buff, 1024) = 0 then
self.Close;
Text:=Text+buff;
 
to :ss2000,
第一个我们想法一样.难道只能这样解决吗?
 
那你得先学学TCP/IP的原理。
其实编程语言是次要的,这点大部分人都不能正确认识。
编socket程序,关键是你要了解精通TCP/IP才能成为高手,而不管你用什么语言。
脱离TCP/IP原理去想办法是徒劳无功的,也是可笑的。
象楼上说的以下代码,就是不了解TCP/IP原理,想当然出来的办法。

>用TCPClient的Disconnect事件来做
>begin
> TcpClient.active := false;
> TcpClient.open;
>end;
 
楼上的,我有时间当然要看原理了.现在是要解决这个问题.该怎么做啊.
 
我已经给你办法了,你又嫌不好,不采用,那你就只有自己去看原理了,我还能怎么办?!
 
我的程序是两个线程,一收一发,当连接断是接收会有错误返回的,看一下错误号就知道是不是断了,发送也是一样的
 

Similar threads

后退
顶部