python socket.recv/sendall调用阻塞

1 投票
1 回答
5033 浏览
提问于 2025-04-15 21:04

这篇帖子被错误地标记为“发送”,因为我无法创建新的标签。

我有一个关于这个简单回显服务器的非常基础的问题。这里有一些代码片段。

客户端

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(),这样就导致两个过程都卡住了。

撰写回答