Двунаправленная связь Socket в Python - PullRequest
0 голосов
/ 13 марта 2020

Я разрабатываю два сценария для отправки файла с клиента на сервер с помощью сокета в Python. Я могу успешно отправить и получить файл как со стороны клиента, так и со стороны сервера. Теперь я хотел бы, чтобы Сервер отправил подтверждение, что весь файл был получен (Отправить простую строку). Но когда я пытаюсь получить от клиента, кажется, что программа останавливается.

Вот мой код для отправки файла и получения статуса на стороне клиента:

zip_data_file = open(zip_file_name, 'rb')
data = zip_data_file.read()
while data:
    self.sock.send(data)
    data = zip_data_file.read()
print('File sent !')
zip_data_file.close()
state = str(self.sock.recv(1024).decode())

А вот код для получения / создания файла и отправки статуса:

with open(new_file_name, 'wb') as file_created:
    data = connection.recv(1024)
    print('Receiving the file...')

    while data:
        file_created.write(data)
        data = connection.recv(1024)
print('Successfully got the file ', new_file_name)
connection.send("Done".encode())

Кто-нибудь знает, откуда это может быть или как решить эту проблему? Спасибо :)

1 Ответ

1 голос
/ 13 марта 2020
while data:
    file_created.write(data)
    data = connection.recv(1024)

Вы предполагаете, что data будет каким-то образом пустым, если клиент завершит отправку. Но единственная концепция «готово», встроенная в TCP, - это отключение соединения. Без такого выключения сервер не будет знать, что клиент завершил работу, но вместо этого будет ожидать, что клиент отправит больше данных.

Один из способов вызвать такое завершение - это close сокет. Только это закроет все соединение, и клиент не сможет получать данные с сервера. Вместо этого вы можете выполнить одностороннее отключение с помощью self.sock.shutdown(1), и в этом случае клиент сообщит, что больше не будет отправлять данные в TCP-соединении, но все же сможет получать данные с сервера:

self.sock.shutdown(1)
state = str(self.sock.recv(1024).decode())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...