如何停止python socket.accept()调用?

时间:2012-04-10 13:59:26

标签: python sockets

我是python套接字的新手,我对socket.accept()方法的固执感到非常困扰。我真的需要一种方法来结束socket.accept()方法或socket.accept()的任何其他替代方法,它只运行一次。 Plzzzz有人帮忙。

2 个答案:

答案 0 :(得分:13)

这里有几个选项:

  1. 从另一个线程关闭侦听套接字 - accept()如果失败则会引发异常。
  2. 打开与侦听套接字的本地连接 - 使accept()按设计返回。
  3. 使用可以阻止多个同步对象的接受机制,以便可以发出等待信号,以便在没有连接的情况下返回。
  4. 使用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,并且必须进行适当处理。但是,如果您对客户有严格的控制,那就足够了。