说明
最近用Qt写一个tcp的server,用到了QTcpServer类,按照网上的示例代码很快就写完了代码。当有客户端连接时,客户端能够连接上server,但tcpserver始终拿不到newConnection的信号,百思不得其解。查看了网上很多示例代码,发现他们的代码都基于Widget或ConsoleApplication,而我的代码不是基于这两者的,主函数创建完server类后,就写了个while sleep循环。想想,我们一般写server时都需要创建监听线程,而这里的线程呢?后来看到一个完整的基于ConsoleApplication的工程示例,发现其主函数再创建完server后,开始了主线程事件循环,猜想主函数这段代码的意义就是创建完server后将线程交给qt取处理,才能够connect到信号响应相应的槽,基于Widget的代码想想也是这样。
代码编写
使用Qt创建Console Application工程,新建Server类,继承QObject
#ifndef SERVER_H
#define SERVER_H
#include <QObject>
#include <QDebug>
#include <QTcpServer>
#include <QTcpSocket>
#include <QByteArray>
class Server : public QObject
{
Q_OBJECT
public:
explicit Server(QObject *parent = nullptr);
void StartListen(int nPort);
private:
QTcpServer *m_piserver;
QTcpSocket *m_pisocket;
signals:
public slots:
void newClientConnect();
void readMessage();
void disConnect();
};
#endif // SERVER_H
#include "server.h"
#include "QCoreApplication"
Server::Server(QObject *parent) : QObject(parent)
{
m_piserver = new QTcpServer;
m_pisocket = new QTcpSocket;
StartListen(2016);
}
void Server::StartListen(int nPort)
{
if(m_piserver->listen(QHostAddress::Any,nPort))
qDebug() << "listen ok";
else
qDebug() << "listen err";
connect(m_piserver,SIGNAL(newConnection()),this,SLOT(newClientConnect()));
}
void Server::newClientConnect()
{
qDebug() << "new client connect";
m_pisocket = m_piserver->nextPendingConnection();
connect(m_pisocket,SIGNAL(readyRead()),this,SLOT(readMessage()));
connect(m_pisocket,SIGNAL(disconnected()),this,SLOT(disConnect()));
}
void Server::readMessage()
{
qDebug() << "read client message";
QByteArray buf;
buf = m_pisocket->readAll();
qDebug() << buf;
}
void Server::disConnect()
{
qDebug() << "client disconnect";
}
#include <server.h>
#include <QCoreApplication>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Server *piServer = new Server;
return a.exec();//开始主线程事件循环
}