前些时间给朋友做了个软件,客户端和服务端都用的是TCP协议。  
但用一段时间后发现因为网络问题客户端和服务端的连接断开,但是这样的断开服务端是无法产生断开事件。这样客户端在次登陆时会出现两个IP地址完全一样的记录,并且服务端在反回数据时就会死掉。  
在服务端加上根据最后一次数据包发送时间的验证超时后用"AThread.Connection.Disconnect"断开网络有问题的客户端会出现"Terminate  Out  Time"错误,请问那位高手这个问题要如何处理?谢谢了!!!

解决方案 »

  1.   

    这个问题我碰到过,我的办法是。
    建立一个查询线程(不推荐在主线程里面写,有效率问题。)
    定期监测死掉的客户端线程,(可以通过一个线程最后一个收包的时间来判断是否超时),
    但这样还要有一个情况要处理到。如果一个线程只建立过连接,就死掉了,并没有传输过数据。
    除此方法外,我没有想到其它更好的方法。
    ***注***
    死掉的客户端线程,有的组件是可以自己回收的,我不知道楼主用的是什么方法,
    如果都是自己写的,那么只能由程序来处理释放,如果组件已经把线程自动给释放掉了,
    那么你再去调用,Connection.Disconnect,应该会报异常吧,而不是错误。
    另外,这种长时间无人监管的程序的,一定要把异常情况都考虑到,多用 Try..Catch 和 Try..Finally,否则,很容易死掉。我用的是 Indy 10 系列组件很好用。