2012-04-11 6 views
2

소켓 라이브러리를 사용하여 파이썬 웹 서버를 작성하려고합니다. 필자는 여러 출처를 통해 봤지만 필자가 작성한 코드가 작동하지 않는 이유를 알 수 없습니다. 다른 사람들은 매우 유사한 코드를 실행하여 작동한다고 주장합니다. 저는 파이썬에 익숙하지 않아서 간단한 것을 놓치고있을 수도 있습니다.간단한 파이썬 웹 서버 문제

유일한 방법은 데이터 변수를 다시 클라이언트로 보내는 것입니다. 브라우저가 원래 GET 요청을 인쇄합니다. HTTP 응답을 보내려고하면 연결 시간이 초과됩니다.

import socket 

##Creates several variables, including the host name, the port to use 
##the size of a transmission, and how many requests can be handled at once 
host = '' 
port = 8080 
backlog = 5 
size = 1024 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port)) 
s.listen(backlog) 
while 1: 
    client, address = s.accept() 
    data = client.recv(16) 
    if data: 
     client.send('HTTP/1.0 200 OK\r\n') 
     client.send("Content-Type: text/html\r\n\r\n") 
     client.send('<html><body><h1>Hello World</body></html>') 

    client.close() 
    s.close() 
+0

실행하려고하면 정확히 어떻게됩니까? [소켓 및/또는 HTTP를 배우기 위해 이것을 수행하는 것과는 별개로, 나쁜 생각입니다] –

+0

쉘을 실행하면 입력 할 때까지 기다립니다. localhost : 8080을 브라우저에 입력하십시오. 내가 할 때, 쉘은 닫힙니다. 잠시 후 브라우저에서 연결 시간이 초과되었다고 말합니다. 앞에서 언급했듯이 클라이언트에 데이터 변수 만 보내는 경우 웹 브라우저는 GET 요청을 표시합니다. – egoskeptical

답변

2

당신은 응답하기 전에 입력을 소비해야하고, 당신은 당신의 while 루프에서 소켓을 닫지해야

  1. client.recv(size)client.recv(16) 교체 요청을 소비 할 수 있습니다.

  2. 마지막 줄을 s.close() 뒤로 이동하여 while 회 돌이가 없도록하십시오. 연결을 닫은 후 다시 accept을 시도하면 서버가 첫 번째 요청 이후에 충돌합니다.

연습으로하지 않는 한 소켓을 직접 사용하는 대신 SimpleHTTPServer을 확장해야합니다.

또한 소켓을 작성한 후 (바인드 전)에이 행을 추가하면 가져 오는 "사용중인 주소"오류가 수정됩니다.

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

행운을 빈다!

+0

응답 해 주셔서 감사합니다, Graham. 변경 사항을 구현했습니다 (원래 client.recv (크기)가 있었고 문제 해결을 위해 변경되었습니다). 그러나이 두 가지 변경 사항은 차이가 없습니다. – egoskeptical

+0

오. 그것은 나를 위해 Linux에서 크롬 브라우저와 함께 작동합니다. 'size = 4096'을 시도하면 모든 것을 소비하고 있음을 확신 할 수 있습니다. 크롬이나 파이어 폭스의 네트워크 검사기에서 그것이 단서를 제공하는지 확인하십시오. –

+0

이상 하네. 나는 IE와 FF로 윈도우 7에있다. 나는 크기를 늘리려고 노력했다. 유일한 차이점은 브라우저에 localhost : 8080을 입력하면 쉘이 닫히지 않는다는 것입니다. 라이브 HTTP 헤더에는 아무 것도 나타나지 않습니다. – egoskeptical