簡體   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