【问题标题】:'Resource Temporarily Unavailable' after POST http request is received - Python收到 POST http 请求后的“资源暂时不可用”-Python
【发布时间】:2013-02-07 22:18:03
【问题描述】:

我的服务器套接字有问题。我正在制作一个网络服务器并试图从浏览器中填充一个。表单HTML脚本如图:

<html>
<body bgcolor = black text= white>
<FORM method="post" action="/processData.py">
<P>
<LABEL for="firstname">First name: </LABEL>
<INPUT type="text" id="firstname"><BR>

<LABEL for="lastname">Last name: </LABEL>
<INPUT type="text" id="lastname"><BR>

<LABEL for="email">email: </LABEL>
<INPUT type="text" id="email"><BR>

<INPUT type="radio" name="sex" value="Male"> Male<BR>
<INPUT type="radio" name="sex" value="Female"> Female<BR>

<INPUT type="submit" value="Send"> <INPUT type="reset">
</P>
</FORM>
</body>
</html>

当点击“提交”后从浏览器发送 POST 请求时,我试图在终端上打印整个请求。当我在我的 Web 服务器上收到 POST 请求时,套接字会抛出“[Errno 35] 资源暂时不可用”。我没有关闭连接或任何东西,但不知何故我失去了连接。这是我在 python 中用来获取 POST 的代码。

while not recvIsComplete:
    rcvdStr = fd.recv( 1024 )
    if rcvdStr[0:3] == "GET":
        toGET()

    elif rcvdStr[0:4] == "POST":       
        print rcvdStr

知道发生了什么吗?

【问题讨论】:

  • 我们需要更多地了解您究竟是如何“制作 Web 服务器”的。但通常,当您尝试从非阻塞套接字读取但没有数据可读取时,您会得到 errno 35 (EAGAIN)。 (这有点令人困惑,因为在大多数 POSIX 平台上,EWOULDBLOCK: Operation would blockEAGAIN: Resource temporarily available 的 errno 相同。)
  • 另外,我可以猜到错误是在rcvdStr = fd.recv( 1024 ) 行上提出的,以及回溯说的内容……但很高兴向我们展示,这样我们就不必猜测了。
  • 另外,您可能需要检查EAGAINEWOULDBLOCK 是否是您平台上的一些。 (如果您使用的是 Windows,请不要试图回答这个问题,只需说“我使用的是 Windows”。)
  • 是的,recv(...) 上发生了错误。抱歉,我之前忘记提了。有什么可能的解决方案?

标签: python forms http-post


【解决方案1】:

这可能不正确,但根据您提供的信息,这很可能是:

您已经编写了一个阻塞服务器——可能每个客户端连接都在其自己的线程中(但可能使用进程或 greenlet,或者甚至一次只处理一个客户端)。但是您使用的是非阻塞套接字。

详细信息取决于您的确切代码和平台,但最常见的原因是您在没有数据的非阻塞套接字上调用了recv,它返回了EWOULDBLOCK,以及您的平台EAGAINEWOULDBLOCK 的错误号相同。

如果是这样,简单的答案是:不要将非阻塞套接字与阻塞服务器一起使用。要么确保套接字处于阻塞模式,要么不要在它们上调用 recv,除非你知道有数据(例如,因为 select 刚刚告诉你)。

可以通过trying recv 并以某种方式处理EWOULDBLOCK 来处理阻塞服务器中的非阻塞套接字(例如,仅在该套接字上处理select 和再试一次,或者发送一个心跳/空闲数据包以确保另一端仍然存在,或者任何适合您的设计)。但通常,这不是你想要做的。你可以用settimeout做一些更简单的事情。

【讨论】:

    猜你喜欢
    • 2021-12-30
    • 2014-04-27
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2015-02-20
    • 1970-01-01
    相关资源
    最近更新 更多