【问题标题】:Send list using socket使用套接字发送列表
【发布时间】:2018-11-04 05:45:24
【问题描述】:

我正在尝试将列表从服务器发送到客户端。 列表如下所示(它是一个 csv 文件)。

201,8,0040000080
205,8,1f421d25721e

但发送时出现此错误:

TypeError: must be string or buffer, not list

我尝试了 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,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)

【问题讨论】:

  • 您的数据需要以某种方式进行序列化。 picklejson 是两个不错的选择。
  • 或者,在处理之前发送csv文本文件。
  • python socket.sendto的可能重复

标签: arrays python-2.7 csv sockets stream


【解决方案1】:

双方需要就序列化格式达成一致。 str(line)ast.literaleval() 配对时可能会起作用,但repr(line) 将是更好的选择,因为repr 试图获得比str 更精确的表示。您还可以使用picklejson 等序列化协议。

假设这是 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')))

【讨论】:

  • 我遇到了服务器没有写完所有行的问题。原始文件有 65,000 行,输出有大约 35,000 行,什么会导致这个问题?
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 2012-04-19
  • 2021-11-19
相关资源
最近更新 更多