2011-10-31 46 views
0

前言我對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

回答

1

我強烈建議在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

1

我可能會使用的json模塊序列化數據。

0

您需要序列化數據。 Pickle爲你設計了這個功能,你可以讓pickle獲得數據vs二進制數據的ascii表示(參見文檔),或者你可以使用json(它也爲你序列化數據)都在標準庫中。但是真的有十萬個不同的庫來處理所有的工作,從一臺機器到另一臺機器獲取數據。我建議使用一個庫。

根據速度等因素,各種圖書館有不同的權衡。在標準庫中你會得到HTTP,就是這樣(好的和原始的套接字)。但也有其他人。 如果超快速度比其他東西更重要......,zeroMQgoogle's protocol buffers可能是有效的選項。

對我來說,我通常使用rpyc,它讓我完全懶惰,只是通過網絡調用其他進程。它通常足夠快。

你知道UDP不能保證數據會顯示在另一邊,或者它會顯示IN INDER。對於你的應用程序,你可能不在乎,我不知道,但只是想我會提起它。