Клиент отправляет данные изображения на сервер, но не предпринимает никаких действий, чтобы уведомить сервер о том, что все данные изображения были отправлены. Поскольку сервер не знает, что полный образ был получен, он все еще ждет в client_socket.recv
получения дополнительных данных. Это означает, что сервер никогда не достигает вызова client_socket.sendall
, и это означает, что клиент будет ждать в its client_socket.recv
данные, которые никогда не поступят, потому что они никогда не отправлялись.
Это работает, вроде , когда вы удаляете client_socket.recv
и последующие строки из клиента, потому что это позволяет клиентскому процессу достичь конца программы и выйти. Когда клиент выходит, его client_socket
закрывается, и это разрывает соединение с сервером. Отключение соединения приводит к тому, что сервер client_socket.recv
возвращается без данных, что вырывает сервер из while True
l oop и позволяет продолжить работу, чтобы сохранить данные, полученные ранее, а затем обработать файл изображения.
Чтобы исправить, в клиентском вызове:
client_socket.shutdown(socket.SHUT_WR)
после того, как все данные изображения были отправлены. Это может go перед break
внутри while(1)
l oop или рядом с my_stream.close
, это не имеет значения.
Это скажет серверу, что больше никаких данных не будет поступающий от клиента, но он все еще позволит сокету переносить данные в направлении сервер-клиент. Это позволит клиенту собрать ответ сервера pred
.