2011-08-18 19 views
8

¿Es posible enviar una matriz a través de sockets UDP utilizando Python? Estoy usando Python 2.5 e intento enviar una matriz simple pero no está funcionando. Puede enviar la matriz con éxito, pero cuando intento imprimirla con un elemento de la matriz, el programa falla. No estoy seguro de cuál es el error, ya que tomo la precaución de convertir los datos en una matriz, pero no está funcionando. Espero haber explicado el problema lo más claramente posible. ¡Apreciaría la ayuda!Enviar y recibir matrices mediante sockets

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

Respuesta

14

eval está haciendo algo completamente diferente de lo que piensas

Para enviar datos a través de la red, es necesario serializar en una matriz de bytes, a continuación, deserializar de nuevo. En Python, la serialización de la mayoría de los objetos se puede hacer a través de pickle módulo:

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

Deserialización:

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

Esto funciona, ¡Gracias! – dawnoflife

3

Se podría tratar de pickle la matriz. Pickle es una biblioteca de python para en- y decodificar objetos de pitón. Es capaz de hacer mucho más, pero definitivamente es suficiente para cumplir con su tarea:

en el lado del remitente que pickle el objeto en una cadena:

pickled_string = pickle.dumps(a) 

en el lado receptor le unpickle del objeto:

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

usted está tratando de enviar un objeto de Python a través de un conector, esto es normal que no funciona, no se puede enviar objetos en una toma de corriente, no son objetos de datos, que son la representación de algunos datos en un lenguaje de programación dado. Necesita "traducir" su objeto a datos y volver a crear el objeto a partir de los datos del otro lado del zócalo. Una forma de hacerlo sería con el módulo pickle.

En el lado del cliente, "salmuera" del objeto:

data = pickle.dumps(my_array) 

Y en el lado del servidor, los datos recibidos "unpickle":

my_array = pickle.loads(received_data) 
+0

¡Solo puedo aceptar 1 respuesta, pero gracias por su respuesta! – dawnoflife

6

me gustaría utilizar personalmente tostring y fromstring ya que el NaN los métodos incorporados de serialización son many times faster y pepinillo may not support , Inf y otros valores indefinidos.

+1

'pickle' es terrible para el envío de matrices numpy, absolutamente terrible. Picke depende de la plataforma, es extremadamente ineficiente para enviar matrices numpy y numpy viene con un soporte de serialización realmente bueno en el módulo como 'tostring' y' fromstring', pero estos son métodos de copia. Las mejores soluciones que he implementado han sido el uso de Cython. – lukecampbell

1

Ha pasado un tiempo desde que se hizo esta pregunta, pero pensé que valía la pena compartir el jsonsocket library. Hace que sea muy fácil enviar cadenas, listas y diccionarios a través de sockets. Puede manejar grandes cantidades de datos de manera eficiente. Y no necesita hacer ninguna serialización/deserialización manual. Bajo el capó, serializa los datos como cadenas JSON en el cliente, y lo deserializa en el servidor.

+1

Es una muy buena biblioteca. ¡Me ahorró mucho tiempo y esfuerzos cerebrales! – Anton

Cuestiones relacionadas