Python:在x秒内没有服务器消息后关闭与服务器的TCP客户端连接

Python:在x秒内没有服务器消息后关闭与服务器的TCP客户端连接,python,python-multithreading,tcpclient,Python,Python Multithreading,Tcpclient,我正在尝试创建Python TCP客户端。它功能齐全,但我希望有一个功能,如果x秒内没有从服务器收到“已连接”消息,那么我可以关闭连接。我目前有一个单独的线程来接收来自服务器的消息。基本上,如果我收到一条写着“已连接”的消息,我想重置一个计时器 我尝试了几种不同的方法来解决这个问题。我试着用一个单独的线程和一个计时器来跟踪何时使用全局变量断开连接,这是一个混乱的解决方案,无论如何都不起作用。我试图创建自己的线程子类,但仍然无法解决这个问题,它引入了比我真正需要的复杂得多的复杂性 我采取的一种简单

我正在尝试创建Python TCP客户端。它功能齐全,但我希望有一个功能,如果x秒内没有从服务器收到“已连接”消息,那么我可以关闭连接。我目前有一个单独的线程来接收来自服务器的消息。基本上,如果我收到一条写着“已连接”的消息,我想重置一个计时器

我尝试了几种不同的方法来解决这个问题。我试着用一个单独的线程和一个计时器来跟踪何时使用全局变量断开连接,这是一个混乱的解决方案,无论如何都不起作用。我试图创建自己的线程子类,但仍然无法解决这个问题,它引入了比我真正需要的复杂得多的复杂性

我采取的一种简单方法是在receive函数的while循环中尝试使用计时器。这适用于断开与服务器的连接,但它仅在发送消息时超时(由于try块),而不是在计时器启动时超时

导入线程、时间、系统
def main():
主机=sys.argv[1]
端口=sys.argv[2]
sock=socket.socket(socket.AF\u INET,socket.sock\u流)
地址=(主机、端口)
sock.connect(地址)
rec_thread=threading.thread(target=rec,args=(sock,))
rec_thread.setDaemon(True)
rec_thread.start()
尽管如此:
消息=输入()
sock.sendall(str.encode(消息))
def rec(sock):
开始时间=time.time()
尽管如此:
已用时间=time.time()-开始时间
如果(经过的时间>10):
sock.close()
尝试:
msg=sock.recv(1024).解码(“utf8”)
如果msg==“已连接”:
开始时间=time.time()
其他:
打印(msg)
除键盘中断外:
sock.close()
打破
如果我使用这种方法,那么我只会在收到来自服务器的消息后关闭连接


例如:我希望它在10秒后立即断开连接,但是如果我在14秒之前没有从服务器收到任何消息,那么它在14秒之前不会断开连接。

这只是一个简单的超时的例子。我无法根据收到的“连接”消息重置它。如果我做了socket.settimeout(value),我必须将它与我的运行时间进行比较,我的代码在功能上是相同的。