2012-04-11 23 views
2

私はソケットライブラリを使用してPython Webサーバーを作成しようとしています。私はいくつかの情報源を見てきましたが、私が書いたコードがなぜ機能しないのか理解できません。他の人は非常に似たようなコードを実行し、それが機能すると主張する私はPythonには新しいので、私は単純なものが欠けているかもしれません。シンプルなPython Webサーバーの問題

これでうまくいく唯一の方法は、データ変数をクライアントに送り返すことです。ブラウザは元のGETリクエストを出力します。 HTTP応答を送信しようとすると、接続がタイムアウトします。

import socket 

##Creates several variables, including the host name, the port to use 
##the size of a transmission, and how many requests can be handled at once 
host = '' 
port = 8080 
backlog = 5 
size = 1024 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port)) 
s.listen(backlog) 
while 1: 
    client, address = s.accept() 
    data = client.recv(16) 
    if data: 
     client.send('HTTP/1.0 200 OK\r\n') 
     client.send("Content-Type: text/html\r\n\r\n") 
     client.send('<html><body><h1>Hello World</body></html>') 

    client.close() 
    s.close() 
+0

あなたがそれを実行しようとすると正確に何が起こるのですか?[ソケットやHTTPの学習のためにこれを行うのとは別に、悪い考えです] –

+0

これを実行すると、シェルがポップアップし、 localhost:8080をブラウザに入力します。私がすると、シェルは閉じます。しばらくすると、ブラウザは接続がタイムアウトしたことを知らせます。前述のように、クライアントにデータ変数のみを送信すると、WebブラウザはGET要求を表示します。 – egoskeptical

答えて

2

あなたは、応答する前に、入力を消費する必要がある、とあなたはwhileループでソケットを閉じないでください。

  1. はリクエストを消費するために、client.recv(size)client.recv(16)を交換してください。

  2. 最後の行をs.close()に戻して、whileループにはないようにします。接続を終了してからもう一度acceptに接続しようとすると、最初のリクエスト後にサーバーがクラッシュする可能性があります。

これを練習として行っていない限り、ソケットを直接使用する代わりにSimpleHTTPServerを拡張する必要があります。

また、作成した後にこの行を追加すると(バインド前に)、「使用中のアドレス」エラーが修正されます。

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

幸運!

+0

グラハムさん、ありがとうございました。私は変更を実装しました(私は元々client.recv(サイズ)を持っていて、トラブルシューティングのために変更しました)。しかし、これらの2つの変更は違いはありません。 – egoskeptical

+0

ああ。それは、Linux上でChromeブラウザを使って私のために働く。 'size = 4096'を試して、すべてを消費していることを確認してください。 ChromeやFirefoxのネットワークインスペクタで、それが手がかりを与えるかどうかを確認してください。 –

+0

それは変です。私はIEとFFでWindows 7にいる。サイズを増やしてみました。私が気づいた点は、localhost:8080をブラウザに入力するとシェルが閉じないということだけです。ライブHTTPヘッダーには何も表示されません。 – egoskeptical

関連する問題