繁体   English   中英

Python客户端套接字无法从成功响应中接收数据

[英]Python client socket can't recieve data from a successful response

当响应成功时,Socket 无法从服务器接收任何数据,但对于错误的请求,它可以。 服务器也响应,只是套接字无法接收数据(在 WireShark 中检查)

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))

raw_req = [f'GET / HTTP/1.1', 'Host: {HOST}', 'Connection: keep-alive']
req = '\n'.join(raw_req)

ssock.send(req.encode())

msg = ssock.recv(4096).decode()
print(msg)

ssock.close()

首先, HTTP GET期望在最后一个标头之后有两个 CR LF 字符序列,而不仅仅是一个 '\n' 字符。 此外,join() 在每对之间添加分隔符,但不是在末尾,因此必须使用 CR LF + CR LF 附加数据才能成为有效的 HTTP 请求。

其次, 'Host: {HOST}'必须是 f 字符串,否则不会替换 "{HOST}"。

import socket
import ssl

HOST, PORT = 'stackoverflow.com', 443

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
    ssock = ssl.wrap_socket(sock)
    ssock.connect((HOST, PORT))

    raw_req = [f'GET / HTTP/1.1', f'Host: {HOST}', 'Connection: keep-alive']
    req = ('\r\n'.join(raw_req) + "\r\n\r\n").encode()
    print("Request:", req)

    ssock.send(req)

    msg = ssock.recv(4096).decode()
    print("\nResponse:")
    print(msg)

输出:

Request: b'GET / HTTP/1.1\r\nHost: stackoverflow.com\r\nConnection: keep-alive\r\n\r\n'

Response:
HTTP/1.1 200 OK
Connection: keep-alive
content-type: text/html; charset=utf-8
...

如果 HTTP 响应大于 4096 字节,那么您需要在循环中调用ssock.recv()直到它返回一个长度为 0 的字节数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM