No, devi utilizzare socket non bloccanti. socket_obj.recv() si comporta esattamente come una sleep. Finchè non ricevi dati ti blocca tutto il programma.
Mettendo un timeout sul socket ("socket_object.settimeout()") la recv() ritorna anche se non sono arrivati dati.
All'interno del ciclo while dovresti controllare se vi sono dati ricevuti o dati da mandare (inserendoli all'interno di un buffer) e comportarti di conseguenza.
Tutto questo puoi farlo utilizzando varie metodologie:
- manualmente operando con l'oggetto socket posto all'interno di un ciclo while (guarda esempio di codice che ti ho incollato sotto).
- manualmente utilizzando select()/poll().
- lavorando a livelli più alti utilizzando un framework (asyncore, asynchat, twisted).
Il tuo problema, nello specifico, si complica un po' dato che oltre a questo devi occuparti anche della GUI. In questo caso, probabilmente, trattare una delle due classi all'interno di un thread a parte potrebbe accomodarti di molto il lavoro, anche se la maniera 'fina' di fare il tutto sarebbe quella di utilizzare un unico thread/processo asincrono sia per la gui che per la connessione (ma come ti ho gia detto, di GUI non sono pratico quindi in questo senso non saprei come consigliarti).
codice:
# semplice echo server UDP
import socket
host = ''
port = 1234
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))
s.settimeout(0.1)
print "serving on port: %s" %port
in_data = ''
out_data = ''
while 1:
try:
in_data, address = s.recvfrom(8192)
except socket.timeout:
pass
if in_data:
print "%s <== %s" %(address, in_data)
out_data = in_data
if out_data:
s.sendto(out_data, address)
# 'flushing' dei due buffer
in_data = out_data = ''