2011-08-18 237 views
8

是否可以通過使用Python的UDP套接字發送數組?我正在使用Python 2.5並試圖發送一個簡單的數組,但它不起作用。它可以成功發送數組,但是當我嘗試使用數組中的項目打印時,程序崩潰。我不確定錯誤是什麼,因爲我採取了將數據轉換爲數組的預防措施,但它不起作用。希望我儘可能清楚地解釋問題。我將不勝感激幫助!通過套接字發送和接收數組

# Client program 

from socket import * 
import numpy 
from array import* 

# Set the socket parameters 
host = "localhost" 
port = 21567 
buf = 4096 
addr = (host,port) 

# Create socket 
UDPSock = socket(AF_INET,SOCK_DGRAM) 

def_msg = "===Enter message to send to server==="; 
print "\n",def_msg 
a = array('i',[1,3,2]) 
# Send messages 
while (1): 
    data = raw_input('yes or now') 
    if data!= "yes": 
     break 
    else: 
     if(UDPSock.sendto(a,addr)): 
      print "Sending message" 

# Close socket 
UDPSock.close() 



# Server program 

from socket import * 

# Set the socket parameters 
host = "localhost" 
port = 21567 
buf = 4096 
addr = (host,port) 

# Create socket and bind to address 
UDPSock = socket(AF_INET,SOCK_DGRAM) 
UDPSock.bind(addr) 

# Receive messages 
while 1: 
    data,addr = UDPSock.recvfrom(buf) 
    L = eval(data) 
    if not data: 
     print "Client has exited!" 
     break 
    else: 
     print "\nReceived message '", L[1],"'" 

# Close socket 
UDPSock.close() 

回答

14

eval正在做一些完全不同的比你想象的要多。

要通過網絡發送數據,則需要連載成字節數組,然後反序列化回來。在Python中,大多數對象的序列化可以通過pickle模塊來完成:

if (UDPSock.sendto(pickle.dumps(a), addr)): 

反序列化:

data,addr = UDPSock.recvfrom(buf) 
L = pickle.loads(data) 
print repr(L) # prints array('i', [1, 3, 2]) 
+2

This Works,Thank you! – dawnoflife

3

你可以試試pickle這個數組。 Pickle是一個Python庫,用於編譯和解碼python對象。它能夠做更多的事情,但它絕對是足以滿足你的任務:發送側

pickle對象爲字符串:

pickled_string = pickle.dumps(a) 

在接收端你unpickle對象:

a = pickle.loads(received_string) 
# a is now your sent array 
3

你試圖通過套接字發送一個Python對象,這是正常的,這是行不通的,你不能在一個插座發送對象,對象不是數據,他們的表現一些給定的編程語言中的數據。您需要將您的對象「翻譯」爲數據,並從另一個套接字端的數據重新創建對象。一種方法是使用pickle模塊。

在客戶端,你 「泡菜」 的對象:

data = pickle.dumps(my_array) 

而在服務器端,你 「unpickle」 接收到的數據:

my_array = pickle.loads(received_data) 
+0

我只能接受1個答案,但是謝謝你的回覆! – dawnoflife

6

我會親自使用tostringfromstring因爲內置的序列化方法是many times faster和鹹菜may not support的NaN ,Inf和其他未定義的值。

+1

'pickle'發送numpy數組非常糟糕,絕對可怕。 Picke依賴於平臺,發送numpy數組的效率非常低,numpy在模塊中提供了很好的序列化支持,比如'tostring'和'fromstring',但這些都是複製方法。我已經實施的最好的解決方案是使用Cython。 – lukecampbell

1

自問這個問題已經有一段時間了,但我認爲值得分享jsonsocket library。它使得通過套接字發送字符串,列表和字典變得非常簡單。它可以高效地處理大量的數據。而且您不需要執行任何手動序列化/反序列化。在引擎蓋下,它將數據序列化爲客戶端上的JSON字符串,並在服務器上對其進行反序列化。

+1

這是一個非常好的圖書館。它爲我節省了很多時間和精力! – Anton

相關問題