python - 我用socket写了一个简单的python网站,但是没有输出或者错误?
问题描述
我正在观看有关 python 的视频,我想尝试代码,那是在我为 HTTP1.1 制作之后:
import socket
call = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
call.connect(('data.pr4e.org', 80))
req= 'GET /romeo.txt HTTP/1.1\r\nHost: http://data.pr4e.org'. encode() #(method, url, body=None, headers={})
call.send(req)
while True:
txt = call.recv(512)
if (len(txt) < 1) :
break
print (txt.decode())
call.close()
但是当我运行这段代码时,我没有得到任何输出
解决方案
这在多个层面上都是错误的:
- 主机头的值应该是主机,而不是 URL。
- 主机头没有行尾,。即失踪
\r\n
。 - HTTP 标头分隔符没有结尾,即另一个
\r\n
. - 读取响应假设服务器将立即关闭连接,即使使用了 HTTP/1.1,因此隐式 HTTP keep-alive 处于活动状态,即服务器可能在同一 TCP 连接中等待另一个请求。
HTTP 并不是看起来那么简单的协议。请在实施之前阅读实际标准,请参阅RFC 7230。
推荐阅读
- reactjs - 使用 React 路由器的 Azure 静态应用程序路由配置
- kubernetes - 如何在 AKS 的 K8S 集群中强制执行 MustRunAsNonRoot 策略
- c# - 如果我想每次都更改 Referer 标头,就不能使用 GetStringAsync() 吗?
- javascript - 使用 useContext 显示错误:未定义不是对象
- php - Laravel Livewire,如何将选项标签的值发送到wire:model =“ category”?
- python-3.8 - Mypy 和海象算子
- azure-sql-database - 如何在本地服务器上(自动)备份 azure sql 数据库?
- java - 编组/取消编组时 JAXB 翻译元素名称
- python-2.7 - urllib2 中的 CERTIFICATE_VERIFY_FAILED 但不是请求,在 Python 2.7.18
- springfox - 如何使用 Springfox 2.7.0、2.9.2 将多个值设置为 defaultValue