so senden Sie Objekte über python?
Ich habe einen server:
import socket
import time
import random
from PIL import ImageGrab
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1',8820))
server_socket.listen(1)
while True:
print "Waiting for commands"
a = ImageGrab.grab()
CommandDict = {"TIME" : time.strftime("%a %b %d %H:%M:%S %Y"),"NAME": "Ori","RANDOM": str(random.randint(0,10)),"EXIT":"BYE","PRINT SCREEN":a}
(client_socket, client_address) = server_socket.accept()
client_data = client_socket.recv(1024)
print "GOT COMMAND FROM " + client_address[0] + " : " + client_data
client_socket.send(CommandDict[client_data])
client_socket.close()
server_socket.close()
und Kunde:
import socket
from PIL import ImageGrab
while True:
client_input = raw_input("Enter You Command: ")
CommandList=["EXIT","TIME","NAME","RANDOM","PRINT SCREEN"]
if client_input in CommandList:
my_socket=socket.socket()
my_socket.connect(('127.0.0.1',8820))
my_socket.send(client_input)
data = my_socket.recv(1024) + "\n"
if client_input=="PRINT SCREEN":
data.save()
else:
print "SERVER: " + data
else:
print "Invalid command. try one of those: " + " , ".join(CommandList) + "\n" + "."
my_socket.close()
Wenn ich versuche, diese es gibt mir einen Fehler, weil es versucht, senden Sie es als ein string-Objekt.
Ich möchte ein Objekt senden über socket und ich will der Kunde, es zu Lesen. Irgendwelche Ideen?
- Welche Art von Objekt? Zeigen Sie uns den client-code.
- In diesem server ist es ein image-Objekt aber ich möchte wissen, einen Weg, um senden Sie alle Arten von Objekten.
- Sie müssen serialisiert die Objekte, bevor Sie Sie senden. Auf der Empfängerseite der Wiederherstellung der Objekte.
- Haben Sie einen Blick auf docs.python.org/2/library/pickle.html#module-pickle
- Sie können senden Sie Sie per Serialisierung in JSON-format. Siehe Making-Objekt JSON serialisierbar mit regelmäßigen encoder.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Python enthält ein Objekt-Serialisierung-Modul namens
pickle
: https://docs.python.org/2/library/pickle.htmlKönnen Sie
pickle.dumps(CommandDict[client_data])
zu produzieren, die eine Zeichenfolge, die können Sie dann schicken Sie auf eine Buchse. Dann nutzen Siepickle.loads
zur Wiederherstellung des Objekts auf der anderen Seite. Dies erfordert natürlich, dass das Objekt "pickleable", aber viele einfache Datenstrukturen sind, oder kann man so ohne viel Mühe. In Ihrem Fall, dass Sie kann müssen code hinzufügen, um Gurke dieImageGrab
Objekt-Typ, aber versuchen Sie es zuerst und sehen, ob es funktioniert standardmäßig.f = my_socket.makefile(); pickle.dump(CommandDict[client_data], f)
.pickle
verwendet wird, muss der server Zugriff auf den source-code für das eingelegte Objekt(en), um rekonstruieren zu können oder Sie wieder in Ihrer ursprünglichen form.Folgende sollte Ihnen ermöglichen, Gurke ein Bild. Ich habe keine PIL auf meiner aktuellen Maschine, damit ich nicht in der Lage, um es richtig zu testen. Die Maschine
In meinem code habe ich verwendet
dumps
undloads
zu erstellen und verwenden Sie eine string-Repräsentation der Daten. Idealerweise sollten Sie mit Hilfedump
undload
vorbeimy_socket.makefile()
als Datei-argument.