Python TCP 套接字发送字符串
Python TCP socket send String
在 putty 中发送 get
时,服务器响应 HTTP/1.1 400 Bad Request
这完全没问题 因为我只是在检查服务器是否已启动并且 运行.
现在我正在尝试在 python 中自动执行该过程,但是 s.send("get".encode())
似乎什么也没做 ,我该如何使用 s.send()
?
s.recv(1024).decode("utf-8")
工作正常
我也在使用相同的程序来检查其他端口。
import socket
host = "webmail"
port = 80
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.send("get".encode())
print(s.recv(1024).decode("utf-8"))
当您通过 socket
发送请求时,您需要确保仔细遵循服务器期望的协议。在这种情况下,服务器似乎需要有效的 HTTP/1.1
消息,因此您必须严格遵守协议。在这种情况下,一个简单的 GET
调用需要看起来像这样:
GET / HTTP/1.1
Host: example.com
Connection: close
Accept: */*
但是,请注意,每一行都必须使用 RFC7230, section 3, Message Format 中定义为 CRLF
的内容进行正确转义,这就是 \r\n
,并且在你的末尾多了一个信息。因此,上面的消息实际上看起来像这样:
GET / HTTP/1.1\r\nHost: example.com\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n
如果您想像上面那样发送原始消息,我建议您查看两个可能的模块,它们可以让您的生活更轻松一些:
您可以通过从 socket
中抽象出来并使用 requests
之类的东西来让您的生活更轻松一些,这样您就可以更轻松地发送 GET
请求:
import requests
requests.get("http://example.com")
如果您正在与不同的协议(如 SFTP
、SSH
等)进行交互,我建议您找到从原始套接字请求中抽象出来的模块,并将它们结合使用。处理原始 HTTP 请求(and/or 其他协议)需要对服务器如何绑定回复有一定程度的“信心”,通常这些模块会抽象出大量后端繁重的工作(例如在HTTP/1.1
200-299 and 300-399 响应代码的情况)。
詹姆斯·K·波尔克总统:
@0brine: This answer shows a minimal correct string to send, however, each "newline" needs to be a carriage-return linefeed pair, e.g. b'\r\n'. Thus s.sendall(b'GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\nAccept: /\r\n') should suffice. –
在 putty 中发送 get
时,服务器响应 HTTP/1.1 400 Bad Request
这完全没问题 因为我只是在检查服务器是否已启动并且 运行.
现在我正在尝试在 python 中自动执行该过程,但是 s.send("get".encode())
似乎什么也没做 ,我该如何使用 s.send()
?
s.recv(1024).decode("utf-8")
工作正常
我也在使用相同的程序来检查其他端口。
import socket
host = "webmail"
port = 80
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.send("get".encode())
print(s.recv(1024).decode("utf-8"))
当您通过 socket
发送请求时,您需要确保仔细遵循服务器期望的协议。在这种情况下,服务器似乎需要有效的 HTTP/1.1
消息,因此您必须严格遵守协议。在这种情况下,一个简单的 GET
调用需要看起来像这样:
GET / HTTP/1.1
Host: example.com
Connection: close
Accept: */*
但是,请注意,每一行都必须使用 RFC7230, section 3, Message Format 中定义为 CRLF
的内容进行正确转义,这就是 \r\n
,并且在你的末尾多了一个信息。因此,上面的消息实际上看起来像这样:
GET / HTTP/1.1\r\nHost: example.com\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n
如果您想像上面那样发送原始消息,我建议您查看两个可能的模块,它们可以让您的生活更轻松一些:
您可以通过从 socket
中抽象出来并使用 requests
之类的东西来让您的生活更轻松一些,这样您就可以更轻松地发送 GET
请求:
import requests
requests.get("http://example.com")
如果您正在与不同的协议(如 SFTP
、SSH
等)进行交互,我建议您找到从原始套接字请求中抽象出来的模块,并将它们结合使用。处理原始 HTTP 请求(and/or 其他协议)需要对服务器如何绑定回复有一定程度的“信心”,通常这些模块会抽象出大量后端繁重的工作(例如在HTTP/1.1
200-299 and 300-399 响应代码的情况)。
詹姆斯·K·波尔克总统:
@0brine: This answer shows a minimal correct string to send, however, each "newline" needs to be a carriage-return linefeed pair, e.g. b'\r\n'. Thus s.sendall(b'GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\nAccept: /\r\n') should suffice. –