TCP请求超时后如何处理的问题
对于一个TCP长连接来说, 只要连接没有断开,正确的命令是一定可以收到Server的回复的。
但是网络状况不佳的情况下,不可能永远等待server的回复,通常会设置一个超时时间,一旦超过一定时间,就会认为失败。对于短连接来说,只要简单的断开连接就可以了,但是长连接的话,一般处理方式就是无视server返回的结果,如果server在超时时间后返回结果,直接丢弃。如果是一个读取数据的操作,这样做没有任何问题。
现在问题是,如果我有一个写操作命令发送给Server了,但是超过时间没有响应,应该怎么处理?比如说更改用户密码的命令,长连接是不能断开连接的,这时该怎么处理?(就算是短连接,是否也存在超时返回失败,但是实际密码已经更改成功的情况?)
个人想到的有:(1)若Server处理完密码更改任务完成后,还没发response,连接就因为网络异常断开了,似乎是无解,这个可以暂不考虑。所以以下都是不考虑网络中途异常断开的情况。
(2)超时后,发送cancel指令给server,取消密码更改命令,不过这会大大增加Server程序的复杂度,至少需要缓存之前的旧密码,cancel指令什么时候能达到server也是个问题,server上总不能无期限的保存这个旧密码吧。
(3)写操作不做超时机制,改成异步,一直等到结果返回为止,并且在结果返回前不允许再发送这个写操作命令。不过体验比较差,相当于一段时间内禁用了某功能。