如果调用方法,为什么socket.timeout挂起?

时间:2019-11-03 23:06:57

标签: python python-3.x

我在下面有一台非常简单的服务器(或者无论如何都是一台服务器的开始),如果您向它发出请求,它将接收数据,并返回一条消息,说“这是一个响应”,等待5秒钟,然后在超时时关闭连接,并发送一条消息告知您。

如果我运行下面的类,然后再运行curl,它将按预期运行:

  • “这是回应”显示
  • 5秒过去
  • 我收到一条消息,说“正在关闭连接”
  • 连接关闭

但是,我想使用函数或方法创建响应。这就是要注意的问题:如果我先叫build_response(),然后再叫curl,则发生的事情是:

  • 客户端挂起5秒钟
  • 5秒钟后,我得到了响应字符串,然后是“正在关闭的连接”字符串,然后同时关闭了连接。

更奇怪的是,如果我调用此build_response()方法,但不将结果分配给响应,它将正常工作。我唯一遇到的问题是是否尝试通过.sendall()返回方法的结果。那到底是怎么回事? Python中的方法是否与socket共享缓冲区?还是我缺少明显的东西?我也在类之外使用函数进行了尝试,并得到了相似的结果。

import socket

class Server (object):

    def run(self, host = None, port = None):

        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind((host,port))
        s.listen(1)

        while True:
            conn, addr = s.accept()
            conn.settimeout(5.0)
            keep_alive = True
            while keep_alive:
                try:
                    data = conn.recv(1024)
                    if not data:
                        continue

                    response = b'here is a response\n'
                    #response = self.build_response()
                    conn.sendall(response)

                except socket.timeout:
                    conn.sendall(b"closing connection\n")
                    conn.close()
                    keep_alive = False


    def build_response(self):
        return b'here is a better response\n'

0 个答案:

没有答案