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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: обмен данными клиент-сервер  (Прочитано 3270 раз)
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);
 };

нужно чтобы отправлялись оба, как сделать синхронную передачу?
« Последнее редактирование: Май 29, 2010, 11:35 от linkr » Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Май 29, 2010, 11:47 »

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

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

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
linkr
Гость
« Ответ #2 : Май 29, 2010, 11:58 »

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

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

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

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

тоже нет, скорее я не понимаю способ их взаимодействия)
« Последнее редактирование: Май 29, 2010, 12:04 от linkr » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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