You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:33:34