QTcpServer

说明

​最近用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();//开始主线程事件循环
}
  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值