2011-08-18 29 views
8

È possibile inviare un array tramite UDP Sockets utilizzando Python? Sto usando Python 2.5 e sto provando a inviare un array semplice ma non funziona. Può inviare correttamente l'array ma quando provo a stamparlo con un elemento dell'array il programma si blocca. Non sono sicuro di quale sia l'errore, perché prendo la precauzione di convertire i dati in un array ma non funziona. Spero di aver spiegato il problema nel modo più chiaro possibile. Apprezzerei l'aiuto!Invio e ricezione di array tramite socket

# 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() 

risposta

14

eval sta facendo qualcosa di completamente diverso di quello che pensi.

per inviare i dati sulla rete, è necessario serializzare in un array di byte, quindi deserializzare indietro. In Python, la serializzazione di maggior parte degli oggetti può essere fatto tramite pickle modulo:

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

deserializzazione:

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

Funziona, grazie! – dawnoflife

3

Si può provare a pickle la matrice. Pickle è una libreria python per en- e decodificare gli oggetti python. E 'in grado di fare molto di più, ma è sicuramente sufficiente a soddisfare il vostro compito:

sul lato del mittente si pickle l'oggetto in una stringa:

pickled_string = pickle.dumps(a) 

sul lato ricevitore unpickle l'oggetto:

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

si sta cercando di inviare un oggetto Python attraverso una presa di corrente, è normale che non funziona, non è possibile inviare gli oggetti in una presa di corrente, gli oggetti non sono dati, sono la rappresentazione di alcuni dati in un determinato linguaggio di programmazione. Devi "tradurre" il tuo oggetto in dati e ricreare l'oggetto dai dati sul lato dell'altro socket. Un modo per farlo sarebbe con il modulo pickle.

Sul lato client, è "salamoia" l'oggetto:

data = pickle.dumps(my_array) 

E sul lato server, è "la deserializzazione" i dati ricevuti:

my_array = pickle.loads(received_data) 
+0

Posso accettare solo 1 risposta ma grazie per la risposta! – dawnoflife

6

Io personalmente usare tostring e fromstring poiché il built-in metodi di serializzazione sono many times faster e sottaceto may not support NaN , Inf e altri valori indefiniti.

+1

'pickle' è terribile per l'invio di array numpy, assolutamente terribile. Picke è dipendente dalla piattaforma, è estremamente inefficiente per l'invio di array numpy e numpy ha un supporto di serializzazione davvero buono nel modulo come 'tostring' e' fromstring', ma questi sono metodi di copia. Le migliori soluzioni che ho implementato hanno utilizzato Cython. – lukecampbell

1

È passato un po 'di tempo da quando è stata posta questa domanda, ma ho pensato che valesse la pena condividere lo jsonsocket library. Semplifica l'invio di stringhe, elenchi e dizionari tramite socket. Può gestire grandi quantità di dati in modo efficiente. E non è necessario eseguire alcuna serializzazione/deserializzazione manuale. Sotto il cofano, serializza i dati come stringhe JSON sul client e lo deserializza sul server.

+1

È una libreria molto buona. Mi ha risparmiato un sacco di tempo e sforzi cerebrali! – Anton

Problemi correlati