QTcpSocketとQTcpServerを使用してクライアントとサーバーを作成しようとしています。QTcpServer :: incomingConnection(qintptr)が呼び出されない
したがって、サーバーはどうなりますか。
- 私は、サーバーを実行し、それは(成功した[自分でチェックする])待機を開始
- 私は、クライアントを実行し、
port
- ため
IP address
と30000
ため127.0.0.1
を入力します。クライアントは接続が - サーバーのdoesnのにestabilishedと言います何もしないで、ただ待ってください。
私のプログラムの一部:
//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(何も書いていない保ちます)毎秒、クライアントはそれがサーバーに接続されていると言います。
私はまず、余分なスレッドを使わずに動作させるべきだと言います。メインスレッドで動作する場合にのみ、オブジェクトを 'QThread'に移動する必要があります(' QThread'から派生する必要はありません)。 –
'serverInit'はスレッドを作成している場所ですが、どこにでも呼び出すことはできません。 – Mike
あなたの接続を処理する別のスレッドが必要な場合は、実際に間違っています。ここにあなたの現在のデザインに関するいくつかの問題があります:1) 'clientsToBeAttached'、' server'は両方のスレッドで同期メカニズムなしで使われます。 2)キューに新しい接続クライアントがあるかどうかを確認するために1秒ごとにポーリングしています。これは、プロデューサ/コンシューマの問題の典型的な例です。 Qt [here](http://doc.qt.io/qt-5/qtcore-threads-waitconditions-example.html)と[here](http://doc.qt)でこれがどのように行われるかを見てみましょう。 .io/qt-5/qtcore-threads-semaphores-example.html)。 – Mike