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