2012-04-10 5 views
0

J'apprenais la programmation de socket et j'ai essayé de concevoir un client http de base. Mais d'une manière ou d'une autre tout va bien mais je ne reçois aucune donnée. Pouvez-vous s'il vous plaît me dire ce qui me manque?Socket ne recevant aucune donnée. Pourquoi?

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" 

SORTIE

Connecting 
Sending Request 
298 
Receving Reponse 
Completed 

Pendant que je m'y attendais pas me montrer le contenu HTML de la page d'accueil de wikipedia: '(

De plus, ce serait génial si quelqu'un peut partager quelques ressources web/livres où je peux lire en détail à propos de python socke t programmation pour HTTP Request Client

Merci!

+2

Vos nouvelles lignes sont-elles les nouvelles lignes («\ r \ n'')? En outre, après les en-têtes, vous devriez avoir une seule ligne vide, cela indique au serveur que les en-têtes sont terminés. –

+0

Non ce n'était pas .. Je pensais que \ n suffira mais il ne .. je l'ai eu .. merci :) – codersofthedark

Répondre

2

Pour un client HTTP minimal, vous ne devriez certainement pas envoyer Accept-Encoding: gzip - le serveur répondra probablement avec une réponse gzippée, vous ne serez pas en mesure de faire beaucoup de sens à l'œil nu. :)

Vous n'êtes pas envoyer les doubles \r\n finales (ne vous se termine réellement vos lignes avec \r\n selon les spécifications (à moins que vous arrive de se développer sur Windows avec les fins de ligne Windows, mais c'est juste la chance et non la programmation par . se)

En outre, del sock il ne fait pas ce que vous pensez qu'elle

quoi qu'il en soit - cela fonctionne:.

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 

EDIT: En ce qui concerne les ressources/livres/référence encores - pour une implémentation de client HTTP de référence, regardez httplib.py de Python. :)

+2

Très probablement, le "\ r \ n" manquant est le problème dans le code original; le serveur Web Wikipedia ferme la connexion dès qu'il voit des en-têtes HTTP invalides/brisés. – modelnine

+0

@modelnine: Je pense que vous avez raison ... :) – codersofthedark

+0

@AKX: merci ... Je n'utilisais que \ n. Et httplib.py comme référence semble génial !! :) – codersofthedark