对应 server-client
的结构,server
往往会在 client
长时间不发消息后主动关闭连接,比如 Mysql 的 wait_timeout
、interactive_timeout
等等参数。
除了 Mysql
还有 RabbitMQ、redis、memcached 等等 server 程序都会这么做。
那请问我在编写客户端的业务代码(!!!)的时候,怎么保证连接可用呢?
- 方案一: 随便发一个东西,比如 Mysql 的
select version()
;redis 的ping
- 方案二:不管,直接用,直到抛出
Timeout
错误异常
我感觉两个方案都不好。
第一个方案,每个 curd
操作都要提前执行 Mysql 的 select version() ;redis 的 ping 等操作,这很浪费时间
方案二的话,捕捉异常和重试的代码会让一切看起来很糟糕,有代码洁癖不能忍
我觉得更加合理的方式是直接判断 client_socket_connection.is_close()
,这个操作应该是直接问本地的操作系统:这个 socket
是不是被四次挥手了呀???
但是我发现 Python
貌似没有提供这个功能(即:直接问本地的操作系统:这个 socket
是不是被四次挥手了呀???)
参考:socket --- 底层网络接口
不知道其他语言有没有?
只考虑四次挥手的情况,不考虑网线被人剪短等网络不可达的情况
你不需要保证连接可用,也无法保证连接可用。就算有
is_close()
可以供你调用,也只是保证了当前这一刻socket是活的,它不能保证下一刻你使用该socket发送数据的时候网络依然正常。正确的做法是捕捉异常并编写相关代码。