From d7ed0ab070e265934b26bfc4b20bebaad751b891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=A7=D0=B5=D1=87=D0=B5?= =?UTF-8?q?=D1=82?= Date: Tue, 16 Mar 2021 21:14:39 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BD=20CallbackHandler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QuikPy.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/QuikPy.py b/QuikPy.py index d1a3016..931b2ca 100644 --- a/QuikPy.py +++ b/QuikPy.py @@ -36,19 +36,25 @@ class QuikPy(metaclass=Singleton): # Singleton класс socketCallbacks = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Соединение для функций обратного вызова socketCallbacks.connect((self.Host, self.CallbacksPort)) # Открываем соединение для функций обратного вызова currentThread = threading.currentThread() # Получаем текущий поток + fragments = [] # Будем получать ответ в виде списка фрагментов. Они могут быть разной длины. Ответ может состоять из нескольких фрагментов while getattr(currentThread, 'process', True): # Пока поток нужен - fragments = [] # Гораздо быстрее получать ответ в виде списка фрагментов while True: # Пока есть что-то в буфере ответов fragment = socketCallbacks.recv(self.bufferSize) # Читаем фрагмент из буфера fragments.append(fragment.decode('cp1251')) # Переводим фрагмент в Windows кодировку 1251, добавляем в список if len(fragment) < self.bufferSize: # Если в принятом фрагменте данных меньше чем размер буфера - break # то это был последний фрагмент, выходим из чтения буфера + break # то, возможно, это был последний фрагмент, выходим из чтения буфера data = ''.join(fragments) # Собираем список фрагментов в строку dataList = data.split('\n') # Одновременно могут прийти несколько функций обратного вызова, разбираем их по одной + fragments = [] # Сбрасываем фрагменты. Если последнюю строку не сможем разобрать, то занесем ее сюда for data in dataList: # Пробегаемся по всем функциям обратного вызова if data == '': # Если функция обратного вызова пустая continue # то ее не разбираем, переходим на следующую функцию, дальше не продолжаем - data = json.loads(data) # Возвращаем полученный ответ в формате JSON + try: # Пробуем разобрать функцию обратного вызова + data = json.loads(data) # Возвращаем полученный ответ в формате JSON + except json.decoder.JSONDecodeError: # Если разобрать не смогли (пришла не вся строка) + fragments.append(data) # то, что не разобрали ставим в список фрагментов + break # т.к. неполной может быть только последняя строка, то выходим из разбора функций обратного выходва + # Разбираем функцию обратного вызова QUIK LUA if data['cmd'] == 'OnFirm': # 1. Новая фирма self.OnFirm(data)