socket 怎么知道是否已经四次挥手了
对应 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发送数据的时候网络依然正常。正确的做法是捕捉异常并编写相关代码。
回答:
参考连接池的普遍做法,通过定时任务发送某个命令如select 1,异步的检查连接是否可用,在保证性能的基础上尽可能保证连接可用。如果运气不好还是碰上了不可用的连接,就重连或者换其他已经建立的连接
以上是 socket 怎么知道是否已经四次挥手了 的全部内容, 来源链接: utcz.com/p/938274.html