Python:如何通过网络连接传输变长数组

5 投票
5 回答
534 浏览
提问于 2025-04-15 20:56

我需要传输一个长度不一的数组,每个元素都是两个整数的元组。举个例子:

path = [(1,1),(1,2)]
path = [(1,1),(1,2),(2,2)]

我试着用打包和解包的方法来处理这个问题,但因为数组的长度不固定,我不知道怎么创建一个格式,让发送和接收的双方都能理解。我试着把它变成一个带分隔符的字符串,比如:

msg = 1&1~1&2~
sendMsg = pack("s",msg) or sendMsg = pack("s",str(msg))

在接收端:

path = unpack("s",msg)

但这样做在这个情况下只打印出1。我还试着发送4个整数,只要不包括表示路径的额外字符串,这样发送和接收都没问题。

sendMsg = pack("hhhh",p.direction[0],p.direction[1],p.id,p.health)

在接收端:

x,y,id,health = unpack("hhhh",msg)

第一个例子是为了说明,我试着发送格式为"hhhhs",但无论如何,路径都没有正确传过来。

谢谢你的帮助。我还想看看怎么发送一个二维整数数组,但我似乎搞不清楚怎么把这些更“复杂”的结构通过网络发送出去。

谢谢你的帮助。

5 个回答

0

可以看看 xdrlib,这个可能会对你有帮助。它是Python标准库的一部分,

xdrlib模块支持外部数据表示标准,这个标准在 RFC 1014 中有详细描述,最早是由Sun Microsystems公司在1987年6月写的。它支持RFC中描述的大部分数据类型。

1

你需要一种序列化协议。twisted.spread 就提供了这样一种协议(可以查看 香蕉规范 或者 Perspective Broker 文档)。JSON 或者 协议缓冲区 是更详细的例子。

你还可以看看 数据序列化格式的比较

7

虽然你可以使用打包和解包的方法,但我建议你使用像YAMLJSON这样的格式来传输数据。

  • 打包和解包可能会导致一些难以调试的错误,如果你更改了接口,或者不同版本之间尝试互相沟通时,可能会出现不兼容的问题。
  • 使用Pickle可能会带来安全问题,而且Pickle的格式在不同的Python版本之间可能会发生变化。

从Python 2.6开始,JSON就已经包含在标准的Python发行版中了。对于YAML,你可以使用PyYAML

撰写回答