qtcpclienttest.cpp 5.5 KB
Newer Older
丁劲犇's avatar
丁劲犇 已提交
1 2
#include "qtcpclienttest.h"
#include <QSettings>
丁劲犇's avatar
丁劲犇 已提交
3
#include <QCoreApplication>
丁劲犇's avatar
丁劲犇 已提交
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
QTcpClientTest::QTcpClientTest(QWidget *parent, Qt::WindowFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);
    //Paramenters
    QSettings settings("goldenhawking club","QTcpClientTest",this);
    ui.lineEdit_ip->setText(settings.value("ip","localhost").toString());
    ui.lineEdit_Port->setText(settings.value("port","23").toString());
    ui.dial->setValue(settings.value("clientNum","2").toInt());
    ui.lcdNumber->display(settings.value("clientNum","2").toInt());
    ui.horizontalSlider->setValue(settings.value("Payload","4096").toInt());
    ui.label_load->setText(QString("Payload = %1").arg(settings.value("Payload","4096").toInt()));
    ui.listView_msg->setModel(&model);
}

QTcpClientTest::~QTcpClientTest()
{

}
void QTcpClientTest::on_horizontalSlider_valueChanged(int value)
{
    ui.label_load->setText(QString("Payload = %1").arg(value));
}
void QTcpClientTest::on_action_Connect_triggered(bool bConn)
{
    //connect to the server
    QSettings settings("goldenhawking club","QTcpClientTest",this);
    settings.setValue("ip",ui.lineEdit_ip->text());
    settings.setValue("port",ui.lineEdit_Port->text());
    settings.setValue("clientNum",ui.dial->value());
    settings.setValue("Payload",ui.horizontalSlider->value());
    if (bConn==true)
    {
        nTimer = startTimer(300);
    }
    else
        killTimer(nTimer);
}
void QTcpClientTest::on_client_trasferred(qint64 dtw)
{
    QGHTcpClient * pSock = qobject_cast<QGHTcpClient*>(sender());
    if (pSock)
    {
        displayMessage(QString("client %1 Transferrd %2 bytes.").arg((quintptr)pSock).arg(dtw));
    }

}
void QTcpClientTest::on_client_connected()
{
    QGHTcpClient * pSock = qobject_cast<QGHTcpClient*>(sender());
    if (pSock)
    {
        displayMessage(QString("client %1 disconnected.").arg((quintptr)pSock));
        pSock->SendData(QByteArray(qrand()%1024+1024,qrand()%(128-32)+32));
    }

}
void QTcpClientTest::on_client_disconnected()
{
    QGHTcpClient * pSock = qobject_cast<QGHTcpClient*>(sender());
    if (pSock)
    {
        displayMessage(QString("client %1 disconnected.").arg((quintptr)pSock));
        //disconnect the signal immediately so that the system resource could be freed.
        disconnect(pSock, SIGNAL(readyRead()),this, SLOT(new_data_recieved()));
        disconnect(pSock, SIGNAL(connected()),this, SLOT(on_client_connected()));
        disconnect(pSock, SIGNAL(disconnected()),this,SLOT(on_client_disconnected()));
        disconnect(pSock, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(displayError(QAbstractSocket::SocketError)));
        disconnect(pSock, SIGNAL(bytesWritten(qint64)), this, SLOT(on_client_trasferred(qint64)));
        m_clients.remove(pSock);
        pSock->deleteLater();
    }
}
void QTcpClientTest::displayError(QAbstractSocket::SocketError err)
{
    QGHTcpClient * sock = qobject_cast<QGHTcpClient *> (sender());
    if (sock)
        displayMessage(QString("client %1 error msg:").arg((quintptr)sock)+sock->errorString());
}
void QTcpClientTest::new_data_recieved()
{
    QTcpSocket * pSock = qobject_cast<QTcpSocket*>(sender());
    if (pSock)
    {
        QByteArray array =pSock->readAll();
        //in this example, we just do nothing but to display the byte size.
        displayMessage(QString("client %1 Recieved %2 bytes.").arg((quintptr)pSock).arg(array.size()));
    }
}

void QTcpClientTest::timerEvent(QTimerEvent * evt)
{
    if (evt->timerId()==nTimer)
    {
        int nTotalClients = ui.dial->value();
        QList<QGHTcpClient*> listObj = m_clients.keys();
        foreach(QGHTcpClient * sock,listObj)
        {
            if (rand()%10<3)
                //3/10 possibility to send a data block to server
                sock->SendData(QByteArray(qrand()%1024+1024,qrand()%(128-32)+32));
        }
        //
        if (rand()%10 <1)
        {
            //1/10 chance to make new connections.
            if (m_clients.size()>nTotalClients)
            {
                int nDel = m_clients.size()-nTotalClients;
                QList<QGHTcpClient*> listObj = m_clients.keys();
                for (int i=0;i<nDel;i++)
                {
                    listObj.at(i)->disconnectFromHost();
                }
            }
            QGHTcpClient * client = new QGHTcpClient(this,ui.horizontalSlider->value());
丁劲犇's avatar
丁劲犇 已提交
120
            //client->connectToHost(ui.lineEdit_ip->text(),ui.lineEdit_Port->text().toUShort());
丁劲犇's avatar
丁劲犇 已提交
121 122
            m_clients[client] = QDateTime::currentDateTime();
            connect(client, SIGNAL(readyRead()),this, SLOT(new_data_recieved()));
丁劲犇's avatar
丁劲犇 已提交
123
            //connect(client, SIGNAL(connected()),this, SLOT(on_client_connected()));
丁劲犇's avatar
丁劲犇 已提交
124 125 126
            connect(client, SIGNAL(disconnected()),this,SLOT(on_client_disconnected()));
            connect(client, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(displayError(QAbstractSocket::SocketError)));
            connect(client, SIGNAL(bytesWritten(qint64)), this, SLOT(on_client_trasferred(qint64)));
丁劲犇's avatar
丁劲犇 已提交
127
            connect(client, SIGNAL(encrypted()), this, SLOT(on_client_connected()));
丁劲犇's avatar
丁劲犇 已提交
128 129 130
            QString strCerPath =  QCoreApplication::applicationDirPath() + "/ca_cert.pem";
            QList<QSslCertificate> lstCas = QSslCertificate::fromPath(strCerPath);
            client->setCaCertificates(lstCas);
丁劲犇's avatar
丁劲犇 已提交
131
            client->connectToHostEncrypted(ui.lineEdit_ip->text(),ui.lineEdit_Port->text().toUShort());
丁劲犇's avatar
丁劲犇 已提交
132 133 134 135 136 137 138 139 140
        }
    }
}
void QTcpClientTest::displayMessage(const QString &str)
{
    model.insertRow(0,new QStandardItem(str));
    while (model.rowCount()>=256)
        model.removeRow(model.rowCount()-1);
}