![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
fluffyMan2000 |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 39 Регистрация: 13.8.2012 Пользователь №: 3481 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Добрый день.
Я новичек в сетевом программировании, но все же. Пишу клиент-серверную систему. Есть qt клиент и qt сервер. Клиент отправляет запрос (json), сервер обрабатывает запрос и генерирует json ответ. На стороне сервера отправка данных реализована через метод socket-> write(data), где data - это строка. На стороне клиента при получении данных вызывается метод slotReadyRead(), подключенный к сигналу readyRead(). Данные считываются методом socket->readAll(). Но вот проблема, когда сервер передаёт небольшую строку, то клиент принимает ее полностью. Если большую строку (большой Джейсон), то строка передаётся частями. То есть один вызов сигнала readyRead не означает получение ПОЛНОГО сообщения от сервера, насколько я понимаю. Отсюда вопрос, как за один раз передать ВСЮ БОЛЬШУЮ строку? Сообщение отредактировал fluffyMan2000 - 31.10.2013, 18:26 |
|
|
fluffyMan2000 |
![]()
Сообщение
#2
|
Студент ![]() Группа: Участник Сообщений: 39 Регистрация: 13.8.2012 Пользователь №: 3481 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(fluffyMan2000 @ 31.10.2013, 19:25) Link Добрый день. Я новичек в сетевом программировании, но все же. Пишу клиент-серверную систему. Есть qt клиент и qt сервер. Клиент отправляет запрос (json), сервер обрабатывает запрос и генерирует json ответ. На стороне сервера отправка данных реализована через метод socket-> write(data), где data - это строка. На стороне клиента при получении данных вызывается метод slotReadyRead(), подключенный к сигналу readyRead(). Данные считываются методом socket->readAll(). Но вот проблема, когда сервер передаёт небольшую строку, то клиент принимает ее полностью. Если большую строку (большой Джейсон), то строка передаётся частями. То есть один вызов сигнала readyRead не означает получение ПОЛНОГО сообщения от сервера, насколько я понимаю. Отсюда вопрос, как за один раз передать ВСЮ БОЛЬШУЮ строку? решение, если кому интересно: все же подумал и решил проблему следующим образом: на стороне сервера при отправке сообщения к сообщению добавляю признак конца строки. на стороне клиента при приеме сообщения делаю:
насколько это правильно — не знаю. но работает. |
|
|
mezmay |
![]()
Сообщение
#3
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 272 Регистрация: 13.7.2009 Из: Ростов-на-Дону Пользователь №: 904 Спасибо сказали: 16 раз(а) Репутация: ![]() ![]() ![]() |
Обычно в начало пакета вставляют размер,
а прием целого пакета по событию примерно так:
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 11.8.2025, 2:22 |