在 Python3 中使用 Socket 库时找不到 404 错误
Posted
技术标签:
【中文标题】在 Python3 中使用 Socket 库时找不到 404 错误【英文标题】:404 Not found Error while using Socket library in Python3 【发布时间】:2021-12-16 16:44:55 【问题描述】:我试图在 Python 3.8 中运行以下示例代码:
import socket
mysock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com',80))
# since I need to send bytes and not a str. I add a 'b' literal also tried with encode()
mysock.send(b'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')
while True:
data = mysock.recv(512)
if (len(data)) < 1:
break
print(data)
mysock.close()
但这是抛出 404 Not found 错误
b'HTTP/1.1 404 Not Found\r\nServer: nginx\r\nDate: Tue, 02 Nov 2021 04:38:35 GMT\r\nContent-Type: text/html\r\nContent-Length: 146\r\nConnection: close\r\n\r\n<html>\r\n<head><title>404 Not Found</title></head>\r\n<body>\r\n<center><h1>404 Not Found</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n'
我用 urllib 试过了,效果很好
import urllib.request
output= urllib.request.urlopen('http://www.py4inf.com/code/romeo.txt')
for line in output:
print(line.strip())
有人知道如何解决这个问题吗?帮我弄清楚我在第一个块代码中哪里出错了.. 提前致谢!
【问题讨论】:
【参考方案1】:mysock.send(b'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')
这不是一个有效的 HTTP 请求有几个原因:
它应该包含绝对路径,而不是绝对 URL 它应该包含一个主机头。尽管这对于 HTTP/1.0(但对于 HTTP/1.1)并不是严格要求的,但通常无论如何都是预期的 行尾必须是\r\n
而不是\n
以下作品:
mysock.send(b'GET /code/romeo.txt HTTP/1.0\r\nHost: www.py4inf.com\r\n\r\n')
总的来说:虽然 HTTP 可能看起来很简单,但实际上并非如此。不要仅仅通过查看一点流量来假设事情是如何运作的,而是要遵循实际的标准。即使它最初似乎适用于特定服务器,但它可能会在以后中断。
【讨论】:
以上是关于在 Python3 中使用 Socket 库时找不到 404 错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 route-me 库时找不到 FMDatabase.h