使用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的快乐,或有人建议我更好的方式发送数据?

预先感谢您。

+0

你正在运行什么python版本,指向哪个行号(和行)。 – Serdalis

我强烈建议在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) 
+0

我正要为自己编写Protocol Buffers的建议! –

+0

是的,我真的很喜欢它;使得像这样的事情序列化变得轻而易举。 – smoak

我可能会使用的json模块序列化数据。

您需要序列化数据。 Pickle为你设计了这个功能,你可以让pickle获得数据vs二进制数据的ascii表示(参见文档),或者你可以使用json(它也为你序列化数据)都在标准库中。但是真的有十万个不同的库来处理所有的工作,从一台机器到另一台机器获取数据。我建议使用一个库。

根据速度等因素,各种图书馆有不同的权衡。在标准库中你会得到HTTP,就是这样(好的和原始的套接字)。但也有其他人。 如果超快速度比其他东西更重要......,zeroMQgoogle's protocol buffers可能是有效的选项。

对我来说,我通常使用rpyc,它让我完全懒惰,只是通过网络调用其他进程。它通常足够快。

你知道UDP不能保证数据会显示在另一边,或者它会显示IN INDER。对于你的应用程序,你可能不在乎,我不知道,但只是想我会提起它。