5

これは私のコードです:

# Process connections

print('Listening on port', port)
while True:
    c, addr = s.accept()
    print("Got connection from", addr)
    msg = "<html></html>"

    response_headers = {
        'Content-Type': 'text/html; encoding=utf8',
        'Content-Length': len(msg.encode(encoding="utf-8")),
        'Connection': 'close',
    }

    response_headers_raw = ''.join('%s: %s\n' % (k, v) for k, v in response_headers.items())

    response_proto = 'HTTP/1.1'
    response_status = '200'
    response_status_text = 'OK' # this can be random

    # sending all this stuff
    r = '%s %s %s' % (response_proto, response_status, response_status_text)
    c.send(r.encode(encoding="utf-8"))
    c.send(response_headers_raw.encode(encoding="utf-8"))
    c.send('\n'.encode(encoding="utf-8")) # to separate headers from body
    c.send(msg.encode(encoding="utf-8"))

    c.close()

ブラウザでローカル IP にアクセスすると、エラー ページが表示されます。

ERR_CONNECTION_RESET

私は何を間違っていますか?

ノート:

完全なコード スニペットは次のとおりです。

import socket

# Create socket object and set protocol
s = socket.socket(
    socket.AF_INET, socket.SOCK_STREAM)

# Get name of local machine
host = socket.gethostname()
port = 80

# Bind
s.bind((host, port))

# Listen and set backlog (?)
s.listen(5)

# Process connections
print('Listening on port', port)
while True:
    c, addr = s.accept()
    print("Got connection from", addr)
    msg = "<html></html>"

    response_headers = {
        'Content-Type': 'text/html; encoding=utf8',
        'Content-Length': len(msg.encode(encoding="utf-8")),
        'Connection': 'close',
    }

    response_headers_raw = ''.join('%s: %s\n' % (k, v) for k, v in response_headers.items())

    response_proto = 'HTTP/1.1'
    response_status = '200'
    response_status_text = 'OK' # this can be random

    # sending all this stuff
    r = '%s %s %s' % (response_proto, response_status, response_status_text)
    c.send(r.encode(encoding="utf-8"))
    c.send(response_headers_raw.encode(encoding="utf-8"))
    c.send('\n'.encode(encoding="utf-8")) # to separate headers from body
    c.send(msg.encode(encoding="utf-8"))

    c.close()
4

3 に答える 3

1

問題は、HTTP ヘッダー\r\n\n. RFC 1945 - HTTP/1.0 Sec 2.2およびRFC 7230 - HTTP/1.1 Syntax and Routing Sec 3を参照してください。

これを変更すると、問題が解決します。

import socket

# Create socket object and set protocol
s = socket.socket(
    socket.AF_INET, socket.SOCK_STREAM)

# Get name of local machine
host = "127.0.0.1"
port = 8081

# Bind
s.bind((host, port))

# Listen and set backlog (?)
s.listen(5)

# Process connections
print('Listening on port', port)
while True:
    c, addr = s.accept()
    print("Got connection from", addr)
    msg = "<html><body><h1>This is a test</h1><p>More content here</p></body></html>"

    response_headers = {
        'Content-Type': 'text/html; encoding=utf8',
        'Content-Length': len(msg),
        'Connection': 'close',
    }

    response_headers_raw = ''.join('%s: %s\r\n' % (k, v) for k, v in response_headers.items())

    response_proto = 'HTTP/1.1'
    response_status = '200'
    response_status_text = 'OK' # this can be random

    # sending all this stuff
    r = '%s %s %s\r\n' % (response_proto, response_status, response_status_text)
    c.send(r)
    c.send(response_headers_raw)
    c.send('\r\n') # to separate headers from body
    c.send(msg.encode(encoding="utf-8"))

    c.close()
于 2016-03-21T03:13:59.493 に答える
0

エラーによると、ERR_CONNECTION_RESETtcp ソケットがポートを正常にリッスンしていない可能性があります。

コードでポートを 8080 に変更Hello worldし、出力に a を書き込むと、適切な HTML ページが表示されます。

80 ポートを正常にリッスンする場合は、root ユーザー権限を使用して Python スクリプトを実行する必要があります。

「sudo python server.py」

これは、80 ポートがシステム制限ポートであるためです。最初の 1024 ポートが root ユーザーのみに制限されているのはなぜですか? .

于 2016-03-21T03:22:46.113 に答える
-1

ポート80をリッスンして接続を受け入れることができると思います。そうしないと、サーバーが早期に例外をスローする必要があります。

私の推測では、サーバーはクライアントの要求を読み取らず、代わりに単にデータを送信して接続を閉じるため、接続がリセットされます-クライアントからの要求はまだソケットバッファーにあります。これは、 Perl: Connection reset with simple HTTP serverおよびHTTP Server Not Sending Complete File To WGET, Firefoxで既に質問および回答されている典型的なエラーです。ピアによって接続がリセットされましたか? localhost ソケット サーバーおよびPHP で記述された Ultra simple HTTP ソケット サーバーに接続しようとすると、Web ブラウザーで"接続がリセットされました" が予期しない動作をし、fork と dup を使用して Simple http 汎用サーバーが動作します。

于 2016-03-21T06:12:02.890 に答える