基於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\n\nIP: %1\nport: %2\n\n"
                            "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)
還有這個函數沒有在構造函數里實現。也沒有顯式的調用???這是怎么回事。望高手指導


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM