F fengfan Unregistered / Unconfirmed GUEST, unregistred user! 2003-10-30 #1 写socket通信程序,使用TcpClient进行连接服务器,现在的问题是当TcpClient 连接服务器后,因为异常断开后,客户端并不知道断开,该怎么知道断开并自动进行重新连接啊.
H henrynj Unregistered / Unconfirmed GUEST, unregistred user! 2003-10-30 #2 用超时来判断 客户端连接服务器应该有个时间戳,在规定的时间内没有回应就超时退出
S SS2000 Unregistered / Unconfirmed GUEST, unregistred user! 2003-10-30 #3 你定时往服务器发一个测试数据,如果出现错误信息(出现OnError事件),通常就是已经断开了
H hualex Unregistered / Unconfirmed GUEST, unregistred user! 2003-10-30 #4 用TCPClient的Disconnect事件来做 begin TcpClient.active := false; TcpClient.open; end;
C chenxz Unregistered / Unconfirmed GUEST, unregistred user! 2003-10-30 #5 对tcp/ip来说,如果时异常断开,最快也要2个小时才能知道,并且还要设置了有关参数的。 为了保证常连的socket正常工作,最好的解决方法是socket双方定义一条网络测试的消息, 定时发送和接收,如果发送或者接收不成功,就断开重新连接。如:srv端发一个123,cli 端收到后回一个456。
对tcp/ip来说,如果时异常断开,最快也要2个小时才能知道,并且还要设置了有关参数的。 为了保证常连的socket正常工作,最好的解决方法是socket双方定义一条网络测试的消息, 定时发送和接收,如果发送或者接收不成功,就断开重新连接。如:srv端发一个123,cli 端收到后回一个456。
F fengfan Unregistered / Unconfirmed GUEST, unregistred user! 2003-10-30 #6 to :henrynj , 怎样实现啊,是不是又要写timer控件了. to :SS2000 好像出现错误并不是断开吧,而且我现在测试的是断开了以后发送数据都提示成功啊.而且你不发数据就不知道断开了.这也不符合要求. to :hualex 好像没有用啊.根本就不写状态. to :chenxz 这样不是也要用到timer 控件啊.
to :henrynj , 怎样实现啊,是不是又要写timer控件了. to :SS2000 好像出现错误并不是断开吧,而且我现在测试的是断开了以后发送数据都提示成功啊.而且你不发数据就不知道断开了.这也不符合要求. to :hualex 好像没有用啊.根本就不写状态. to :chenxz 这样不是也要用到timer 控件啊.
S SS2000 Unregistered / Unconfirmed GUEST, unregistred user! 2003-10-30 #7 fengfan, 你断开后,发送数据成功? 你搞错了,snedbuf是成功,但并不表明发送到对方那里去了(只是放入缓冲区里了,或则只是发出去了,但并不知道是否到达目的地,就像发信,你只是给邮局了,但并不知道对方是否收到,说不定过了半月,又给你退回来了,查无次人),通常会延时一段时间后才会有错误报告,触发OnError。出现错误并不是断开?不知道你什么意思? >>你不发数据就不知道断开了.这也不符合要求. 从原理上讲,你连接上以后,不作任何操作,是不可能知道是否断开了!所以,不会有符合你的要求的方法。还有另一个折中的办法,利用另一个client不停的连接server,如果连不上了,就说明链路不通了(可能更不符合你的要求) 所以,这个问题应该首先从原理上分析有什么办法,再看用哪种更简单方便。 我告诉你的方法是最简的方法之一,不存在不符合要求的问题。你之所以有这样的要求,是因为你对TCP/IP的原理不清楚才提出来的。
fengfan, 你断开后,发送数据成功? 你搞错了,snedbuf是成功,但并不表明发送到对方那里去了(只是放入缓冲区里了,或则只是发出去了,但并不知道是否到达目的地,就像发信,你只是给邮局了,但并不知道对方是否收到,说不定过了半月,又给你退回来了,查无次人),通常会延时一段时间后才会有错误报告,触发OnError。出现错误并不是断开?不知道你什么意思? >>你不发数据就不知道断开了.这也不符合要求. 从原理上讲,你连接上以后,不作任何操作,是不可能知道是否断开了!所以,不会有符合你的要求的方法。还有另一个折中的办法,利用另一个client不停的连接server,如果连不上了,就说明链路不通了(可能更不符合你的要求) 所以,这个问题应该首先从原理上分析有什么办法,再看用哪种更简单方便。 我告诉你的方法是最简的方法之一,不存在不符合要求的问题。你之所以有这样的要求,是因为你对TCP/IP的原理不清楚才提出来的。
H henrynj Unregistered / Unconfirmed GUEST, unregistred user! 2003-10-30 #8 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;
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;
F fengfan Unregistered / Unconfirmed GUEST, unregistred user! 2003-10-30 #9 to :ss2000, 第一个我们想法一样.难道只能这样解决吗?
S SS2000 Unregistered / Unconfirmed GUEST, unregistred user! 2003-10-30 #10 那你得先学学TCP/IP的原理。 其实编程语言是次要的,这点大部分人都不能正确认识。 编socket程序,关键是你要了解精通TCP/IP才能成为高手,而不管你用什么语言。 脱离TCP/IP原理去想办法是徒劳无功的,也是可笑的。 象楼上说的以下代码,就是不了解TCP/IP原理,想当然出来的办法。 >用TCPClient的Disconnect事件来做 >begin > TcpClient.active := false; > TcpClient.open; >end;
那你得先学学TCP/IP的原理。 其实编程语言是次要的,这点大部分人都不能正确认识。 编socket程序,关键是你要了解精通TCP/IP才能成为高手,而不管你用什么语言。 脱离TCP/IP原理去想办法是徒劳无功的,也是可笑的。 象楼上说的以下代码,就是不了解TCP/IP原理,想当然出来的办法。 >用TCPClient的Disconnect事件来做 >begin > TcpClient.active := false; > TcpClient.open; >end;
F fengfan Unregistered / Unconfirmed GUEST, unregistred user! 2003-10-31 #11 楼上的,我有时间当然要看原理了.现在是要解决这个问题.该怎么做啊.
S SS2000 Unregistered / Unconfirmed GUEST, unregistred user! 2003-10-31 #12 我已经给你办法了,你又嫌不好,不采用,那你就只有自己去看原理了,我还能怎么办?!
G ghb1974 Unregistered / Unconfirmed GUEST, unregistred user! 2003-10-31 #13 我的程序是两个线程,一收一发,当连接断是接收会有错误返回的,看一下错误号就知道是不是断了,发送也是一样的