QtcpSocket. Проблема с асинхронностью чтения данных |
Здравствуйте, гость ( Вход | Регистрация )
QtcpSocket. Проблема с асинхронностью чтения данных |
Andrewshkovskii |
14.12.2011, 23:33
Сообщение
#1
|
Активный участник Группа: Участник Сообщений: 351 Регистрация: 27.12.2008 Пользователь №: 467 Спасибо сказали: 18 раз(а) Репутация: 1 |
Друзья, в ниже изложенном алгоритме приема данных из сокета я наблюдаю проблему, которую не знаю как решить, может вы мне поможете?
Условие передачи данных по сокетам - %длина_передаваемых_данных%|%сериализированный_json% . Слот чтения данных соединен с сигналом readyRead. Обменивается сервер и клиент т.н. "Командами", сериализованный JSON с обязательным атрибутом 'command'. Приходит команда от сервероного сокета (на сервер сайде используются не qt-сокеты, а питоновские, из модуля socket). Почему-то, при приеме сравнительно большем объеме данных (100к+ символов) возникает следующая проблема: Но я не успеваю получить их полностью и в этот поток данных команды вливается, почему-то, ещё один поток данных, из следующей команды. Соответственно, при достижении нужного размера полученных данных я отправляю на обработку не валидный JSON. А происходит это так , допустим есть команда, содержащая 100к+ символов. ОТправляем сокету, и пока сокет её получает, отправляет ещё одну, и ещё одну. и всё это дело почему-то перемешивается. А недостающие куски потом прилетают. Как это может быть?Разве слоты обрабатываются асинхронного ? (софтина не многопоточная). Да и потом, протокол обеспечивает "правильную" последовательность данных, а тут как-то наоборот. Может я не верно слот с сигналом соединил? Использую следующий код :
|
|
|
Влад |
15.12.2011, 13:27
Сообщение
#2
|
Участник Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: 8 |
Гм. Я правильно понял: у тебя И на серверной стороне, И на клиентской - работают гарантированно однопоточные программы?
Я сталкивался с подобным явлением при передаче по TCP соединению больших блоков данных (большинство блоков >64K, хотя некоторые блоки имели размер всего 1-2K) - на серверной стороне работал многопоточный софт, и в этом софте была ошибка, заключавшаяся в том, что никакой синхронизации между потоками при записи данных в один и тот же сокет программистом не было предусмотрено. В результате, при достижении некоторого уровня загрузки приложения, на клиент начинали бессистемно (иногда) приходить "битые" блоки данных, что рушило работу системы. Именно по описанному тобою сценарию - "предыдущие" и "последующие" куски данных перемешивались... |
|
|
Текстовая версия | Сейчас: 20.5.2024, 5:00 |