2012-04-12 10 views
0

Code:Warum schlägt meine HTTP-Antwort mit Python-Sockets fehl?

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() 

Wenn ich an den Browser und geben Sie localhost gehen: 14000, ich einen Fehler 101- ERR_CONNECTION_RESET Die Verbindung wurde zurückgesetzt? Nicht sicher warum! Was mache ich falsch?

+0

Sie benötigen einen \ n auf eine leere Zeile vor der Antworttext. Also ... Verbindung: schließen \ n \ n ... –

+0

Ändern Sie alle "\ n" in "\ r \ n" und haben Sie eine leere Zeile nach der Überschrift. Und lesen Sie die [RFC] (http://www.w3.org/Protocols/rfc2616/rfc2616.html). –

Antwort

2

Mehrere Fehler, einige härter als andere ... wie @IanWetherbee bereits erwähnt, müssen Sie eine leere Zeile vor dem Körper. Sie sollten auch \ r \ n nicht nur \ n senden. Sie sollten sendall verwenden, um kurze Sendevorgänge zu vermeiden. Zuletzt müssen Sie die Verbindung nach dem Senden schließen.

Hier ist eine leicht modifizierte Version des oben:

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

Wenn Sie Ihren Code laufen lassen, habe ich ähnliche Fehler und bin nicht sicher, woher sie stammen. Aber haben Sie, statt Ihren eigenen HTTP-Server zu rollen, einen eingebauten Server in Betracht gezogen? Schauen Sie sich das folgende Beispiel an. Dies kann auch POST unterstützen (muss die do_POST Methode hinzufügen).

Einfache HTTP Server

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()