python socket.recv / sendall блокировка вызовов

1

Этот пост неправильно помечен как 'send', так как я не могу создать новые теги.

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

клиент

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

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

Теги:
sockets
send
recv

1 ответ

3
Лучший ответ

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

  • 0
    Спасибо за вашу помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню