使用 socket.send 和 Python 发送 HTTP 1.1 GET 请求

4

我正在尝试通过Python3中的sockets.send函数发送Get请求到谷歌服务器,请求如下:

GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n

以下是发送代码:

import socket
buffer = input()     #filled the with 'GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n'
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
target = "www.google.com"
port = 80
client.connect((target,port))    
client.send(buffer.encode()) 
while True:
    recv_len = 1
    response = ""
    while recv_len:
        data        = client.recv(4096).decode(errors="ignore")
        recv_len    = len(data)
        response    += data
        if recv_len < 4096:
            break
    print(response)

但是我没有从服务器收到任何数据。有人能帮我解决这个问题吗?我尝试了类似的问题,但大多数集中在请求中使用 \n


“但是我没有从服务器那里收到任何数据。” - 使用您的代码,我会收到数据,即print语句实际上会打印数据。不清楚您在做什么不同的事情。我建议您展示出您遇到问题的完整代码,而不仅仅是您认为相关的部分。请参阅如何创建最小可重现示例 - Steffen Ullrich
我已经编辑了我的代码,请检查。 - Roshin Raphel
我看到你使用 input 来获取字符串。我知道在字符串中没有简单的方法输入 \r(回车)或者 \n(换行)。如果你在输入提示符中键入 \r\n,你将会得到四个字符反斜杠、r、反斜杠、n(作为 Python 字符串的 '\\r\\n'),而不是两个字符 '\r\n'(或者 '\x0d\x0a')。 - Serge Ballesta
感谢您指出问题。 - Roshin Raphel
1个回答

0

问题出在这一行

buffer = input()

正如Serge Ballesta所提到的,input()函数将\r读取为两个字符,即"\""r"。使用
buffer = sys.stdin.read()

将GET请求导向程序文件即可解决该问题。

echo -ne "GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n" |python3 temp.py

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接