我是QT5的新手,决定创建简单的多线程tcp服务器。我已经阅读了QT中提供的示例,但它们具有额外的功能和复杂性,我现在正试图避免这些功能和复杂性。这是我的代码:
的 server.h
#ifndef SERVER_H
#define SERVER_H
#include <QTcpServer>
#include <QTcpSocket>
#include "threadz.h"
class Server : public QTcpServer
{
Q_OBJECT
public:
explicit Server(QObject *parent = 0);
signals:
public slots:
void newConnection();
private:
QTcpServer *serv;
};
#endif // SERVER_H
threadz.h
#ifndef THREADZ_H
#define THREADZ_H
#include <QThread>
#include <QDebug>
#include "server.h"
class Threadz : public QThread
{
Q_OBJECT
public:
explicit Threadz(QObject *parent = 0);
void run(QTcpServer *serv);
signals:
public slots:
};
#endif // THREADZ_H
的 server.cpp
#include "server.h"
Server::Server(QObject *parent) :
QTcpServer(parent)
{
serv = new QTcpServer(this);
connect(serv, SIGNAL(newConnection()), this, SLOT(newConnection()));
if(!serv->listen(QHostAddress::Any, 1234))
{
qDebug() << "Error";
}
}
void Server::newConnection()
{
Threadz *thred = new Threadz();
thred->start();
}
的 threadz.cpp
#include "threadz.h"
Threadz::Threadz(QObject *parent) :
QThread(parent)
{
}
void Threadz::run(QTcpServer *serv)
{
QTcpSocket *socket = serv->nextPendingConnection();
socket->write("Hello!r\n");
socket->waitForBytesWritten();
socket->close();
}
的的main.cpp
#include <QCoreApplication>
#include "simplehttp.h"
#include "server.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Server gio;
return a.exec();
}
基本上,我试图为连接服务器的每个客户端创建新线程。但问题是,当我运行此代码并使用 telnet 127.0.0.1 1234 连接服务器时,屏幕上不会打印任何内容。没有错误,但也没有打印任何内容。我正在使用ubuntu 14.04。对不起,如果问题很愚蠢并提前感谢。
答案 0 :(得分:2)
QThread::run
功能未实现。
void QThread::run() [virtual protected]
线程的起点。在调用start()之后,新创建的线程调用此函数。默认实现只是调用exec()。
您可以重新实现此功能以促进高级线程管理。从此方法返回将结束线程的执行。
相反,您实施了void Threadz::run(QTcpServer *serv)
,但需要调用此功能。