我有一个等待连接的主线程。它生成客户端线程,这些线程将回显来自客户端的响应(在本例中为 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()