python socket.recv/sendall调用阻塞
这篇帖子被错误地标记为“发送”,因为我无法创建新的标签。
我有一个关于这个简单回显服务器的非常基础的问题。这里有一些代码片段。
客户端
while True:
data = raw_input("Enter data: ")
mySock.sendall(data)
echoedData = mySock.recv(1024)
if not echoedData: break
print echoedData
服务器
while True:
print "Waiting for connection"
(clientSock, address) = serverSock.accept()
print "Entering read loop"
while True:
print "Waiting for data"
data = clientSock.recv(1024)
if not data: break
clientSock.send(data)
clientSock.close()
现在这个程序运行得还不错,除了当客户端发送一个空字符串(也就是在“输入数据:”提示后按回车键)时,我发现出现了一些死锁的情况。
那么,当用户在客户端按下回车键时,究竟发生了什么呢?我只能想象,sendall这个调用会一直等着有数据加入发送缓冲区,这样就导致recv这个调用也被阻塞了。这里到底发生了什么呢?
谢谢你的阅读!
1 个回答
5
更简单来说,sendall()
这个调用没有任何作用(因为没有数据要发送),所以在客户端上调用的recv()
会一直等着数据,但因为没有东西发送到服务器,服务器也就不会发送任何数据回来,因为它也在等着最开始的recv()
,这样就导致两个过程都卡住了。