Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python UDP数据包发送字符串数据的最佳方法?_Python_String_Sockets_Udp - Fatal编程技术网

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

使用python UDP数据包发送字符串数据的最佳方法?,python,string,sockets,udp,Python,String,Sockets,Udp,在前言中,我对python非常陌生(大约7天),但我是一名经验丰富的软件工程本科生 我想在运行python脚本的机器之间发送数据。我的想法(为了简化事情)是将数据(字符串和int)连接成一个字符串,并在客户端进行解析 UDP数据包以简单的字符串漂亮地发送,但当我试图发送有用的数据时,python总是抱怨我发送的数据;具体来说,python不允许我连接元组 为了解析客户端上的数据,我需要用破折号分隔数据:'-' nodeList是dictionary类型,其中键是字符串,值是double ran

在前言中,我对python非常陌生(大约7天),但我是一名经验丰富的软件工程本科生

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

UDP数据包以简单的字符串漂亮地发送,但当我试图发送有用的数据时,python总是抱怨我发送的数据;具体来说,python不允许我连接元组

  • 为了解析客户端上的数据,我需要用破折号分隔数据:'-'
  • nodeList是dictionary类型,其中键是字符串,值是double

    randKey = random.choice( nodeList.keys() )
    data = str(randKey) +'-'+ str(nodeList[randKey])
    mySocket.sendto ( data , address ) 
    
上述代码产生以下错误:

TypeError:强制使用Unicode:需要字符串或缓冲区,找到元组

我不明白为什么它认为这是我试图连接的元组

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

请提前感谢。

我强烈建议您使用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 ) 

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

您需要序列化数据。Pickle为您内置了这一功能,您可以要求Pickle提供数据与二进制数据的ascii表示形式(参见文档),或者您可以使用json(它还为您序列化数据),两者都在标准库中。但实际上有十万个不同的库为您处理所有的工作,从一台机器到另一台机器获取数据。我建议使用图书馆

根据速度等因素,不同的库有不同的权衡。在标准库中,您可以获得HTTP,仅此而已(以及原始套接字)。但是还有其他的。 如果超高速比其他东西更重要,或者可能是有效的选择

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


您知道,UDP不能保证数据会在另一端显示,或者它会按顺序显示。对于你的申请,你可能不在乎,我不知道,但我想我会提出来的

您运行的是哪一个python版本,错误指向的行号(和行数)是什么。我正要自己写一个协议缓冲区的建议!是的,我真的很喜欢它;使像这样的序列化变得轻而易举。