使用Python UDP报文发送字符串数据的最佳方式是什么?

0 投票
3 回答
3390 浏览
提问于 2025-04-17 05:22

首先,我刚学Python不久(大约7天),但我是一名有经验的软件工程本科生。

我想在运行Python脚本的机器之间发送数据。为了简化这个过程,我的想法是把数据(字符串和整数)拼接成一个字符串,然后在客户端进行解析。

使用UDP包发送简单字符串时一切都很顺利,但当我尝试发送有用的数据时,Python总是抱怨我发送的数据;具体来说,Python不允许我拼接元组。

  • 为了在客户端解析数据,我需要用一个破折号字符 '-' 来分隔数据。
  • nodeList是一个字典类型,其中键是字符串,值是一个双精度浮点数。

    randKey = random.choice( nodeList.keys() )
    data = str(randKey) +'-'+ str(nodeList[randKey])
    mySocket.sendto ( data , address ) 
    

上面的代码产生了以下错误:

TypeError: coercing to Unicode: need string or buffer, tuple found

我不明白为什么它认为我试图拼接的是一个元组...

所以我的问题是,如何才能纠正这个问题,让Python不再抱怨,或者有没有人能建议我更好的发送数据的方法?

提前谢谢你们。

3 个回答

0

你需要把数据进行序列化。Python里面有个叫Pickle的工具,可以帮你完成这个工作。你可以让Pickle把数据转成ASCII格式(就是一种文本格式)或者二进制格式(就是计算机能直接理解的格式,具体可以查文档),另外你也可以使用json(它同样可以帮你序列化数据),这两个工具都是Python自带的库。不过其实有很多其他的库可以帮你处理从一台机器到另一台机器的数据传输,建议你使用这些库。

不同的库在速度等方面有不同的优缺点。在Python的标准库里,你可以使用HTTP,差不多就这些(还有原始套接字)。但还有其他选择。如果你需要超快的速度,zeroMQ或者谷歌的协议缓冲区可能是不错的选择。

对我来说,我通常使用rpyc,它让我可以很懒惰,只需要通过网络调用另一个进程。通常速度也足够快。

你知道UDP协议并不能保证数据一定会在另一端出现,或者说数据的顺序是正确的。对于你的应用来说,你可能不在乎这些,我也不太清楚,但我觉得有必要提一下。

1

我可能会使用 json 模块来把数据转换成一种可以存储或传输的格式。

1

我强烈建议你使用Google的协议缓冲区,在Python中可以用protobuf来实现。这种方式可以在数据传输的两端处理数据的序列化。它有Python的接口,这样你就可以很方便地和你现有的Python程序一起使用。

根据你的示例代码,你需要创建一个.proto文件,格式如下:

message SomeCoolMessage {
    required string key = 1;
    required double value = 2;
}

然后在生成之后,你可以这样使用它:

randKey = random.choice( nodeList.keys() )
data = SomeCoolMessage()
data.key = randKey
data.value = nodeList[randKey]
mySocket.sendto ( data.SerializeToString() , address ) 

撰写回答