Python socket会超时吗?
我正在尝试用Python创建一个客户端和服务器的程序,我想知道一旦连接建立后,除非我主动关闭连接,否则连接会不会超时?
如果会的话,有没有办法保持连接一直打开?或者有没有什么标志可以让连接始终保持打开状态?
总的来说,我希望客户端能够连接并且一直保持连接,不会断开。
2 个回答
你可以通过TCP的KEEPALIVE选项来保持连接不断开。具体的操作可以参考这个(linux的指南)[http://www.tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/#overview]。至于Windows的情况,我不太清楚,里面的细节比较复杂,还是看官方文档比较好。值得注意的是,在Linux系统中,KEEPALIVE默认是关闭的,这也说明了它并不是特别受欢迎(也就是说,使用的人不多)。正如其他人提到的,优雅地处理断开连接,或者在你的协议中添加一个ping包,也是不错的选择。
根据文档内容:
socket.settimeout(value)
这个方法是用来设置阻塞式socket操作的超时时间。这里的value参数可以是一个非负的小数,表示秒数,或者是None。如果你给了一个小数,那么在这个时间内,如果socket操作还没完成,就会抛出一个超时异常。如果把超时时间设置为None,就表示不限制socket操作的时间。s.settimeout(0.0)相当于s.setblocking(0); s.settimeout(None)相当于s.setblocking(1)。
所以,如果你不调用settimeout方法,你的连接会一直保持打开状态,直到你或者对方关闭它。当然,如果中间的某个主机出现问题或者其他故障,连接可能会出问题。这样的话,你就需要监控你的连接,如果断开了就重新连接。