Enviando y recibiendo arrays vía Sockets

¿Es posible enviar una matriz a través de UDP Sockets usando Python? Estoy usando Python 2.5 e bash enviar una matriz simple pero no funciona. Puede enviar la matriz con éxito, pero cuando bash imprimirla con un elemento de la matriz, el progtwig 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 funciona. Espero haber explicado el problema lo más claramente posible. ¡Apreciaría la ayuda!

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

eval está haciendo algo completamente diferente de lo que piensas.

Para enviar datos a través de la red, debe serializarlos en una matriz de bytes y luego volver a deserializarlos . En Python, la serialización de la mayoría de los objetos se puede realizar a través del módulo pickle :

 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]) 

Personalmente usaría el uso de tostring y fromstring ya que los métodos de serialización incorporados son muchas veces más rápidos y es posible que Pickle no admita NaN, Inf y otros valores no definidos.

Está intentando enviar un objeto python a través de un socket, es normal que no funcione, no puede enviar objetos en un socket, los objetos no son datos, son la representación de algunos datos en un lenguaje de progtwigción determinado. . Debe “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, usted “escurre” el objeto:

 data = pickle.dumps(my_array) 

Y en el lado del servidor, usted “elimina” los datos recibidos:

 my_array = pickle.loads(received_data) 

Podrías tratar de pickle la matriz. Pickle es una biblioteca de python para codificar y decodificar objetos de python. Puede hacer mucho más, pero definitivamente es suficiente para cumplir su tarea:

en el lado del remitente, usted pickle el objeto en una cadena:

 pickled_string = pickle.dumps(a) 

en el lado del receptor se unpickle del objeto:

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

Ha pasado un tiempo desde que se hizo esta pregunta, pero creo que vale la pena compartir la biblioteca jsonsocket . Facilita el envío de cadenas, listas y diccionarios a través de sockets. Puede manejar grandes cantidades de datos de manera eficiente. Y no es necesario realizar ninguna serialización / deserialización manual. Bajo el capó, serializa los datos como cadenas JSON en el cliente y los deserializa en el servidor.

Si no necesita UDP específicamente, intente zmqObjectExchanger ( https://github.com/ZdenekM/zmq_object_exchanger ). Envuelve pickle y zmq para transferir objetos python a través de TCP.