我有一个简单的TCP示例:
import socket
import time
TCP_IP = '127.0.0.1'
TCP_PORT = 81
BUFFER_SIZE = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
while True:
s.send(bytes('hello', 'UTF-8'))
time.sleep(1)
s.close()
我如何检测到与服务器的连接已经中断,以及如何安全地重新连接?
是否有必要等待服务器的回复?
更新:
import socket
import time
TCP_IP = '127.0.0.1'
TCP_PORT = 81
BUFFER_SIZE = 1024
def reconnect():
toBreak = False
while True:
s.close()
try:
s.connect((TCP_IP, TCP_PORT))
toBreak = True
except:
print ("except")
if toBreak:
break
time.sleep(1)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
while True:
try:
s.send(bytes('hello', 'UTF-8'))
print ("sent hello")
except socket.error as e:
reconnect()
time.sleep(1)
s.close()
如果我中断连接,会出现一个错误(不太重要),然后重新连接。但是在恢复连接后,连接会返回以下错误:OSError: [WinError 10038] 尝试对非套接字进行操作
如果我重新启动调用相同的 s.connect((TCP_IP, TCP_PORT)) 的脚本,它可以正常工作。
as
和,
都是将异常对象存储到目标变量的相同语法。如果您看到的是ECONNABORTED
而不是ECONNRESET
,那么也要测试该值并适当处理它。一旦套接字达到错误状态,就无法重用该套接字。您必须关闭套接字并打开一个新的套接字。 - Adam Rosenfieldexcept ConnectionResetError:
。 - Generic Ratzlaugh