s.send
- это , а не гарантированно отправляет каждый предоставленный вами байт; используйте s.sendall
вместо.
Точно так же s.recv
- это , а не , гарантированно получит каждый запрашиваемый байт - в этом случае вам нужно узнать другими способами, сколько именно байтов вам нужно получить (например, отправьте сначала длину из строки, которую вы отправляете, закодированной с помощью модуля struct
), и вы несете ответственность за выполнение цикла для этой цели. Не существует и не может быть recvall
, потому что потоковые сокеты не в любом случае являются "самоограничивающимися" - это просто потоки, разбитые на совершенно произвольные пакеты размеров, не имеющие семантической значимости.
Вы никогда не должны получать EOF
от самого recv
, хотя, конечно, вы можете ожидать получить его в строке, которую вы закомментировали, от pickle.loads
(поскольку его аргумент вполне может быть только часть байтов, отправленных контрагентом: как объяснено в предыдущем абзаце).