【问题标题】:A set object has no attribute 'encode' in socket module设置对象在套接字模块中没有属性“编码”
【发布时间】:2018-10-22 15:19:05
【问题描述】:

我尝试对一个 set 对象进行编码,但它失败了,并声明了一个 AttributeError 代码。 有没有办法让它工作?

注意:我一直在使用 socket 模块。

albums = set()
for key, val in data.items():
    albums.add(val['album'])
msg = albums.encode()

【问题讨论】:

  • 只有在套接字的另一端有另一个程序时,发送到套接字才有意义。那个程序是什么?它期望数据采用什么格式?没有标准格式来发送集合;如果其他程序也是你写的,可以考虑pickling集合。
  • 我正在尝试使用 socket 模块创建一个本地主机“服务器”,另一端使用类似的 server_msg.decode() 方法接收消息。
  • 这根本不回答前面的评论。它试图告诉您套接字需要一个字节序列,并且没有将集合转换为字节的通用标准序列化;所以编码和解码都没有明确定义。您必须在两端提出自己的序列化格式。
  • val['album']的类型是什么?

标签: python sockets encode


【解决方案1】:

您是否尝试通过套接字发送albums 的某种形式的表示?然后,您首先需要该对象的二进制表示。使用.encode() 表明您需要albumns 的字符串表示,您可以使用msg = repr(albums).encode() 获得。

【讨论】:

    【解决方案2】:

    这里有几个选项,但可能最简单的方法是使用 Python pickle 协议对字典进行编码。

    为此,请像这样使用发送代码:

    import pickle
    data_to_send = pickle.dumps(albums)
    mysocket.send(data_to_send)
    

    和接收代码像这样:

    import pickle
    albums = pickle.loads(data_received_from_socket)
    

    但是,我想警告您:使用socket 模块根本就是一罐蠕虫。它是低级的,适用于有经验的程序员。与您刚刚提出的问题相比,您必须处理的其他问题可能要困难得多。例如,您必须先考虑how to delimit your messages,然后才能确定将什么作为第二个参数传递给socket.recv(bufsize 参数)。

    我建议你尝试一些更高级别的东西,比如 Python 的 xmlrpc 模块。

    【讨论】:

      猜你喜欢
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 2016-11-09
      • 2013-05-31
      • 1970-01-01
      相关资源
      最近更新 更多