0

Perlでは、私はできる

socket(SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
bind(SERVER, $my_addr);
listen(SERVER, SOMAXCONN);
$client_address = accept(CLIENT, SERVER);
$line = <CLIENT>;  # Read until newline or EOF
print $line

ブラウザ経由でアクセスすると$line = <CLIENT>、ブロックせずに返されて印刷されます。次のようにPythonで同じことをしようとしている場合

from socket import *
host = ""
port = 9000
address = (host, port)
server = socket(AF_INET, SOCK_STREAM)
server.bind(address)
server.listen(SOMAXCONN)
client, addr = server.accept()
client_fd = client.makefile()
data = client_fd.readlines()
print data

client_fd.readlines()ブラウザでリクエストを強制終了しない限り、ブロックされています。これを回避する方法はありますか?そして、なぜ<CLIENT>perlがブロックされていないのですか?

4

1 に答える 1

1

(更新された) Perl の例では、クライアントから1行を読み取っています。Python は、ソケットが閉じられるまで、クライアントからのすべての入力行を読み取ります。また、クライアントは HTTP キープアライブを実行できることを望んでいるため、ソケットを閉じません。1 行の入力を読み取るreadline代わりに使用する必要があります。readlinesまたは、本当に HTTP を話そうとする場合は、そのために作成されたモジュールを使用する必要があります。

于 2013-07-11T01:39:11.463 に答える