0

私はソケットプログラミングを学んでいて、私の基本的なhttpクライアントを設計しようとしました。しかし、どういうわけかすべてが順調に進んでいますが、私はデータを受け取っていません。何が足りないのか教えていただけますか?

コード

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ソケットプログラミングについて詳しく読むことができるいくつかのWebリソース/本を共有できれば素晴らしいと思います

ありがとう!

4

1 に答える 1

3

最小限のHTTPクライアントの場合、送信するべきではありませんAccept-Encoding: gzip。サーバーは、ほとんどの場合、目で理解できないgzip圧縮された応答で応答します。:)

最後のダブルを送信していません\r\n(また、仕様に従って実際に行を終了して\r\nいません(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

編集:resources / books / referenceについては、参照HTTPクライアントの実装については、Python独自のものを参照してくださいhttplib.py。:)

于 2012-04-10T07:14:21.897 に答える