套接字没有接收数据。为什么?

时间:2012-04-10 07:07:17

标签: python http sockets

我正在学习socket编程并尝试设计我的基本http客户端。但不知怎的,一切都很顺利,但我没有收到任何数据。你能告诉我我错过了什么吗?

CODE

import socket

def create_socket():
    return socket.socket( socket.AF_INET, socket.SOCK_STREAM )

def remove_socket(sock):
    sock.close()
    del sock


sock = create_socket()
print "Connecting"
sock.connect( ('en.wikipedia.org', 80) )
print "Sending Request"
print sock.sendall  ('''GET /wiki/List_of_HTTP_header_fields HTTP/1.1
Host: en.wikipedia.org
Connection: close
User-Agent: Web-sniffer/1.0.37 (+http://web-sniffer.net/)
Accept-Encoding: gzip
Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7
Cache-Control: no-cache
Accept-Language: de,en;q=0.7,en-us;q=0.3
Referer: d_r_G_o_s
''')
print "Receving Reponse"
while True:
    content = sock.recv(1024)
    if content:
        print content
    else:
        break
print "Completed"

输出

Connecting
Sending Request
298
Receving Reponse
Completed

虽然我期待它向我展示维基百科主页的html内容:'(

另外,如果有人可以分享一些网络资源/书籍,我可以详细阅读有关HTTP请求客户端的python套接字编程的文章,这将是很棒的

谢谢!

1 个答案:

答案 0 :(得分:2)

对于最小的HTTP客户端,你绝对不应该发送Accept-Encoding: gzip - 服务器很可能会回复一个gzipped响应,你将无法用眼睛来理解。 :)

你没有发送最后的双\r\n(你也没有按照规范用\r\n终止你的行(除非你碰巧在带有Windows行结尾的Windows上开发,但那只是运气而不是编程本身。)

此外,del sock没有按照您的想法行事。

无论如何 - 这有效:

import socket
sock = socket.socket()
sock.connect(('en.wikipedia.org', 80))
for line in (
    "GET /wiki/List_of_HTTP_header_fields HTTP/1.1",
    "Host: en.wikipedia.org",
    "Connection: close",
):
    sock.send(line + "\r\n")
sock.send("\r\n")

while True:
    content = sock.recv(1024)
    if content:
        print content
    else:
        break

编辑:至于资源/书籍/参考 - 对于参考HTTP客户端实现,请查看Python自己的httplib.py。 :)