2012-04-12 6 views
0

はコード:Pythonソケットを使用したHTTP応答が失敗するのはなぜですか?

from socket import * 
sP = 14000 
servSock = socket(AF_INET,SOCK_STREAM) 
servSock.bind(('',sP)) 
servSock.listen(1) 

while 1: 
    connSock, addr = servSock.accept() 
    connSock.send('HTTP/1.0 200 OK\nContent-Type:text/html\nConnection:close\n<html>...</html>') 
connSock.close() 

私はローカルホストでブラウザや種類に行く:14000が、私はエラーを取得101- ERR_CONNECTION_RESET接続がリセットされましたか?理由は分かりません!私は間違って何をしていますか

+0

は、ここでは上記のわずかに修正したバージョンです。だから...接続:閉じる\ n \ n ... –

+0

すべてを「\ n」から「\ r \ n」に変更し、ヘッダの後ろに空白行を置きます。 [RFC](http://www.w3.org/Protocols/rfc2616/rfc2616.html)を読んでください。 –

答えて

2

いくつかのバグ、... @IanWetherbeeはすでに述べたように、あなたは身体の前に空行が必要です。また\ nだけでなく、\ r \ nも送ってください。短い送信を避けるには、sendallを使用する必要があります。最後に、送信が完了したら接続を閉じる必要があります。あなたはレスポンスボディの前に空行の\ nを必要とする

from socket import * 
sP = 14000 
servSock = socket(AF_INET,SOCK_STREAM) 
servSock.bind(('',sP)) 
servSock.listen(1) 

while 1: 
    connSock, addr = servSock.accept() 
    connSock.sendall('HTTP/1.0 200 OK\r\nContent-Type:text/html\r\nConnection:close\r\n\r\n<html><head>foo</head></html>\r\n') 
    connSock.close() 
0

あなたのコードを実行中、私は似たようなエラーがあって、起源も分かりません。しかし、独自のHTTPサーバーをローリングするのではなく、組み込みのHTTPサーバーと考えていますか?下のサンプルをチェックしてください。これはまた、POSTをサポートすることもできます(do_POSTメソッドを追加する必要があります)。他よりもいくつかのより厳しい

シンプルなHTTPサーバ

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler 

class customHTTPServer(BaseHTTPRequestHandler): 
     def do_GET(self): 
       self.send_response(200) 
       self.send_header('Content-type', 'text/html') 
       self.end_headers() 
       self.wfile.write('<HTML><body>Hello World!</body></HTML>') 
       return 

def main(): 
     try: 
       server = HTTPServer(('',14000),customHTTPServer) 
       print 'server started at port 14000' 
       server.serve_forever() 
     except KeyboardInterrupt: 
       server.socket.close() 

if __name__=='__main__': 
    main()