Прочитать любой файл в двоичном режиме, добавить его в строку и отправить через сокет TCP - PullRequest
0 голосов
/ 05 октября 2018

Итак, я должен отправить определенное сообщение на сервер (который уже существует).

Этот запрос соответствует следующему формату:

DO dirname number_of_files [file_size file_name file_data]*

, например, это может быть что-то вроде этого:

DO dir 2 1421 house.png [binary data I assume?] 1239 info.txt [more binary data?]

Как видите, файлов может быть сколько угодно.

Итак, я создал строку, в которую я добавляю всю информацию и в конце посылаювсе вместе, но я застрял в части данных.

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(ip, port)
request = "DO " + directory + " " + str(number_of_files)

for file_number in range(0,number_of_files):
    data = open("./" + directory + "/" + files_info[file_number*2], 'rb').read()
    client_request += " " + " ".join(files_info[file_number*2 : 1 + file_number*2]) + " " + data

s.send((request + "\n").encode())

Это не работает, потому что я пытаюсь добавить данные, которые являются двоичными, в строку (TypeError: must be str, not bytes).Я пытался использовать .decode () перед добавлением, но получаю ошибку декодера utf-8 (UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte).Я попробовал с utf-16 и ascii, и это тоже не сработало.

Должен ли я обращаться с этим по-другому?Я сделал больше таких запросов, но ни один из них не включал данные из файлов, только цифры / строки, поэтому раньше проблем не было.

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

1 Ответ

0 голосов
/ 05 октября 2018

Вот мой простой рабочий код, чтобы получить что-то близкое к тому, что вы хотите:

import socket

ip = '192.168.10.137'
port = 4043

directory = 'C:/123/'

#with open('1.dat', 'wb') as file:
#    file.write(b'\x00\x01\x1a\xa1')
#with open('2.dat', 'wb') as file:
#    file.write(b'\x00\x01\x00\x00')

file_info = ['1.dat', '2.dat']

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:

    sock.connect((ip, port))

    sock.send(
        'DO {} {}'.format(directory, len(file_info)).encode('UTF-8'))

    for filename in file_info:
        with open(filename, mode='rb') as file:
            data = file.read()
        sock.send(
            ' {} '.format(len(data)).encode('UTF-8'))
        sock.send(
            '{} '.format(filename).encode('UTF-8'))
        sock.send(data)

Данные, полученные сервером (байты):

b'DO C:/123/ 2 4 1.dat \x00\x01\x1a\xa1 4 2.dat \x00\x01\x00\x00'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...