调用句柄后调用recv会挂起

时间:2011-03-23 22:11:38

标签: python sockets imap

我有一个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

1 个答案:

答案 0 :(得分:2)

(这次作为答案发布)根据IMAP协议,服务器首先说话,向客户端发送OK问候语。您的服务器和客户端似乎都在尝试同时recv():

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