python,perl socket阻塞读取数据时的差异?

时间:2013-07-10 23:46:22

标签: python sockets

在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()会被阻止。有办法解决这个问题吗?为什么perl中的<CLIENT>没有阻塞?

1 个答案:

答案 0 :(得分:1)

您的(更新的)Perl示例是从客户端读取一个行; Python正在从客户端读取所有输入行,直到套接字关闭。并且客户端不会关闭套接字,因为它希望能够执行HTTP keepalive。您应该使用readline而不是readlines来读取单行输入。或者,如果你真的想说HTTP,你应该使用为此制作的模块。