使用python UDP数据包发送字符串数据的最佳方法?
前言我对python非常陌生(大约7天),但我是一名经验丰富的软件工程师。使用python UDP数据包发送字符串数据的最佳方法?
我想在运行python脚本的机器之间发送数据。我的想法(为了简化)是将数据(字符串& int)连接成一个字符串并进行解析客户端。
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的快乐,或有人建议我更好的方式发送数据?
预先感谢您。
我强烈建议在Python中使用Google Protocol Buffers作为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)
我正要为自己编写Protocol Buffers的建议! –
是的,我真的很喜欢它;使得像这样的事情序列化变得轻而易举。 – smoak
我可能会使用的json
模块序列化数据。
您需要序列化数据。 Pickle为你设计了这个功能,你可以让pickle获得数据vs二进制数据的ascii表示(参见文档),或者你可以使用json(它也为你序列化数据)都在标准库中。但是真的有十万个不同的库来处理所有的工作,从一台机器到另一台机器获取数据。我建议使用一个库。
根据速度等因素,各种图书馆有不同的权衡。在标准库中你会得到HTTP,就是这样(好的和原始的套接字)。但也有其他人。 如果超快速度比其他东西更重要......,zeroMQ或google's protocol buffers可能是有效的选项。
对我来说,我通常使用rpyc,它让我完全懒惰,只是通过网络调用其他进程。它通常足够快。
你知道UDP不能保证数据会显示在另一边,或者它会显示IN INDER。对于你的应用程序,你可能不在乎,我不知道,但只是想我会提起它。
你正在运行什么python版本,指向哪个行号(和行)。 – Serdalis