Отправить список с помощью сокета - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь отправить список с сервера на клиент.Список выглядит так (это файл csv).

201,8,0040000080
205,8,1f421d25721e

, но при отправке я получаю эту ошибку:

TypeError: must be string or buffer, not lis t

Я пробовал 2 варианта:

  1. Итерация по списку и отправка каждой строки на сервер, но в результате это получается:

    201 ---> 2,0,1

  2. Попробовал приведение каждой строки, например, str (line), а затем отправил ее, но получил это:

    201,8,0040000080 --> [, ', 2,0,1,', ",",, ', 8,', ",",, ', 0,0,4,0,0,0,0,0,8,8, 0, ',]

как я могу решить эту проблему?Я просто хочу отправить данные с клиента на сервер как есть.Для записи, код клиента:

    import socket
    import csv

    clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    with open('can_data.csv', 'rb') as csv_file:
        csv_reader = csv.reader(csv_file)
        for line in csv_reader:
                clientSock.sendto(str(line), (self.address, self.port))

код сервера:

      with open('output.csv', 'wb') as new_file:
        csv_writer = csv.writer(new_file)

        while True:
            data, addr = s.recvfrom(1024)
            csv_writer.writerow(data)

1 Ответ

0 голосов
/ 25 мая 2018

Обе стороны должны согласовать формат сериализации.str(line) может работать в паре с ast.literaleval(), но repr(line) будет лучшим выбором, так как repr пытается получить более точное представление, чем str.Вы также можете перейти к протоколу сериализации, например pickle или json.

Предполагая, что это Python 3, я также переместил csv в текст и использовал кодировку utf-8 на проводе.

клиент:

import socket
import csv

address = 'localhost'
port = 5555

clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
with open('can_data.csv', 'r') as csv_file:
    csv_reader = csv.reader(csv_file)
    for line in csv_reader:
        clientSock.sendto(repr(line).encode('utf-8'), (address, port))

сервер:

import socket
import csv
import ast

address = 'localhost'
port = 5555

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((address, port))

with open('output.csv', 'w') as new_file:
    csv_writer = csv.writer(new_file)

    while True:
        data, addr = sock.recvfrom(1024)
        csv_writer.writerow(ast.literal_eval(data.decode('utf-8')))
...