![](/img/trans.png)
[英]How to recieve data from a one socket and send it to another socket in 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.