![](/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.