Russian Qt Forum
Ноябрь 23, 2024, 06:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTcpServer, QTcpSocket. Обмен сообщениями клиент-сервер  (Прочитано 5958 раз)
xors
Гость
« : Октябрь 14, 2010, 22:23 »

Здравствуйте, прошу помощи в решении следующей проблемы - нужно обмениваться сообщениями между клиентом и сервером, но не получается принять сообщение на сервере, клиенту передается все ок.
клиент коннектится к серверу
Код:

void MainWindow::on_b_clicked()
{

    blockSize = 0;
    tcpSocket->abort();
    tcpSocket->connectToHost(ui->host->text(),
                             ui->port->text().toInt());
    connect(tcpSocket, SIGNAL(connected()), this, SLOT(sendMsg()));

}
void MainWindow::sendMsg()
{
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_7);
    out << (quint16)0;
    out << QString("hi");
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));
    tcpSocket->write(block);
    while(tcpSocket->bytesToWrite() > 0)
    {
       tcpSocket->waitForBytesWritten();
    }
}
сервер принимает соединение
Код:
......
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(handleConnection()));
.....
void MainWindow::handleConnection()
{
    QByteArray block;
    QDataStream out(&block, QIODevice::ReadWrite);


    out.setVersion(QDataStream::Qt_4_7);
    out << (quint16)0;
    out << QString("ok");
    out.device()->seek(0);
    out << (quint16)(block.size() - sizeof(quint16));
    QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
    connect(clientConnection, SIGNAL(readyRead()),
            this, SLOT(slotReadClient()));



    connect(clientConnection, SIGNAL(disconnected()),
            clientConnection, SLOT(deleteLater()));

    clientConnection->write(block);
}
void MainWindow::slotReadClient()
{
    QTcpSocket* pClientSocket = (QTcpSocket*)sender();
    QByteArray msg = pClientSocket->readAll();

    QString msg_str(msg);
    this->addLog(msg_str);
}


в результате клиету, установившему соединение, приходит "ok", а на сервере "hi" не могу прочитать....
Записан
merke
Гость
« Ответ #1 : Октябрь 15, 2010, 09:44 »

попробуй убратьт это
Код:
 while(tcpSocket->bytesToWrite() > 0)
    {
       tcpSocket->waitForBytesWritten();
    }
Записан
merke
Гость
« Ответ #2 : Октябрь 15, 2010, 10:08 »

И ещё если пишете в сокет через QDataStream то и читайте аналогичным способом. Ведь вы записываете  out << (quint16)0;
out << QString("hi"); версию потом саму строку, а взять и потом все это сразу считать в QByteArray - некорректно. Читайте как

Код:
   QByteArray block;
    QDataStream in(&block, QIODevice::ReadOnly);
     in.setVersion(QDataStream::Qt_4_7);
    quint16 vers;    
    QString str;
    in >> vers;
    in >> str;

И потом уже this->addLog(msg_str)


http://www.doc.crossplatform.ru/qt/en/4.6.x/qdatastream.html
« Последнее редактирование: Октябрь 15, 2010, 10:10 от Александр » Записан
xors
Гость
« Ответ #3 : Октябрь 15, 2010, 10:24 »

эм... пока все равно не могу разобраться, а как тогда связать входящий поток с сокетом? когда отправляю, формиру блок и потом write
Записан
xors
Гость
« Ответ #4 : Октябрь 15, 2010, 10:26 »

Соорудил по-быстрому сервер на пайтоне, тот принимает hi, хоть и с лишними символами... разберусь потом, но тут не получается, убрал указанный выше блок, та же фигня
Записан
merke
Гость
« Ответ #5 : Октябрь 15, 2010, 10:44 »

Ой пардон, вместе кубайтарэй надо ссылку на сокет кинуть

Код:
    QDataStream in(&socket, QIODevice::ReadOnly);
     in.setVersion(QDataStream::Qt_4_7);
    quint16 vers;   
    QString str;
    in >> vers;
    in >> str;
Записан
xors
Гость
« Ответ #6 : Октябрь 15, 2010, 13:10 »

спасибо за помощь, в итоге обошелся QTextStream-ами. Я с сокетами только начал работь, пока обойдусь строками, но возник вопрос - можно ли по ним передавать объекты?
Записан
CuteBunny
Гость
« Ответ #7 : Октябрь 29, 2010, 15:49 »

спасибо за помощь, в итоге обошелся QTextStream-ами. Я с сокетами только начал работь, пока обойдусь строками, но возник вопрос - можно ли по ним передавать объекты?

В смысле??? Экземпляры классов что ли???
Хмммм...  Веселый
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.135 секунд. Запросов: 22.