POST HTTP 请求收到后出现“资源暂时不可用” - Python

0 投票
1 回答
3528 浏览
提问于 2025-04-17 15:10

我在使用服务器套接字时遇到了一些问题。我正在制作一个网页服务器,想要从浏览器中填写一个表单。这个表单的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请求。当我在我的网页服务器上接收到这个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

有没有人知道发生了什么事?

1 个回答

0

这可能不完全正确,但根据你提供的信息,情况大概是这样的:

你写了一个阻塞服务器——可能每个客户端连接都在自己的线程里(也可能用进程或者绿色线程,或者干脆一次只处理一个客户端)。但是你使用的是非阻塞套接字。

具体情况要看你的代码和平台,但最常见的原因是你在一个没有数据的非阻塞套接字上调用了 recv,结果返回了 EWOULDBLOCK,而你的平台把 EAGAINEWOULDBLOCK 的错误号设成了一样。

如果是这样,简单的解决办法是:不要在阻塞服务器中使用非阻塞套接字。要么确保套接字是阻塞模式,要么在你确定有数据的情况下才调用 recv(比如,因为 select 刚告诉你有数据)。

可以 在阻塞服务器中处理非阻塞套接字,通过 try 调用 recv 并以某种方式处理 EWOULDBLOCK(例如,针对那个套接字使用 select 再试一次,或者发送一个心跳包/空闲包来确认对方还在,或者根据你的设计选择合适的方法)。但通常来说,这不是你想要的做法;你可以用 settimeout 做一些更简单的事情。

撰写回答