Приложение представляет собой клиент-серверную установку WxPython, в которой несколько клиентов подключаются к серверу и используют дуплексный сетевой протокол.
В прошлом я уже подключал Twisted к AMP, но он не полностью соответствовал архитектуре приложения без чрезмерного усложнения в итоге.
Итак, для сервера у меня установлен SocketServer с настроенным ThreadingMixIn. В данный момент я работаю над буфером / очередью команд для сервера, но это не проблема.
На стороне клиента я могу выполнять все обычные операции по отправке данных, инициируемые событиями в пользовательском интерфейсе, без особых проблем. В настоящее время я застрял, пытаясь заставить клиента прослушивать ответы, не блокируя все приложение. Поэтому я хочу поместить это в поток, но должно ли оно начаться с той части, которая сейчас закомментирована, или это должно быть обработано совершенно по-другому, и я просто не вижу этого?
Вкратце: я хочу, чтобы клиент отправлял команды на сервер и прослушивал любые ответы, не блокируя / не останавливая все приложение.
Приведенный ниже код является прототипом кода, прошу прощения за любые типичные ошибки, такие как магические значения и другие жестко закодированные данные, в конечном коде они будут другими.
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()