程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【Python】ConnectionResetError [WinError 10054] 遠程主機強迫關閉了一個現有的連接

編輯:Python

【Python】ConnectionResetError: [WinError 10054] 遠程主機強迫關閉了一個現有的連接

今天在學習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))

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved