【问题标题】:python 2.7 socket communication with jsonpython 2.7套接字与json通信
【发布时间】:2020-07-15 07:35:57
【问题描述】:

我想通过套接字发送/接收数据。

我因为 ROS(melodic) 而使用 python 2.7,也因为 tensorflow 而使用 python 3.6。

dict 数据,例如{'key_name':[[1,2,3],[4,5,6]]},使用JSONEncoder.encoder() 发送和编码。
客户端收到loads()的json数据并重新发送给服务器。
客户端使用python 2.7,服务端使用python 3.6

def _send(socket, send_data):
    json_data = json.JSONEncoder().encode(send_data)
    socket.sendall(json_data)

def _recv(socket):
    recv_data = socket.recv(BUFSIZE)
    json_data = json.loads(recv_data, encoding="utf-8")

    return json_data

我有错误

  File "/usr/lib/python3.6/json/deoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 4097 (char 4096)

我需要一个可在 python 2.7 和 3.6 上运行的 python 代码。

【问题讨论】:

  • 你怎么知道响应只有4096字节?
  • 这个答案stackoverflow.com/questions/61006696/… 似乎证实了@user207421 的建议。你应该检查你的 json 输出,并确保你没有因为 BUFSIZE 太小而切断任何数据。

标签: python json python-2.7 sockets


【解决方案1】:

错误来自 json 解码器。

json_data = json.loads(recv_data, encoding="utf-8"),

当您的 json 数据(在您的情况下为 recv_data)格式不正确时,这是正常的。通常缺少逗号“,”或其他内容。 对于调试,我建议您转储服务器收到的数据,然后再使用json.loads()

【讨论】:

  • 你说得对。我认为它可能不是格式错误的 json,而是 BUFSIZE 不够大。
  • @Simon 是的。转储输出是确认的方式
  • 我已经厌倦了你的回答,但它对我不起作用。所以我改变了库 msgpack。对我来说看起来不错。谢谢
猜你喜欢
  • 2011-10-12
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 2017-08-03
相关资源
最近更新 更多