在 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

在 Qt 中制作 Oci 驱动程序时找不到头文件

IAR 编译时找不到头文件的解决方法

git-upload-pack:克隆远程 Git 存储库时找不到命令

安装 CuSpatial 或 CuDf 库时找不到包错误

调用服务器时找不到socket.io