2012-04-12 48 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 \ n ... – 2012-04-12 05:23:23

+0

將所有''\ n''改爲''\ r \ n'',並在標題後面有一個空行。並閱讀[RFC](http://www.w3.org/Protocols/rfc2616/rfc2616.html)。 – 2012-04-12 05:32:21

回答

2

幾個錯誤,有些比其他人更嚴重......作爲@IanWetherbee已經指出的那樣,你需要的身體之前的空行。你也應該發送\ r \ n不只是\ n。您應該使用sendall以避免發送短信。最後,您需要在完成發送後關閉連接。

這裏是上面略加修改的版本:

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服務器,而是考慮內置一個?查看下面的示例。這也可以支持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()