使用python UDP数据包发送字符串数据的最佳方法?

时间:2011-10-31 19:52:35

标签: python string sockets udp

前言我是python的新手(大约7天),但我是一个经验丰富的软件英特尔。

我想在运行python脚本的机器之间发送数据。我(为了简化事情)的想法是将数据(字符串和插入)连接成一个字符串并进行解析客户端。

UDP数据包使用简单的字符串发送精美,但当我尝试发送有用的数据时,python总是抱怨我发送的数据;特别是python不会让我连接元组。

  • 为了解析客户端上的数据,我需要用短划线字符分隔数据:' - '。
  • nodeList是字典类型,其中键是字符串,值是double。

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

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

  

TypeError:强制转换为Unicode:需要字符串或缓冲区,找到元组

我不明白为什么它认为它是我想要连接的元组...

所以我的问题是如何纠正这一点以保持Python的满意度,或者有人建议我更好地发送数据?

提前谢谢。

3 个答案:

答案 0 :(得分:1)

我强烈建议使用Google Protocol Buffers在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 ) 

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您需要序列化数据。 Pickle为你内置了这个,你可以向pickle询问数据与二进制数据的ascii表示(参见文档),或者你可以使用json(它也为你序列化数据)都在标准库中。但实际上有十万个不同的库可以处理所有工作,从一台机器到另一台机器获取数据。我建议使用一个库。

根据速度等,各种库有不同的权衡。在标准库中,您可以获得HTTP,即它(井和原始套接字)。但还有其他人。  如果超快速度比其他东西更重要...... zeroMQgoogle's protocol buffers可能是有效选项。

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

您知道UDP无法保证数据会在另一方显示,或者它会显示在IN ORDER中。对于你的应用你可能不在乎,我不知道,但只是想我会提出来。