调用recv在调用句柄后挂起

2024-09-30 16:20:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

然后在单元测试中的其他代码中,我们尝试连接到假服务器:

^{pr2}$

服务器的实现方式如下:

class FakeImapServerHandler(SocketServer.BaseRequestHandler):

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

Tags: 数据self服务器trueserverrequestdef单元测试
1条回答
网友
1楼 · 发布于 2024-09-30 16:20:24

(这次作为答案发布)根据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

相关问题 更多 >