2

ソケット ライブラリを使用して Python Web サーバーを作成しようとしています。私はいくつかの情報源を調べてきましたが、私が書いたコードが機能しない理由がわかりません。他の人は非常によく似たコードを実行し、それが機能すると主張しています. 私はpythonが初めてなので、簡単なものが欠けているかもしれません。

これが機能する唯一の方法は、データ変数をクライアントに送り返すことです。ブラウザーは元の 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()
4

1 に答える 1

2

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

  1. に置き換えclient.recv(16)client.recv(size)、リクエストを使用します。

  2. 最後の行をs.close()1つのインデントに戻し、whileループに入らないようにします。現在、接続を閉じてacceptから再度接続を試みているため、最初のリクエスト後にサーバーがクラッシュします。

これを演習として行う場合を除いて、ソケットを直接使用するのではなく、SimpleHTTPServerを拡張する必要があります。

また、ソケットの作成後(バインド前)にこの行を追加すると、発生する可能性のある「アドレスはすでに使用されています」エラーが修正されます。

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

幸運を!

于 2012-04-11T18:45:26.853 に答える