Qt сервер и java клиент. Почему сервер не считывает данные от клиента?

Добрый день.

стоит задача написать клиент-серверное приложение. Сервер на Qt, клиент — на Java под андроид. Сервер пока взял из примеров qt.

Проблема вот в чем: если я отправляю строку из джава-клиента, то сервер принимает пустую строку, то есть "". если же отсылать строку из qt-клиента (из примеров qt), то все принимается нормально. Подскажите, в чем может быть дело?

Код сервера (слот, считывающий данные из клиентского сокета):
void MyServer::slotReadClient()
{
    QTcpSocket* pClientSocket = (QTcpSocket*)sender();
    QDataStream in(pClientSocket);
    in.setVersion(QDataStream::Qt_4_7);

    QTime   time;
    QString str;

    while (1)
    {
        if (!m_nNextBlockSize)
        {
            if (pClientSocket->bytesAvailable() < (int)sizeof(quint16))
            {
                break;
            }

            in >> m_nNextBlockSize;
        }

        if (pClientSocket->bytesAvailable() < m_nNextBlockSize)
        {
            break;
        }


        in >> time >> str;

        m_nNextBlockSize = 0;

    }

    qDebug() << str;
}


Код qt-клиента (слот отправки данных, с которым все работает):
void MyClient::slotSendToServer()
{
    QByteArray  arrBlock;
    QDataStream out(&arrBlock, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_7);
    out << quint16(0) << QTime::currentTime() << m_ptxtInput->text();

    out.device()->seek(0);
    out << quint16(arrBlock.size() - sizeof(quint16));

    m_pTcpSocket->write(arrBlock);
}


Код джава-клиента (метод отправки сообщения, которое сервер не получает):
private void writeMessage(String message)
    {    
        if (socket != null)
        {
            try {
                outStream.writeUTF(message);
                outStream.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


Думаю, что проблема связана со строками

in.setVersion(QDataStream::Qt_4_7);
out.setVersion(QDataStream::Qt_4_7);


в qt сервере и клиенте. То есть там свой протокол данных. а из джава кода я просто строку передаю.
  • Вопрос задан
  • 4255 просмотров
Пригласить эксперта
Ответы на вопрос 2
barker
@barker
Нужно смотреть что реально приходит. И как-то вы по разному из клиента на qt и клиента на java отправляете. Ну и учтите, что writeUTF пишет не просто поток закодированных байтов строки в поток, а сначала два байта длины а потом саму строку в modified UTF.
Ответ написан
Посмотрите кроссплатформенное решение для передачи данных нужного формата, вроде protobuff. По ссылке есть реализация для c++ и java.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы