POST HTTP 请求收到后出现“资源暂时不可用” - Python
我在使用服务器套接字时遇到了一些问题。我正在制作一个网页服务器,想要从浏览器中填写一个表单。这个表单的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
,而你的平台把 EAGAIN
和 EWOULDBLOCK
的错误号设成了一样。
如果是这样,简单的解决办法是:不要在阻塞服务器中使用非阻塞套接字。要么确保套接字是阻塞模式,要么在你确定有数据的情况下才调用 recv
(比如,因为 select
刚告诉你有数据)。
你 可以 在阻塞服务器中处理非阻塞套接字,通过 try
调用 recv
并以某种方式处理 EWOULDBLOCK
(例如,针对那个套接字使用 select
再试一次,或者发送一个心跳包/空闲包来确认对方还在,或者根据你的设计选择合适的方法)。但通常来说,这不是你想要的做法;你可以用 settimeout
做一些更简单的事情。