Python 为什么我的web服务器有时只传输部分响应?
我有一段定制的web服务器代码。它是用 当从远程客户端请求时,它似乎缩短了消息的长度。但当我在同一台机器上使用它时,它似乎传递了完整的信息。我不知道问题是什么,也不知道如何诊断。我使用web浏览器、Python 为什么我的web服务器有时只传输部分响应?,python,linux,network-programming,webserver,Python,Linux,Network Programming,Webserver,我有一段定制的web服务器代码。它是用 当从远程客户端请求时,它似乎缩短了消息的长度。但当我在同一台机器上使用它时,它似乎传递了完整的信息。我不知道问题是什么,也不知道如何诊断。我使用web浏览器、curl和nc对其进行了测试。当从远程客户端请求时,它从未传递完整长度的消息 我的Web服务器的简化版本仍然存在这个问题。我在Ubuntu11.04上使用Python 2.7.1执行此操作,调用send()发送大量数据后,您将立即关闭套接字。如果仍有数据被缓冲,那么当您关闭套接字时,数据将被丢弃 相反
curl
和nc
对其进行了测试。当从远程客户端请求时,它从未传递完整长度的消息
我的Web服务器的简化版本仍然存在这个问题。我在Ubuntu11.04上使用Python 2.7.1执行此操作,调用
send()
发送大量数据后,您将立即关闭套接字。如果仍有数据被缓冲,那么当您关闭套接字时,数据将被丢弃
相反,您应该调用套接字来告诉远程端您已完成发送。这称为TCP“半关闭”。作为响应,另一端将关闭其一侧,您将收到套接字不再可读的通知。然后,也只有在那时,您才应该关闭套接字句柄。OOPS!我更正了我的问题,它实际上是我的Web服务器的代码。我没有任何自定义客户端。我没有看到任何在线evnet文档,但如果它只是底层套接字上的一层,这可能就是它没有发送全部内容的原因。您需要测试
send
的结果,看看它发送了多少,然后继续发送剩余的。而在接口127.0.0.1
上,它可能会发送整个内容。@Greg@wberrysend()
不是来自套接字,而是一个自定义函数,它反过来调用evnet模块的方法。看起来它确实会检查以确保在关闭之前发送所有数据,但我不确定。