Python 调用句柄后,调用recv挂起

Python 调用句柄后,调用recv挂起,python,sockets,imap,Python,Sockets,Imap,我有一个Python类,用于模拟IMAP服务器进行单元测试。当handle()回调发生时,我尝试使用recv()获取刚到达的数据,但我正在阻止recv()调用。我原以为recv()会返回接收到的数据,但它只是放在那里 在这种情况下,我可以看到服务器和主线程在日志输出中是不同的 我假设这与套接字刚刚打开但没有数据通过它发送有关。在尝试调用recv()之前,是否需要检查是否存在这种情况 我使用以下方法创建了服务器: class ThreadedTCPServer(SocketServer.Threa

我有一个Python类,用于模拟IMAP服务器进行单元测试。当
handle()
回调发生时,我尝试使用
recv()
获取刚到达的数据,但我正在阻止
recv()
调用。我原以为
recv()
会返回接收到的数据,但它只是放在那里

在这种情况下,我可以看到服务器和主线程在日志输出中是不同的

我假设这与套接字刚刚打开但没有数据通过它发送有关。在尝试调用
recv()
之前,是否需要检查是否存在这种情况

我使用以下方法创建了服务器:

class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    pass
...
# inside another class, we've got:
def startUp(self):
    server = ThreadedTCPServer(('localhost', 5593), FakeImapServerHandler)
    server.allow_reuse_address = True
    server_thread = threading.Thread(target=server.serve_forever)
    server_thread.setDaemon(True)
    server_thread.start()
然后在单元测试的其他代码中,我们尝试连接到假服务器:

    print("about to connect")
    self.__imapCon = imaplib.IMAP4("localhost", 5593)
    print("about to login") # we never get here
    self.__imapCon.login(Config.config["imapUser"], Config.config["imapPassw"])
服务器的实现方式如下:

class FakeImapServerHandler(SocketServer.BaseRequestHandler):

    def handle(self):
        print("handling request")
        incoming = self.request.recv(1024)
        print("request was: " + incoming ) # never get here

(这次作为回答发布)根据IMAP协议,服务器首先发言,向客户端发送OK问候语。您的服务器和客户端似乎都在试图同时从对方接收()

atlas% telnet chaos 143
Trying 192.168.1.5...
Connected to chaos
Escape character is '^]'.
* OK chaos Cyrus IMAP4 v2.2.13-Debian-2.2.13-19 server ready

您对
imaplib.IMAP4()
的调用是否超时或引发异常?根据IMAP协议,服务器首先发言,向客户端发送OK问候语。您的服务器和客户端似乎都在试图同时从对方接收()。IMAPClient()的单元测试有用吗?@samplebias,您是对的。我需要让handle方法发送一条服务器就绪消息:“*OK IMAP3 server ready”。您应该在下面发布答案,而不是评论。@Acorn,我们有一个可以运行的客户端库,只需要伪造服务器端来测试其他代码(而不是客户端本身)。