Python TCP套接字发送字符串

2024-04-26 14:41:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: 服务器sendhttphostgetportrequestsocket
2条回答

当您通过socket发送请求时,您需要确保仔细遵守服务器所期望的协议。在这种情况下,服务器似乎需要有效的^{}消息,因此您必须严格遵守协议。在这种情况下,一个简单的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

如果您想发送上述原始信息,我建议您查看两个可能的模块,它们可以让您的生活更轻松:

  • httpsuite:(免责声明:我是作者)允许出于socket目的轻松操纵HTTP/1.1请求
  • h11:与上面类似,但我个人没有使用过它(在编写上面的模块后发现的)

您可以通过从socket抽象出来,而不是使用类似^{}的东西来简化您的生活,这将允许您更轻松地发送GET请求:

import requests

requests.get("http://example.com")

如果您正在与不同的协议(如SFTPSSH等)交互,我建议您查找从原始套接字请求中抽象出来的模块,并将它们结合使用。处理原始HTTP请求(和/或其他协议)需要对服务器如何应答有一定程度的“信心”,通常这些模块将抽象出大量后端繁重的工作(例如,在HTTP/1.1200-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. –

相关问题 更多 >