2012-04-10 4 views
0

나는 소켓 프로그래밍을 배우고 있고 내 기본 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" 

OUTPUT

Connecting 
Sending Request 
298 
Receving Reponse 
Completed 

것은 나는 그것이 나에게 위키 피 디아의 홈 페이지의 HTML 콘텐츠를 표시 기대 동안 '(또한

, 그것은 좋은 것입니다 누군가가 파이썬 소켓에 대해 자세히 읽을 수있는 웹 리소스/책을 공유 할 수 있다면 HTTP 요청 클라이언트 프로그래밍 t

감사!

+2

개행 문자가 올바른 개행 문자 (' '\ r \ n '')입니까? 또한 헤더 뒤에 빈 줄이 하나 있어야하며 헤더가 완료되었다는 것을 서버에 알려줍니다. –

+0

아니, 아니 .. .. \ n 충분할 것이라고 생각하지만 그것은 나던 .. 내가 그것을 가지고 .. 고마워 :) – codersofthedark

답변

2

최소한의 HTTP 클라이언트의 경우 Accept-Encoding: gzip을 보내지 않아야합니다. 서버는 gzip으로 응답 할 가능성이 높기 때문에 눈으로는 잘 이해할 수 없습니다. :)

는 Windows 라인 엔딩으로 윈도우에서 개발하는 일이 있지만, 그건 그냥 행운이고 당 프로그래밍하지 않는 한 당신은 (사양에 따라 \r\n와 최종 이중 \r\n (도 당신이 실제로 종료하는 당신의 라인을 전송하지 않는

. 자체) 또한

, 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 

편집 : 자원으로/책/참조 ence - 참조 HTTP 클라이언트 구현의 경우 Python의 고유 한 코드 httplib.py을 살펴보십시오. :)

+2

아마도 "\ r \ n"원본 코드의 문제입니다; Wikipedia 웹 서버는 유효하지 않거나 손상된 HTTP 헤더를 확인하자마자 연결을 닫습니다. – modelnine

+0

@ modelnine : 당신이 맞다고 생각합니다. :) – codersofthedark

+0

@AKX : 감사합니다 ... 나는 \ n만을 사용했다. 그리고 참조로 httplib.py 훌륭한 소리 !! :) – codersofthedark

관련 문제