Получать файлы и сохранять их на сокете Python - PullRequest
0 голосов
/ 27 сентября 2019

Мой сервер отправляет серию файлов с такими именами, как file_1, file_2 и так далее.Сокет отправки работает хорошо, и я проверил эти файлы все правильно.

Сервер - отправка файлов

f = open(new_filename, 'rb')
            start_ts = ts
            seconds += 1
            try:
                print('Sending %s' % new_filename)
                conn.sendall(f.read(99999999))
                f.flush()
                f.close()
            except socket.error:
                if errno == errno.ECONNREFUSED:
                    print(os.strerror(socket.error.errno))
                else:
                    raise
                print('Send failed')
                sys.exit()

Здесь, на стороне клиента, я хочу получить эти файлы и сохранить их так, как это было на сервере (save_1, save_2, ...) на моем компьютере.

Клиент - получить файлы и попытаться сохранить их

try:
        client.send(b'Receiving Data...\n')
        while True:
            save_filename = 'savefolder/save_%i.pcap' % file_index
            f = open(save_filename, 'wb')
            data = client.recv(99999999)
            f.write(data)
            reply = b'Message Received.\n'
            if not data:
                break
            client.sendall(reply)
            f.close()
            file_index += 1
    except socket.timeout:
        print('Done receiving.', end=' ')
        client.close()
        print('Client socket is closed')
  1. Но сохраненные файлы выглядят странно,Когда сервер отправляет один файл размером 3755 КБ, клиент записывает два файла размером 192 КБ и 3,563 КБ.Хуже, чем больше сбой.можно ли это исправить?Я не знаю, почему это происходит здесь с моим кодом.
  2. Это единственный способ ввести значение 99999999, чтобы получить весь файл без обрезки?
  3. Почему мой клиент не отправляет сообщениесервер, хотя я написал там какой-то код?

1 Ответ

0 голосов
/ 27 сентября 2019

TCP не протокол, основанный на сообщениях, а протокол потока байтов.Не существует фиксированной связи между тем, сколько было send или sendall и сколько читается при recv.

Чтобы отправить несколько сообщений (файлов) по одному и тому же соединению, вы должны определить некоторый прикладной протокол, который четко определяет, где сообщения начинаются и заканчиваются.И альтернативой может быть использование нового TCP-соединения для каждого файла и чтение до тех пор, пока recv не вернет '', т.е. покажет, что другой сайт закрыл соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...