2012-04-12 3 views
0

私はクラスのためにPythonで簡単なHTTP Webサーバーを実装しようとしています。現在、私はそれを簡単にするためにハードコーディングしていますが、なぜ動作しないのか分かりません。 手動でHTTP GETをPythonで実装する

#Python 2 
import socket 
import threading 

class socketEcho(threading.Thread): 
    def __init__(self,conn): 
    super(socketEcho,self).__init__() 
    self.conn = conn 

    def run(self): 
    while 1: 
     data = self.conn.recv(1024) 
     if not data: 
     print 'Break' 
     break 
     data = """GET /index.html HTTP/1.1 
     host: www.esqsoft.globalservers.com 

     """ 
     dataList = data.split() 
     URI = dataList[1] 
     URI = URI[1:] 
     hostAddress = dataList[4]  
     try: 
     file = open(URI,'r').read() 
     result = "HTTP/1.1 200 OK \r\nContent-Type: text/html\r\n\r\n" 
     result = result + file 
     except IOError as e: #HTTP 404 
     print "Error" 
     pass  
     #conn.send(data) 
     print "Sending" 
     print result 
     try: 
     self.conn.send(result) 
     except: 
     print "Send Error" 
    HOST = '' 
    PORT = 50420 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.bind((HOST,PORT)) 
    s.listen(2) #Blocks, accept only one connection 
    while True: 
     newSock, addr = s.accept() 
     print 'Connected by', addr 
     newConn = socketEcho(newSock) 
     newConn.start() 

私はローカルホストに私のborswer(Firefoxの)送信しよう

:50420は、それだけで罰金200 OKコードを取得しますが、それはただそこに待ってページを表示することはありません。そして、私は結果変数からプリントを見てきたので、それはうまく見えるので、何がアップしているのかわかりません。そして、送信される直前の結果変数からの印刷がここにあります。

HTTP/1.1 200 OK 
Content-Type: text/html 

<html> 

    <head> 
    </head> 

    <body> 

     <h1>Hello World</h1> 
     <p>Yes, this does indeed work</p> 
     <p><a href="http://www.google.com">Google</a></p> 
     <!--<a href="http://knuth.luther.edu/~ranuha01/hello.html">Link Test</a>--> 
     <!--<img src="earth.jpg" alt="Earth picture" height="100">--> 
     <ul> 
      <li><b>One</b></li> 
      <ul> 
       <li>One and a half</li> 
      </ul> 
      <li><b>Two</b></li> 
     </ul> 

    </body> 

</html> 
+0

コードをクリーンアップするには、ファイルの先頭にある "" " – luke14free

答えて

0

まず、ハンドラでconnを閉じる必要があります。第二に、実行(自己)にループを入れないでください、イベントループがメインです。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
#Python 2 
import socket 
import threading 

class socketEcho(threading.Thread): 
    def __init__(self,conn): 
     super(socketEcho,self).__init__() 
     self.conn = conn 

    def run(self): 
     data = self.conn.recv(1024) 
     if not data: 
     print 'Break' 
     self.conn.close() 
     return 
     data = """GET /index.html HTTP/1.1 
     host: www.esqsoft.globalservers.com 

     """ 
     dataList = data.split() 
     URI = dataList[1] 
     URI = URI[1:] 
     hostAddress = dataList[4]  
     try: 
     file = open(URI,'r').read() 
     result = "HTTP/1.1 200 OK \r\nContent-Type: text/html\r\n\r\n" 
     result = result + file 
     except IOError as e: #HTTP 404 
     print "Error" 
     pass  
     #conn.send(data) 
     print "Sending" 
     print result 
     try: 
     self.conn.send(result) 
     self.conn.close() 
     except: 
     print "Send Error" 

HOST = '' 
PORT = 50420 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST,PORT)) 
s.listen(2) #Blocks, accept only one connection 
while True: 
    newSock, addr = s.accept() 
    print 'Connected by', addr 
    newConn = socketEcho(newSock) 
    newConn.start() 
関連する問題