• 基于QT的多线程server


    // thread.cpp

    #include "thread.h"
    
    
    Thread::Thread(int socketDescriptor, QObject *parent)
        : QThread(parent)
    {
        m_socketDescriptor = socketDescriptor;
    }
    
    
    Thread::~Thread()
    {
    
    
    }
    
    
    void Thread::run()
    {
        m_tcpSocket = new QTcpSocket;
    
    
        if (!m_tcpSocket->setSocketDescriptor(m_socketDescriptor))
        {
            emit error(m_tcpSocket->error());
            return;
        }
    
    
        connect(m_tcpSocket,SIGNAL(readyRead()),this, SLOT(readData_slot()), Qt::DirectConnection); // Qt::DirectConnection线程内传递消
        connect(m_tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(tcpSocket_error_slot()));
        connect(m_tcpSocket,SIGNAL(disconnected()),this,SLOT(quit()));//socket断开连接。线程退出
        qDebug() << "run" << m_tcpSocket->peerAddress().toString();
        qDebug() << "run" << m_tcpSocket->peerPort();
    
    
        exec();
    }
    
    
    void Thread::readData_slot()
    {
        QDataStream in(m_tcpSocket);
        in.setVersion(QDataStream::Qt_5_0);
    
    
        QDataStream out(m_tcpSocket);
        out.setVersion(QDataStream::Qt_5_0);
    
    
        QString data;
    
    
        in >> data;
        qDebug() << "readData_slot" << data;
    
    
        data = "hello this is server";
        out << data;
        qDebug() << data;
    }
    
    
    void Thread::tcpSocket_error_slot()
    {
        qDebug() << m_tcpSocket->errorString();
    }
    
    

    // server.cpp

    #include "server.h"
    
    
    Server::Server(QObject *parent)
        : QTcpServer(parent)
    {
    
    
    }
    
    
    Server::~Server()
    {
    
    
    }
    
    
    void Server::incomingConnection(qintptr socketDescriptor)
    {
        Thread *thread = new Thread(socketDescriptor, this);
        connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
        thread->start();
    }
    
    

    // dialog.cpp

    #include "dialog.h"
    
    
    Dialog::Dialog(QWidget *parent)
        : QWidget(parent)
    {
        m_statusLabel = new QLabel;
        m_statusLabel->setWordWrap(true);
        m_quitButton = new QPushButton(tr("Quit"));
        m_quitButton->setAutoDefault(false);
    
    
        QString ipAddress;
        QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
        // use the first non-localhost IPv4 address
        for (int i=0; i <ipAddressesList.size(); ++i)
        {
            if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
                ipAddressesList.at(i).toIPv4Address())
            {
                ipAddress = ipAddressesList.at(i).toString();
                break;
            }
        }
        // if we did not find one, use IPv4 localhost
        if (ipAddress.isEmpty())
        {
            ipAddress = QHostAddress(QHostAddress::LocalHost).toString();
        }
        m_statusLabel->setText(tr("The server is running on
    
    IP: %1
    port: %2
    
    "
                                "Run the Client example now.")
                             .arg(ipAddress).arg(m_server.serverPort()));
    
    
        connect(m_quitButton, SIGNAL(clicked()), this, SLOT(close()));
    
    
        QHBoxLayout *buttonLayout = new QHBoxLayout;
        buttonLayout->addStretch(1);
        buttonLayout->addWidget(m_quitButton);
        buttonLayout->addStretch(1);
    
    
        QVBoxLayout *mainLayout = new QVBoxLayout;
        mainLayout->addWidget(m_statusLabel);
        mainLayout->addLayout(buttonLayout);
        setLayout(mainLayout);
        setWindowTitle(tr("Threaded Server"));
    
    
        if (!m_server.listen(QHostAddress::Any, 1314))
        {
            QMessageBox::critical(this, tr("Threaded Server"),
                                  tr("Unable to start the server: %1.")
                                  .arg(m_server.errorString()));
            close();
            return;
        }
    }
    
    
    Dialog::~Dialog()
    {
    
    
    }
    
    
    
    这是我參照http://m.blog.csdn.net/blog/sdu_sky/8104175这位大神的博客和QT的多线程server源代码写出来的,
    

    可是我又两个地方不明确。在dialog.cpp中

    if (!m_server.listen(QHostAddress::Any, 1314))
    这一句如何就能在监听成功之后创建一个新的线程。
    void Server::incomingConnection(qintptr socketDescriptor)
    还有这个函数没有在构造函数里实现。也没有显式的调用???这是怎么回事,望高手指导

  • 相关阅读:
    如何提高送测版本的质量(开发篇)?
    web安全测试资料
    如何带领新人
    华为新人180天详细培养计划
    畠山芳雄:新员工培训的十三条黄金法则
    BUG级别定义标准
    EF-Linq将查询结果转换为List<string>
    在差距中进步,在记录中进步,
    Error: [ng:areq] Argument 'xxxx' is not a function, got undefined
    Book-编程珠玑-第一章
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7161798.html
Copyright © 2020-2023  润新知