Ich versuche mir gerade einen kleinen Client + Server zu schreiben zwischen dennen ich ein Objekt einer selbstgeschriebenen Klasse hin und herschiebe (ersteinmal ohne tieferen Sinn). Das funktioniert soweit auch schon ganz gut, allerdings sobald ich viele Anfragen an den Client sende, bleiben manche davon unbeantwortet...ohne Fehlermeldung bzw. Exception.
Anbei mal der Quellcode - hoffe mir kann jemand helfen....vielleicht habe ich auch einfach etwas grundlegendes Falsch gemacht - habe bisher in Python noch nicht mit Sockets programmiert.
Der Server schickt 5 Sachen an den Client...davon kommen aber meistens nur 1 und 2 zurück - manchmal auch 1,2 und 4
Gruß Tagiru
# Client
Code: Alles auswählen
class Worker(Thread):
def __init__ (self):
# Threading
Thread.__init__(self)
self.__event = Event()
# Connect to Server (Sending)
self.__scon = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.__scon.connect(('127.0.0.1', 55555))
self.__scon.send('WILL SEND')
# Connect to Server (Receiving)
self.__rcon = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.__rcon.connect(('127.0.0.1', 55555))
self.__rcon.send('WILL RECV') #
# Something
self.__jobs = list()
self.__runstate = True
# Start Job Listener
listener = Thread(target=self.__receive)
listener.start()
def run(self):
time.sleep(5)
while self.__runstate:
if len(self.__jobs) == 0:
self.__event.wait()
continue
self.__send({'type' : self.__jobs[0]['type'], self.__jobs[0]['obj']})
self.__jobs.remove(self.__jobs[0])
def __send(self, tmdb_obj):
obj = self.__scon.makefile('wb')
pickle.dump(tmdb_obj, obj, pickle.HIGHEST_PROTOCOL)
obj.close()
def __receive(self):
while self.__runstate:
obj = self.__rcon.makefile('rb')
data = pickle.load(obj)
obj.close()
self.__add_job(data)
def __add_job(self, job):
print "JOB: " + str(job['type'])
self.__jobs.append(job)
self.__event.set()
self.__event.clear()
w = Worker()
w.start()
# Server (leider momentan etwas unstrukturiert, da Teile aus einem Tut stammen + ich noch am probieren bin)
Code: Alles auswählen
soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
soc.bind(('127.0.0.1',55555))
soc.listen(5)
class ABC(threading.Thread):
def __init__(self,c):
threading.Thread.__init__(self)
self.conn = c
self.stopIt=False
def mrecv(self):
f = self.conn.makefile('rb')
data = pickle.load(f)
f.close()
return data
def run(self):
while not self.stopIt:
msg = self.mrecv()
print 'recieved-> ',msg
def setConn(con1,con2):
dict={}
state = con1.recv(9)
con2.recv(9)
if state =='WILL RECV':
dict['send'] = con1 # server will send data to reciever
dict['recv'] = con2
else:
dict['recv'] = con1 # server will recieve data from sender
dict['send'] = con2
return dict
def msend(conn,msg):
test_entry = obj()
tmdb_obj = {'type' : 'tmdb_country', 'obj' : test_entry}
obj = conn.makefile('wb')
pickle.dump(tmdb_obj, obj, pickle.HIGHEST_PROTOCOL)
obj.close()
tmdb_obj2 = {'type' : 'tmdb_release', 'obj' : test_entry}
obj2 = conn.makefile('wb')
pickle.dump(tmdb_obj2, obj2, pickle.HIGHEST_PROTOCOL)
obj2.close()
tmdb_obj3 = {'type' : 'tmdb_alternatetitle', 'obj' : test_entry}
obj3 = conn.makefile('wb')
pickle.dump(tmdb_obj3, obj3, pickle.HIGHEST_PROTOCOL)
obj3.close()
tmdb_obj4 = {'type' : 'tmdb_language', 'obj' : test_entry}
obj4 = conn.makefile('wb')
pickle.dump(tmdb_obj4, obj4, pickle.HIGHEST_PROTOCOL)
obj4.close()
tmdb_obj5 = {'type' : 'tmdb_studio', 'obj' : test_entry}
obj5 = conn.makefile('wb')
pickle.dump(tmdb_obj5, obj5, pickle.HIGHEST_PROTOCOL)
obj4.close()
(c1,a1) = soc.accept()
(c2,a2) = soc.accept()
dict = setConn(c1,c2)
thr = CThread(dict['recv'])
thr.start()
try:
while 1:
msend(dict['send'], raw_input()) # Damit das Teil nicht beim Testen in der Dauerschleife rennt wartet es auf irgendeine Eingabe - raw_input()
except:
print 'closing'
thr.stopIt=True
thr.conn.close()
soc.close()