crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QTcpSocket::write() - как гарантировать пересылку данных одним пакетом?
fluffyMan2000
  опции профиля:
сообщение 31.10.2013, 18:25
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 39
Регистрация: 13.8.2012
Пользователь №: 3481

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день.

Я новичек в сетевом программировании, но все же.

Пишу клиент-серверную систему. Есть qt клиент и qt сервер. Клиент отправляет запрос (json), сервер обрабатывает запрос и генерирует json ответ.

На стороне сервера отправка данных реализована через метод socket-> write(data), где data - это строка.

На стороне клиента при получении данных вызывается метод slotReadyRead(), подключенный к сигналу readyRead().

Данные считываются методом socket->readAll().

Но вот проблема, когда сервер передаёт небольшую строку, то клиент принимает ее полностью. Если большую строку (большой Джейсон), то строка передаётся частями. То есть один вызов сигнала readyRead не означает получение ПОЛНОГО сообщения от сервера, насколько я понимаю. Отсюда вопрос, как за один раз передать ВСЮ БОЛЬШУЮ строку?

Сообщение отредактировал fluffyMan2000 - 31.10.2013, 18:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fluffyMan2000
  опции профиля:
сообщение 1.11.2013, 9:37
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 39
Регистрация: 13.8.2012
Пользователь №: 3481

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(fluffyMan2000 @ 31.10.2013, 19:25) *
Добрый день.

Я новичек в сетевом программировании, но все же.

Пишу клиент-серверную систему. Есть qt клиент и qt сервер. Клиент отправляет запрос (json), сервер обрабатывает запрос и генерирует json ответ.

На стороне сервера отправка данных реализована через метод socket-> write(data), где data - это строка.

На стороне клиента при получении данных вызывается метод slotReadyRead(), подключенный к сигналу readyRead().

Данные считываются методом socket->readAll().

Но вот проблема, когда сервер передаёт небольшую строку, то клиент принимает ее полностью. Если большую строку (большой Джейсон), то строка передаётся частями. То есть один вызов сигнала readyRead не означает получение ПОЛНОГО сообщения от сервера, насколько я понимаю. Отсюда вопрос, как за один раз передать ВСЮ БОЛЬШУЮ строку?


решение, если кому интересно:

все же подумал и решил проблему следующим образом: на стороне сервера при отправке сообщения к сообщению добавляю признак конца строки. на стороне клиента при приеме сообщения делаю:

 QString response;

    while(1)
    {
        response += QString(m_pTcpSocket->readAll());

        if (response.contains("\n"))
        {
            break;
        } else
        {
            m_pTcpSocket->waitForReadyRead(100);
        }
    }



насколько это правильно — не знаю. но работает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 11.12.2013, 14:08
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Обычно в начало пакета вставляют размер,
а прием целого пакета по событию примерно так:
void CMyClass::onReceive()
{
    QDataStream in(m_pTcpSocket);

    for(;;)
    {
        if(m_nextBlockSize == 0)
        {
            if(m_pTcpSocket->bytesAvailable() < sizeof(m_nextBlockSize))
            {
                break;
            }
            else
            {
                in >> m_nextBlockSize;
            }
        }

        if(m_pTcpSocket->bytesAvailable() < m_nextBlockSize)
        {
            break;
        }

        // Вызов функции обработки принятых данных
        receiveCmd(m_pTcpSocket);

        m_nextBlockSize = 0;
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 16.4.2024, 21:09