Russian Qt Forum

Qt => Базы данных => Тема начата: linkr от Май 29, 2010, 11:28



Название: обмен данными клиент-сервер
Отправлено: linkr от Май 29, 2010, 11:28
на стороне сервера

создание
Код:
    QHostAddress hostadd("192.168.1.2");

    if (!tcpServer->listen(hostadd,55555))
    {
        QMessageBox::critical(this, tr("Lin Server"),
                              tr("Невозможно запустить сервер: %1.")
                              .arg(tcpServer->errorString()));
        close();
        return;
    }

    ipAddress = hostadd.toString();

    createStatusBar();
    createDockWindows();
    setCentralWidget(TableWidget);

    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendWelcomeMessage()));
посылка приветственного сообщения при соединение
Код:
void MainWindow::sendWelcomeMessage()
{
 blockSize = 0;
 QString str = ">>Добро пожаловать ,вы подключились к серверу";

 clientConnection = tcpServer->nextPendingConnection();
 connect(clientConnection, SIGNAL(readyRead()), this, SLOT(readMessage()));
 sendMessage(0,str);

}
отправка сообщения
Код:
void MainWindow::sendMessage(int code,QString Msg)
{
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << (quint16)0;
    out << (int)code;
    switch(code)
      {
        case 0:
        out << Msg;
        break;

      }


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

    clientConnection->write(block);
};

чтение сообщения
Код:
void MainWindow::readMessage()
{
    QDataStream in(clientConnection);
    in.setVersion(QDataStream::Qt_4_0);
    if (blockSize == 0) {
        if (clientConnection->bytesAvailable() < (int)sizeof(quint16))
            return;
        in >> blockSize;
    }

    if (clientConnection->bytesAvailable() < blockSize)
        return;



    int code = 0;
    in >> code;
    switch(code)
    { case 0:
      {
        QString str;
        in >> str;
        TextBrowser->append(str);
        sendMessage(0,str);
        break;
      }
        case 1:
      {

        QString log;
        QString pass;
        in >> log;
        in >> pass;
        if(!createConnection(&log,&pass))
            QMessageBox::critical(0, QObject::tr("Database Error"),
                                  db->lastError().text());
        else
           TextBrowser->append(">>"+log+" вошел в базу данных");
         break;
      }
    }
};

********************....*******************************
на стороне клиента

запись
Код:
void MainWindow::sendMessage(int code,QString Msg)
{
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << (quint16)0;
    out << (int)code;
   switch(code)
      {
        case 0:
        out << Msg;
        break;

        case 1:
        out << nameEdit->text();
        out << pasEdit->text();
        break;
      }


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

    tcpSocket->write(block);
};


чтение
Код:
void MainWindow::readMessage()
{
    QDataStream in(tcpSocket);
    in.setVersion(QDataStream::Qt_4_0);
    if (blockSize == 0) {
        if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
            return;
        in >> blockSize;
    }

    if (tcpSocket->bytesAvailable() < blockSize)
        return;

    int code = 0;
    in >> code;
    if(code == 0)
    {
        QString str;
        in >> str;
        TextBrowser->append(str);;
    }

}

сдесь  отправляется только одно сообщение
Код:
void MainWindow::requestNewServer()
{
    blockSize = 0;
    tcpSocket->abort();
    tcpSocket->connectToHost(hostEdit->text(),
                             portEdit->text().toInt());
    sendMessage(0,">>Клиент "+nameEdit->text()+" подключен");
    sendMessage(1);
 };

нужно чтобы отправлялись оба, как сделать синхронную передачу?


Название: Re: обмен данными клиент-сервер
Отправлено: kibsoft от Май 29, 2010, 11:47
А зачем отправлять такую строку на сервер?
Цитировать
">>Клиент "+nameEdit->text()+" подключен"
Можно передать имя, а остальную часть подставит сам сервак. Передача лишних данных.. то же самое отправка строки с сервера. Отправляй код, а строку в клиенте создавай.

По теме: 2ое сообщение вообще не передается или передается, но не приходит?
Попробуй продебажить readMessage().


Название: Re: обмен данными клиент-сервер
Отправлено: linkr от Май 29, 2010, 11:58
По теме: 2ое сообщение вообще не передается или передается, но не приходит?
Попробуй продебажить readMessage().

потом заменю на чистые команды) просто тестирую)
в клиенте оно передается, на сервере не приходит(не обрабатывается), сигнал не срабатывает. Хотя первый 
  sendMessage(0,">>Клиент "+nameEdit->text()+" подключен"); обрабатывает

просто может оно отсылает второй пакет до того как сервер готов принять его?

    sendMessage(0,">>Клиент "+nameEdit->text()+" подключен");
    int i=10000;
    while (i!=0)
    {
      i--;
    }
    sendMessage(1);

тоже нет, скорее я не понимаю способ их взаимодействия)