我是python套接字的新手,我对socket.accept()方法的固执感到非常困扰。我真的需要一种方法来结束socket.accept()方法或socket.accept()的任何其他替代方法,它只运行一次。 Plzzzz有人帮忙。
答案 0 :(得分:13)
这里有几个选项:
accept()
如果失败则会引发异常。accept()
按设计返回。accept()
的非阻止替代方法,(像AcceptEx()
这样的异步和Windows上的重叠IO)。答案 1 :(得分:0)
详细说明上一个答案。
例如,如果您创建了一个简单的套接字服务器线程,如下所示:
class SocketServerThread(threading.Thread):
# Required by threading.Thread
def __init__(self, socket_name):
threading.Thread.__init__(self)
# Simple Unix socket.
# Could be a TCP socket instead.
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
self.sock.bind(socket_name)
self.sock.listen(1)
self.sock_conn = None
# Required by threading.Thread
def run(self):
self.sock_conn, _ = self.sock.accept()
# Read just one message, then stop.
with self.sock_conn:
recv_data = self.sock_conn.recv(4096)
print('Received message of size '+ str(len(recv_data)))
然后碰巧没有客户端,但是线程继续运行,因为sock.accept
阻塞了,您可以在上面的类SocketServerThread
中添加以下方法来阻止线程阻塞:< / p>
def stop_accept(self):
# Skip if sock.accept has executed.
if self.sock_conn is None:
# Connect to ourselves as a fake client.
with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
s.connect(self.socket_name)
然后您可以按以下方式使用线程:
sock_thread = SocketServerThread('/tmp/my_socket_name')
sock_thread.start()
time.sleep(5)
# Decided that we don't want to
# wait for clients anymore.
sock_thread.stop_accept()
sock_thread.join()
请注意,该代码假定一旦您决定不接受客户端,客户端将无法再连接。如果其他客户端确实在if self.sock_conn is None
之间建立了连接
和with socket.socket
行,您将获得Connection refused
,并且必须进行适当处理。但是,如果您对客户有严格的控制,那就足够了。