2010-03-31 3 views
1

Это сообщение неверно помечено как 'send', так как я не могу создать новые теги.python socket.recv/sendall call blocking

У меня есть очень простой вопрос об этом простом эхо-сервере. Вот некоторые фрагменты кода.

клиент

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 блокируется по очереди. Что тут происходит?

Спасибо за чтение!

ответ

3

Больше вроде бы, sendall() вызова ничего не делает (так как нет никаких данных для передачи), и таким образом recv() вызова на клиенте блокирует ожидание данных, но так как ничего не было отправлено на сервер, сервер никогда не посылает любой данных, так как он также заблокирован на его начальном recv(), и поэтому оба процесса блокируются.

+0

благодарит за вашу помощь! – fsm