ich arbeite zur zeit an einem server-client-programm, bei dem ich die daten mit socket.makefile() und dem pickle-modul verschicke, da ich nicht nur strings, sondern auch objekte eigener klassen verschicken möchte.
zunächst hat alles wunderbar funktioniert, doch dann bin ich auf folgendes problem gestoßen:
wenn der server erneut daten sendet, bevor der client das vorherige datenpaket abgearbeitet und bereit für neue daten ist, dann bleiben diese neuen daten irgendwo auf der strecke...jedenfalls bleibt der client dann beim empfangsbefehl hängen, bis der server wieder etwas sendet. im umgekehrten fall, also wenn der client an den server sendet, tritt genau das gleiche problem auf.
ich habe das ganze mal auf das wesentliche reduziert...ich denke man versteht dann besser was ich meine:
Code: Alles auswählen
###funcs.py
import pickle
address = ('localhost', 8000)
def send(data, socket):
f = socket.makefile()
pickle.dump(data, f)
f.close()
def receive(socket):
f = socket.makefile()
data = pickle.load(f)
f.close()
return data
###server.py
import socket, time
from funcs import *
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(address) #address seht in funcs
serversocket.listen(5)
print 'server'
clientsocket, clientaddress = serversocket.accept()
#empfangen
time.sleep(1)
data = receive(clientsocket)
print data
data = receive(clientsocket)
print data
raw_input('')
###client.py
import socket, time
from funcs import *
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(address) #address seht in funcs
print 'client'
#senden
send(1, clientsocket)
#time.sleep(1.5) #den Befehl auskommentieren zum testen
send(2, clientsocket)
raw_input('')
nehme ich die kommentierte zeile im client raus (time.sleep(1.5)), sendet der client, wenn der server bereits auf neue daten wartet und auch die 2 erscheint in der ausgabe.
ich habe bereits versucht, an die funktionen send() und receive() statt des socket die socketfile zu übergeben, und die datei nach dem senden/empfangen demzufolge nicht zu schließen...dann kommt allerdings gar nix mehr an...
ich hoffe es ist verständlich was das problem ist und jemand kann mir weiterhelfen.
schonmal thx im voraus