Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Soket + timer
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
QTUsers
Как создать задержку в 15 секунд между клиентом и сервером.

server.h

#include <QtNetwork>
#include <QtGui>
#include "myserver.h"

MyServer::MyServer(int nPort, QWidget *parent)
    : QWidget(parent), m_nNextBlockSize(0)
{
    m_ptcpServer = new QTcpServer(this);
       if (!m_ptcpServer->listen(QHostAddress::Any, nPort)) {
           QMessageBox::critical(0,
                                 "Server Error",
                                 "Unable to start the server:"
                                 + m_ptcpServer->errorString()
                                );
           m_ptcpServer->close();
           return;
       }
       connect(m_ptcpServer, SIGNAL(newConnection()),
               this,         SLOT(slotNewConnection())
              );

       m_ptxt = new QTextEdit(this);
       m_ptxt->setReadOnly(true);

       //Layout setup
       QVBoxLayout* pvbxLayout = new QVBoxLayout(this);
       pvbxLayout->addWidget(new QLabel("<H1>Server</H1>"));
       pvbxLayout->addWidget(m_ptxt);
       setLayout(pvbxLayout);
}

MyServer::~MyServer()
{

}

/*virtual*/ void MyServer::slotNewConnection()
{
    QTcpSocket* pClientSocket = m_ptcpServer->nextPendingConnection();
    connect(pClientSocket, SIGNAL(disconnected()),
            pClientSocket, SLOT(deleteLater())
           );
    connect(pClientSocket, SIGNAL(readyRead()),
            this,          SLOT(slotReadClient())
           );

    sendToClient(pClientSocket, "Server Response: Connected!");
}

// ----------------------------------------------------------------------
void MyServer::slotReadClient()
{
    QTcpSocket* pClientSocket = (QTcpSocket*)sender();
    QDataStream in(pClientSocket);
    in.setVersion(QDataStream::Qt_4_5);
    for (;;) {
        if (!m_nNextBlockSize) {
            if (pClientSocket->bytesAvailable() < sizeof(quint16)) {
                break;
            }
            in >> m_nNextBlockSize;
        }

        if (pClientSocket->bytesAvailable() < m_nNextBlockSize) {
            break;
        }
        QTime   time;
        QString str;
        in >> time >> str;

        QString strMessage =
            time.toString() + " " + "Client has sent - " + str;
        m_ptxt->append(strMessage);

        m_nNextBlockSize = 0;

        sendToClient(pClientSocket,
                     "Server Response: Received \"" + str + "\""
                    );
    }
}

// ----------------------------------------------------------------------
void MyServer::sendToClient(QTcpSocket* pSocket, const QString& str)
{
    QByteArray  arrBlock;
    QDataStream out(&arrBlock, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_5);
    out << quint16(0) << QTime::currentTime() << str;

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

    pSocket->write(arrBlock);
}
Алексей1153
что такое задержка между клиентом и сервером ?

Если под этим понимается тупо задержка между приёмом с удалённого сокета и отправкой ответа, то можно воспользоваться

void QThread::sleep(unsigned long secs) [static]

(хм, кстати, в Qt5 её сделали public, а ранее, мне помнится, она была protected, и приходилось делать субклассинг для вызова)

А вообще, в твоём коде всё плохо - при работа с сокетами не нужны сигналы и слоты, но нужен отдельный поток. Иначе будет очень неудобно
QTUsers
Я новичок в Qt и в программировании. Нужно сделать интенсивность передачи информации которая равна 15 секундам. Можешь отредактировать мою программу
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.