L'application est une configuration client/serveur WxPython qui a plusieurs clients se connectant au serveur et s'engageant dans un protocole de réseau duplex. Par le passé, Twisted avait déjà été couplé avec AMP, mais il ne l'a pas complètement coupé pour l'architecture de l'application sans trop compliquer les choses à la fin.Client réseau Python, essayant de répondre aux réponses du serveur
Donc, pour le serveur, j'ai SocketServer avec la configuration ThreadingMixIn. En ce moment je travaille sur la file d'attente tampon/commande pour le serveur, mais ce n'est pas le problème.
Du côté client, je peux faire tout l'envoi normal de données, déclenché par des événements dans l'interface utilisateur, sans trop de problèmes. Je suis actuellement bloqué essayant d'obtenir le client pour écouter des réponses sans bloquer l'application entière. Donc, je veux mettre cela dans un fil, mais devrait-il commencer à la partie qui est maintenant commentée ou devrait-il être complètement différent et je ne le vois tout simplement pas? En bref: je souhaite que le client envoie des commandes au serveur et écoute les réponses sans bloquer/bloquer l'application entière.
Le code ci-dessous est un code de prototypage, s'il vous plaît excuser les erreurs typiques telles que les valeurs magiques et autres données codées en dur, il sera différent dans le code final.
import socket
import threading
import time
class CommandProxy(object):
def __init__(self, host, port):
self.host = host
self.port = port
def close(self):
if self.connection:
self.connection.close()
def connect(self):
try:
self.connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.connection.connect((self.host, self.port))
except socket.error as e:
print "Socket error: {0}".format(e)
def send_command(self, command, *kw):
datalist = ' '.join(kw)
data = command + ' ' + datalist + '\x00'
print 'DATA: {0}'.format(data)
self._write(data)
# while True:
# data = self._read()
# if data == 0:
# break
#
# print "DATA RECEIVED: {0}".format(data)
def _read(self):
data = self.connection.recv(1024)
return data
def _write(self, bytes):
self.connection.sendall(bytes)
if __name__ == '__main__':
HOST, PORT = 'localhost', 1060
proxy = CommandProxy(HOST, PORT)
proxy.connect()
try:
while True:
proxy.send_command('ID', '1')
time.sleep(2)
except KeyboardInterrupt:
print "Interrupted by user"
except socket.error as e:
print "Socket error: {0}".format(e)
except Exception as e:
print "something went wrong: {0}".format(e)
finally:
proxy.close()
Ok, donc en substance avoir un fil séparé écouter sur le socket tout le temps et chaque fois que les données reviennent du serveur génèrent WxEvents? – asmodai