2016-10-24 16 views
0
from socket import * 
import thread 


def thread_handler(connectionSocket, addr): 
    while True: 
     # Establish the connection 
      print ("Ready to serve...") 

#   connectionSocket, addr = serverSocket.accept() 



     try: 
      message = connectionSocket.recv(1024) 
#   print(message, '::', message.split()[0], ":", message.split()[1]) 
      filename = message.split()[1] 
#   print(filename, "||", filename[1:]) 
      f = open(filename[1:], "r") 

      outputdata = f.read() 
#   print(outputdata) 

      #Send one HTTP header line into socket 
      #Fill in start 
      connectionSocket.send('\nHTTP/1.1 200 OK\n\n') 
      connectionSocket.send(outputdata) 
      #Fill in end 

      #Send the content of the requested file to the client 
      for i in range(0,len(outputdata)): 
       connectionSocket.send(outputdata[i:i+1]) 
      connectionSocket.send(b'\r\n\r\n') 

     except IOError: 
      #Send response message for file not found 
       #Fill in Start 
       connectionSocket.send('\nHTTP/1.1 404 Not Found\n\n') 
       #Fill in end 

       #Close client socket 


if __name__ == '__main__': 
    serverSocket = socket(AF_INET, SOCK_STREAM) 
    # Prepare a sever socket 
    serverSocket.bind(("localhost", 6789)) 
    serverSocket.listen(1) 

while True: 
    print('waiting for connection...') 
    connectionSocket, addr = serverSocket.accept() 
    print('...connected from:', addr) 
    thread.start_new_thread(thread_handler, (connectionSocket, addr)) 


serverSocket.close() 

マルチスレッドの仕組みを理解していますが、接続の作成方法を理解できませんでした。 私はTCPサーバーのマルチスレッド版をやろうとしています。しかし、それは「範囲外のリストインデックス」を与え続け:IndexError:リストインデックスが範囲外になっているマルチスレッドサーバー

Ready to serve... 
Unhandled exception in thread started by <function thread_handler at 0x10b9750c8> 
Traceback (most recent call last): 
    File "http_server_multi.py", line 16, in thread_handler 
    filename = message.split()[1] 
IndexError: list index out of range 
+0

私は 'pdb'を使って、インデックスエラーが発生した時点で' message'が何であるかを確認することをお勧めします。空白のない1024文字以上の長さの入力を取得すると、このエラーが発生します。 – shuttle87

答えて

0

データがまだ存在しないため、何もソケットから受信されない場合、split()が唯一の項目をオンにした['']を返し、その上に[1]が失敗します。

が失敗したライン

if not message: 
    # time.sleep(0.01) 
    continue 

前にこれを追加してみsleep()コールは、あなたがそれをumcommentし、あなたのニーズに値を適応させることができ、あまりにも多くのCPUを使用するためのスレッドを防ぐことができます。

関連する問題