我正在开发一个涉及套接字的简单项目。有点像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)
我运行它,它连接但我没有得到GET / 的输出
答案 0 :(得分:2)
HTTP规范说标题后需要两个换行符('\r\n' * 2
)。尝试:
stuff = 'GET /\r\n\r\n'
答案 1 :(得分:1)
GET /
后至少需要一个空行,因此请使用stuff = "GET /\n\n"
。阅读this example。
答案 2 :(得分:1)
你的主要问题是在“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())