QTcpServer:: входящийКоннекция (qintptr) не вызывает

Я пытаюсь сделать клиент и сервер, используя QTcpSocket и QTcpServer.

Итак, что происходит с сервером.

  1. Я запускаю сервер, он начинает слушать (успешно [проверено мной])
  2. Я запускаю клиент, введите 127.0.0.1 за IP address а также 30000 за port
  3. Клиент говорит, что соединение установлено
  4. Сервер ничего не делает, просто жди

Части моей программы:

//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 ответ

Эта структура может помочь...

в вашем файле 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
}
Другие вопросы по тегам