Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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问题_Python_Http_Sockets - Fatal编程技术网

套接字的Python问题

套接字的Python问题,python,http,sockets,Python,Http,Sockets,我正在做一个涉及套接字的简单项目。有点像telnet。我只想让它连接到端口80并执行GET/ 以下是我正在尝试的: import socket size = 100000 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = "localhost" port = 80 s.connect((host, port)) stuff = "GET /" s.send(stuff) r = s.recv(size) print(r)

我正在做一个涉及套接字的简单项目。有点像telnet。我只想让它连接到端口80并执行GET/ 以下是我正在尝试的:

import socket
size = 100000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "localhost"
port = 80
s.connect((host, port))
stuff = "GET /"
s.send(stuff)
r = s.recv(size)
print(r)

导入套接字
尺寸=100000
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host=“localhost”
端口=80
s、 连接((主机、端口))
stuff=“GET/”
s、 送(东西)
r=s.recv(尺寸)
印刷品(r)

我运行它,它会连接,但是我没有得到get的输出。HTTP规范说在头之后需要两个换行符(
'\r\n'*2
)。尝试:

stuff = 'GET /\r\n\r\n'

HTTP规范说在头之后需要两个换行符(
“\r\n'*2
)。尝试:

stuff = 'GET /\r\n\r\n'

GET/
之后至少需要一个空行,因此请使用
stuff=“GET/\n\n”
。阅读。

您需要在
GET/
后面至少有一个空行,所以请使用
stuff=“GET/\n\n”
。阅读。

您的主要问题是在“GET/”之后缺少换行符。HTTP协议要求换行,所以服务器在等待它,这就是为什么您在等待响应

(一个小问题是缓冲区太大,Python套接字模块建议使用2的小功率,如4096)

我建议:

import socket
size = 4096
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "localhost"
port = 80
s.connect((host, port))
stuff = "GET /\n"
s.send(stuff)
buf = ''
while True:
    r = s.recv(size)
    if not r: break
    buf += r

print(buf)
最后的循环确保您将获得整个响应

最后,我推荐urllib2,它为您实现HTTP并避免此类错误:

import urllib2
print(urllib2.urlopen('http://localhost').read())

您的主要问题是在“GET/”之后缺少换行符。HTTP协议要求换行,所以服务器在等待它,这就是为什么您在等待响应

(一个小问题是缓冲区太大,Python套接字模块建议使用2的小功率,如4096)

我建议:

import socket
size = 4096
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "localhost"
port = 80
s.connect((host, port))
stuff = "GET /\n"
s.send(stuff)
buf = ''
while True:
    r = s.recv(size)
    if not r: break
    buf += r

print(buf)
最后的循环确保您将获得整个响应

最后,我推荐urllib2,它为您实现HTTP并避免此类错误:

import urllib2
print(urllib2.urlopen('http://localhost').read())

您是否尝试过获取/HTTP/1.1
?RFC2616似乎需要请求行中的协议版本您是否尝试过
GET/HTTP/1.1
?RFC2616似乎需要请求行中的协议版本