Python客户端Socket无法接收服务器成功响应数据问题
问题原因与修复方案
核心问题
你的代码中HTTP请求格式不符合协议规范,导致服务器无法识别请求已完成,因此不会返回响应:
- HTTP 1.1协议要求请求头的每个字段必须用
\r\n分隔,且最后一个字段后必须跟\r\n\r\n(即一个空行)来标识请求结束。 - 你当前用
\n分隔字段,且没有添加结束标记,服务器会一直等待你发送剩余请求内容,自然不会返回响应。 - 错误请求能收到响应,是因为服务器识别到无效格式后,会直接返回错误响应,无需等待完整请求。
修复后的代码
import socket import ssl HOST, PORT = 'example.com', 443 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ssock = ssl.wrap_socket(sock) ssock.connect((HOST, PORT)) # 修正请求格式:用\r\n分隔字段,末尾加空行标识请求结束 raw_req = [ f'GET / HTTP/1.1', f'Host: {HOST}', 'Connection: keep-alive', '' # 空行,join后自动生成最后的\r\n ] req = '\r\n'.join(raw_req) ssock.send(req.encode()) msg = ssock.recv(4096).decode() print(msg) ssock.close()
额外优化建议
ssl.wrap_socket已被标记为过时,推荐使用更安全的ssl.create_default_context():
import socket import ssl HOST, PORT = 'example.com', 443 context = ssl.create_default_context() with socket.create_connection((HOST, PORT)) as sock: with context.wrap_socket(sock, server_hostname=HOST) as ssock: raw_req = [ f'GET / HTTP/1.1', f'Host: {HOST}', 'Connection: close', '' ] req = '\r\n'.join(raw_req) ssock.send(req.encode()) msg = ssock.recv(4096).decode() print(msg)
- 日常开发中建议直接使用
requests等成熟HTTP客户端库,避免手动拼接请求的格式问题。
内容的提问来源于stack exchange,提问作者Adenshe
相关产品推荐
相关产品推荐

