Python Socket编程实现HTTP HEAD获取Web响应的代码问题咨询
问题解答
- 关于代码逻辑是否正确
你的代码逻辑和预期功能存在多处不匹配的问题:
- 计时逻辑错误:你将
send_time定义在等待浏览器访问的代码之前,最终统计的耗时包含了用户打开浏览器访问localhost的等待时长,并非你向目标服务器发送请求到接收响应的耗时。 - 响应头构造错误:你硬编码返回了
HTTP/1.1 200 OK\r\n\r\n响应头,缺少Content-Length、Content-Type等必要字段,大概率会导致浏览器无法正常渲染返回的页面内容。 - 缺少输入校验:如果输入的URL没有携带http/https前缀,
requests.get会直接抛出异常。 - 功能不匹配:你的需求是使用HTTP HEAD方法获取响应、计算耗时,现有代码完全没有对应这部分需求逻辑。
关于是否正确使用HTTP HEAD方法
你完全没有使用HTTP HEAD方法:代码中调用的是requests.get(),属于HTTP GET方法,会拉取完整的响应体;且整个逻辑中既没有判断浏览器发来的请求类型,也没有向目标服务器发送HEAD请求,和HEAD方法完全无关。关于终端仅打印请求不打印响应的原因
你的代码中没有任何打印目标服务器响应的逻辑,拉取到目标站点的HTML内容后直接编码返回给了浏览器,没有做打印操作,终端自然不会输出响应内容。
修正参考代码
如果你要实现「向目标站发送HEAD请求统计耗时,同时本地代理返回页面内容给浏览器」的需求,可以参考如下修改:
from socket import * import time import requests target_url = input("Enter a URL: ") # 自动补全HTTP前缀避免请求报错 if not target_url.startswith(('http://', 'https://')): target_url = 'http://' + target_url local_port = int(input("Enter a port number: ")) serverSocket = socket(AF_INET, SOCK_STREAM) serverSocket.bind(('', local_port)) serverSocket.listen(1) print("The server is ready\n") connectionSocket, addr = serverSocket.accept() req_mes = connectionSocket.recv(1024).decode() print("客户端地址:", addr) print("客户端请求消息:\n", req_mes) # 发送HEAD请求并统计耗时 send_time = time.time() head_resp = requests.head(target_url, allow_redirects=True) receive_time = time.time() # 打印HEAD响应到终端 print("目标服务器HEAD响应头:\n", dict(head_resp.headers)) print('HEAD请求耗时:', receive_time - send_time) # 拉取完整页面返回给浏览器 get_resp = requests.get(target_url) # 构造合法HTTP响应头 response_header = f'HTTP/1.1 {get_resp.status_code} OK\r\nContent-Type: {get_resp.headers.get("Content-Type", "text/html")}\r\nContent-Length: {len(get_resp.content)}\r\n\r\n' connectionSocket.send(response_header.encode('UTF-8')) connectionSocket.send(get_resp.content) connectionSocket.close() serverSocket.close()
内容的提问来源于stack exchange,提问作者Mr Trapper
相关产品推荐
相关产品推荐

