Senden und Empfangen von Arrays über Sockets

Ist es möglich, ein Array über UDP Sockets mit Python zu senden? Ich benutze Python 2.5 und versuche, ein einfaches Array zu senden, aber es funktioniert nicht. Es kann das Array erfolgreich senden, aber wenn ich versuche, es mit einem Element des Arrays zu drucken, stürzt das Programm ab. Ich bin mir nicht sicher, was der Fehler ist, wie ich die Vorsichtsmaßnahme der Umwandlung der Daten in ein Array, aber es funktioniert nicht. Hoffe, ich erklärte das Problem so klar wie möglich. Ich würde die Hilfe schätzen!

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

6 Solutions collect form web for “Senden und Empfangen von Arrays über Sockets”

eval macht etwas ganz anderes als das, was du denkst

Um Daten über das Netzwerk zu senden, musst du es in ein Array von Bytes serialisieren , dann es demerialisieren . In Python kann die Serialisierung der meisten Objekte über das pickle Modul erfolgen:

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

Deserialisierung:

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

Ich würde persönlich tostring und fromstring da die eingebauten Serialisierungsmethoden viele Male schneller sind und Pickle nicht NaN, Inf und andere undefinierte Werte unterstützen kann.

Du versuchst, ein Python-Objekt durch einen Sockel zu senden, es ist normal, dass es nicht funktioniert, man kann keine Objekte in einen Socket senden, Objekte sind keine Daten, sie sind die Darstellung einiger Daten in einer bestimmten Programmiersprache . Sie müssen Ihr Objekt auf Daten umsetzen und das Objekt aus den Daten auf der anderen Seite des Sockels neu erstellen. Eine Möglichkeit, dies zu tun, wäre mit dem pickle Modul.

Auf der Client-Seite "pickle" das Objekt:

 data = pickle.dumps(my_array) 

Und auf der serverseitigen Seite "entpickeln" Sie die empfangenen Daten:

 my_array = pickle.loads(received_data) 

Sie könnten versuchen, das Array zu pickle . Pickle ist eine Python-Bibliothek, um Python-Objekte zu dekodieren und zu dekodieren. Es ist in der Lage, viel mehr zu tun, aber es ist definitiv ausreichend, um Ihre Aufgabe zu erfüllen:

Auf der Absenderseite gibst du das Objekt zu einem String:

 pickled_string = pickle.dumps(a) 

Auf der empfängerseite unpickle Sie das Objekt:

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

Es ist schon eine Weile her, seit diese Frage gefragt wurde, aber ich dachte, es lohnt sich, die jsonsocket Bibliothek zu teilen. Es macht es wirklich einfach, Strings, Listen und Wörterbücher über Sockets zu senden. Es kann große Datenmengen effizient verarbeiten. Und man braucht keine manuelle Serialisierung / Deserialisierung zu machen. Unter der Kapuze werden die Daten als JSON-Strings auf dem Client serialisiert und auf dem Server deserialisiert.

Wenn Sie UDP nicht speziell benötigen, versuchen Sie es mit zmqObjectExchanger ( https://github.com/ZdenekM/zmq_object_exchanger ). Es wickelt Pickle und zmq, um Pythonobjekte über TCP zu übertragen.

  • Verwenden eines Sockels im UDP-Chat mit Threading
  • Python-UDP-Buchse halb zufällig fehlgeschlagen
  • Was ist der beste Weg, um Bit Field Manipulation in Python zu tun?
  • Senden von Datei über UDP in Fragmente unterteilt
  • Python-Binde-Fehler bei Multicast-Bindung an Windows
  • Twisted UDP zu TCP Bridge
  • Sind Datagramme immer vollständig erhalten?
  • Python asyncore UDP Server
  • Python struct.pack () für einzelne Elemente in einer Liste?
  • Get () set () memcached listening on UDP mit Python
  • In python, wie bekommt man einen UDPServer zum Herunterfahren selbst?
  • Python ist die beste Programmiersprache der Welt.