QTcpServer :: incomingConnection(qintptr)没有调用

时间:2016-08-22 17:14:43

标签: qt qt5 qtcpserver

我正在尝试使用QTcpSocketQTcpServer制作客户端和服务器。

那么,服务器会发生什么。

  1. 我运行服务器,它开始监听(成功[自己检查])
  2. 我运行客户端,为127.0.0.1输入IP address,为30000输入port
  3. 客户说已建立连接
  4. 服务器不做任何事情,只是等待
  5. 我的计划的一部分:

    //server-work.h
    #ifndef SERVERWORK_H
    #define SERVERWORK_H
    
    #include <QtCore>
    #include <QSqlError>
    #include <QDebug>
    #include <QSqlQuery>
    #include <unistd.h>
    #include <QtNetwork/QTcpServer>
    #include <QtNetwork/QTcpSocket>
    #include <QtSql/QSqlDatabase>
    #include "lssclient.h"
    class LSSClient;
    
    class LTcpServer : public QTcpServer
    {
        Q_OBJECT
    public:
    
        class LTWorkWithClients : public QThread
        {
            //Q_OBJECT
        public:
            LTcpServer* server;
            LTWorkWithClients(QObject* parent = 0, LTcpServer *server = 0):
                QThread(parent)
            {
                this->server = server;
            }
    
        protected:
            void run() {
                qDebug() << "started";
                server->workWithIncomingConnection();
            }
        };
    
        QSqlDatabase db; // clients in database
    
        LTWorkWithClients* t_workWithClients;
        QQueue<quintptr> clientsToBeAttached;
        QList<LSSClient*> clients;
    
        LResult workWithIncomingConnection  ();
    
        LResult serverInit          ();
        LResult createDatabase      ();
    
        static QTextStream& qStdout ();
    
        void incomingConnection(qintptr socketDescriptor) Q_DECL_OVERRIDE;
    
    protected:
    
    private:
    
    };
    
    #endif // SERVERWORK_H
    

    我知道这个嵌套的线程类是非常错误的做这件事的方法,但我没有太多时间正确地做到这一点

    // server-work.cpp [PART]
    LResult LTcpServer::serverInit()
    {
        checkError;
        db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("serverDB");
    
        if (!db.open()) {
            qDebug() << "Error opening database...";
            qDebug() << db.lastError().text();
            return LVError;
        } else {
            qDebug() << "Database successfully opened";
        }
        if(!this->listen(QHostAddress::Any, 30000)){
            qDebug() << "Error starting listening...";
            return LVError;
        } else {
            qDebug() << "Start listening successfully";
        }
        t_workWithClients = new LTWorkWithClients(this, this);
        t_workWithClients->start();
        return LVSuccess;
    }
    
    void LTcpServer::incomingConnection(qintptr socketDescriptor)
    {
        qDebug() << Q_FUNC_INFO << " new connection";
        clientsToBeAttached.enqueue(socketDescriptor);
        qDebug() << "here1";
    }
    
    LResult LTcpServer::workWithIncomingConnection()
    {
        bool toExit = false;
        while (!toExit) {
            checkError;
            qDebug() << "1";
            if (clientsToBeAttached.length() != 0) {
                quintptr eachClientDescriptor = clientsToBeAttached.dequeue();
                qDebug() << "2";
                LSSClient* client = new LSSClient(this);
                client->server = this;
                client->socket->setSocketDescriptor(eachClientDescriptor);
                qDebug() << "3";
                client->registered = false;
                client->server = this;
                qDebug() << client->socket->localAddress();
                connect(client->socket, SIGNAL(readyRead()), client, SLOT(onSokReadyRead()));
                connect(client->socket, SIGNAL(connected()), client, SLOT(onSokConnected()));
                connect(client->socket, SIGNAL(disconnected()), client, SLOT(onSokDisconnected()));
                connect(client->socket, SIGNAL(error(QAbstractSocket::SocketError)),client, SLOT(onSokDisplayError(QAbstractSocket::SocketError)));
                clients.append(client);
            }
            usleep(1000000);
        }
        return LVSuccess;
    }
    

    所以,服务器只是每秒写1(不多),但客户端说它连接到服务器。

1 个答案:

答案 0 :(得分:0)

这种结构可能会有所帮助......

在您的ltcpserver.h文件中:

class LTcpServer : public QTcpServer
{
    Q_OBJECT
public:
    explicit LTcpServer(QObject * parent = 0);
    void incomingConnection(qintptr socketDescriptor) Q_DECL_OVERRIDE;
private:
    QThread *myThread;
};

并在您的ltcpserver.cpp中:

LTcpServer::LTcpServer(QObject * parent) : QTcpServer(parent)
{
    if(this->listen(QHostAddress::Any,30000))
    {
        qDebug() << "server started...";
    }
    else
    {
        qDebug() << "server could not be started...";
    }
    myThread = new QThread();
    myThread->start();
}

void LTcpServer::incomingConnection(qintptr socketDescriptor)
{
    LSSClient * yourClient = new LSSClient(socketDescriptor);
    yourClient->moveToThread(myThread);
    clients->append(yourClient);
}

和你的lssclient.h

class LSSClient: public QObject
{
    Q_OBJECT
public:
    explicit LSSClient(qintptr socketDescriptor,QObject * parent = 0);
private:
    void setupSocket(qintptr socketDescriptor);
    QTcpSocket * socket;
public slots:
    void readyRead();
    void disconnected();
};

和你的lssclient.cpp

LSSClient::LSSClient(qintptr socketDescriptor,QObject * parent) : QObject(parent)
{
    setupSocket(qintptr socketDescriptor);
}

void LSSClient::setupSocket(qintptr socketDescriptor)
{
    socket = new QTcpSocket(this);
    socket->setSocketDescriptor(sDescriptor);
    connect(socket,SIGNAL(readyRead()),this,SLOT(readyRead()));
    connect(socket,SIGNAL(disconnected()),this,SLOT(disconnected()));
}

void LSSClient::readyRead()
{
    // do whatever you want here with incoming data
}

void LSSClient::disconnected()
{
    // do what happens to client when disconnected
}