套接字的Python问题

时间:2011-03-01 21:37:46

标签: 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)
我运行它,它连接但我没有得到GET /

的输出

3 个答案:

答案 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())