Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TCP套接字发送字符串_Python_Sockets_Tcp - Fatal编程技术网

Python TCP套接字发送字符串

Python TCP套接字发送字符串,python,sockets,tcp,Python,Sockets,Tcp,发送get时,使用HTTP/1.1 400错误请求将服务器响应放入 这很好,因为我只检查服务器是否已启动并正在运行 现在我试图用python自动化这个过程,但是s.send(“get.encode())似乎什么也做不了,我该如何使用s.send() s.recv(1024).decode(“utf-8”)工作正常 我还使用相同的程序来检查其他端口 import socket host = "webmail" port = 80 s = socket.socket(sock

发送
get
时,使用
HTTP/1.1 400错误请求将服务器响应放入

这很好,因为我只检查服务器是否已启动并正在运行

现在我试图用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
发送请求时,您需要确保仔细遵守服务器所期望的协议。在这种情况下,服务器似乎需要有效的消息,因此您必须严格遵守协议。在这种情况下,一个简单的
GET
调用需要如下所示:

GET / HTTP/1.1
Host: example.com
Connection: close
Accept: */*
但是,请注意,必须使用
CRLF
中定义的内容对每一行进行正确转义,即
\r\n
,并在消息末尾额外转义一行。因此,上述消息实际上看起来是这样的:

GET / HTTP/1.1\r\nHost: example.com\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n
如果您想发送上述原始信息,我建议您查看两个可能的模块,它们可以让您的生活更轻松:

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

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

导入请求
请求。获取(“http://example.com")

如果您正在与不同的协议(如
SFTP
SSH
等)交互,我建议您查找从原始套接字请求中抽象出来的模块,并将它们结合使用。处理原始HTTP请求(和/或其他协议)需要对服务器如何应答有一定程度的“信心”,通常这些模块会提取大量后端繁重的工作(例如,在
HTTP/1.1
响应代码的情况下)。

总裁詹姆斯·波尔克:


@0b:此答案显示要发送的最小正确字符串,但是,每个“换行符”都需要是回车换行符对,例如b'\r\n'。因此,s.sendall(b'GET/HTTP/1.1\r\nHost:example.com\r\n连接:close\r\n接受:/\r\n')就足够了


“在putty中发送”是什么意思?基本上,我是通过一个名为putty的第三方程序建立TCP连接,以手动发送/接收字符串(在控制台中)。不,我想使用TCP连接,因为我还想检查其他服务,如smtp、imap、pop、ssh等。@0b:这个答案显示了要发送的最小正确字符串,每个“换行符”都需要是回车换行符对,例如b'\r\n'。因此
s.sendall(b'GET/HTTP/1.1\r\nHost:example.com\r\n连接:close\r\n接受:*/*\r\n')
就足够了。许多HTTP服务器将接受无效的HTTP,因此,例如像
s.send(b'GET\r\n')
这样简单的东西可能会起作用。@PresidentJamesK.Polk您完全正确。我最初写这个答案的目的是将OP重定向到从套接字中抽象出来——这在我看来不是很好。我已经扩展了我的答案,包括
CRLF
。关于您的响应,请注意,您的请求缺少结尾
CRLF
,大多数服务器都需要该结尾才能断定消息是有效的-我知道,这是次要的,但值得注意的是,如果OP有一些反复无常的服务器从未响应。