今天在學習python時,遇到了一個問題,這個問題比較簡單,但是網絡上的答案眾多,參差不齊,有說用try-expect重復調用函數的,還有設置response.close(),這都是覺得的答案,接下來我總結了一下我遇到的問題:
今天寫了一個用socket連接客戶端與服務端腳本的腳本,主要功能是客戶端給服務端發送命令,然後服務端執行,執行完後服務端給客戶端返回執行結果。但是給我報錯:
TimeoutError: [WinError 10060] 由於連接方在一段時間後沒有正確答復或連接的主機沒有反應,連接嘗試失敗。
查看了一下報錯的原因,說是請求超時了,需要添加一個超時參數timeout,在創建socket前設置:
import socket
socket.setdefaulttimeout(500)
設置完果然不報錯了,都是小問題啦。結果沒高興一會兒又給我報另一個錯了!!
繼續網上找解決方案,結果很多都是說這是爬蟲被服務器識別出來,服務端關閉了這個socket連接。但是這是我自己的服務器啊!我服務端的代碼並沒有關閉這個socket連接,為什麼還會報這個錯。
因為問題定位不清晰,網上搜了好久,終於找到了這篇博客:Python+socket完美實現TCP長連接保持存活
在網絡開發使用TCP協議實現客戶端和服務端通信時,某些場合需要保持長連接,在默認情況下,超過一定時間沒有數據收發操作時,連接會自動斷開,從而導致數據丟失。
客戶端在創建socket之後,設置心跳:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, True)
sock.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 60 * 1000, 30 * 1000))