gpt4 book ai didi

python - 如何从 Python 中的另一个线程中止 socket.recv()

转载 作者:太空狗 更新时间:2023-10-29 17:13:31 25 4
gpt4 key购买 nike

我有一个等待连接的主线程。它生成客户端线程,这些线程将回应来自客户端(在本例中为 telnet)的响应。但是说我想在一段时间后关闭所有套接字和所有线程,比如在 1 个连接之后。

我该怎么做?如果我从主线程执行 clientSocket.close(),它不会停止执行 recv。只有当我首先通过 telnet 发送内容时它才会停止,然后它会在进一步发送和接收时失败。

我的代码是这样的:

# Echo server program
import socket
from threading import Thread
import time

class ClientThread(Thread):
def __init__(self, clientSocket):
Thread.__init__(self)
self.clientSocket = clientSocket

def run(self):
while 1:
try:
# It will hang here, even if I do close on the socket
data = self.clientSocket.recv(1024)
print "Got data: ", data
self.clientSocket.send(data)
except:
break

self.clientSocket.close()

HOST = ''
PORT = 6000
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serverSocket.bind((HOST, PORT))
serverSocket.listen(1)

clientSocket, addr = serverSocket.accept()
print 'Got a new connection from: ', addr
clientThread = ClientThread(clientSocket)
clientThread.start()

time.sleep(1)

# This won't make the recv in the clientThread to stop immediately,
# nor will it generate an exception
clientSocket.close()

最佳答案

我知道这是一个旧线程,Samuel 可能很久以前就解决了他的问题。但是,我遇到了同样的问题,在谷歌搜索时遇到了这篇文章。找到解决方案,觉得值得补充。

您可以在套接字类上使用关闭方法。它可以阻止进一步的发送、接收或两者。

socket.shutdown(socket.SHUT_WR)

例如,以上内容阻止了 future 的发送。

See Python docs for more info.

关于python - 如何从 Python 中的另一个线程中止 socket.recv(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2915160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com