Qt 多线程服务器

myserver.h

#ifndef MYSERVER_H
#define MYSERVER_H

#include <QTcpServer>
#include "mythread.h"

class myserver : public QTcpServer
{
    Q_OBJECT
public:
    explicit myserver(QObject *parent = 0);
protected:
    void incomingConnection(qintptr socketDescriptor);//服务器重写函数,用于处理新连接
    
};

#endif // MYSERVER_H

myserver.cpp

#include "myserver.h"


myserver::myserver(QObject *parent) :
    QTcpServer(parent)
{
}

void myserver::incomingConnection(qintptr socketDescriptor)
{
    mythread* thread = new mythread(socketDescriptor, 0);//创建新线程
    thread->start();//开始线程
    QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()),Qt::DirectConnection);
}

mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>
#include <QTcpSocket>
#include <QTcpServer>
class mythread : public QThread
{
    Q_OBJECT
public:
    explicit mythread(qintptr socketDescriptor,QObject *parent = 0);
    ~mythread();
protected:
    void run();
private slots:
    void slotReadData();
    void slotDisconnected();
private:
    qintptr m_socketDescriptor;
    QTcpSocket *tcpSocket;
};

#endif // MYTHREAD_H

mythread.cpp

#include "mythread.h"

mythread::mythread(qintptr socketDescriptor,QObject *parent) :
    QThread(parent),m_socketDescriptor(socketDescriptor)
{
	tcpSocket = new QTcpSocket;
    if(!tcpSocket->setSocketDescriptor(m_socketDescriptor))
    {
        return;
    }
    connect(m_tcpSocket,SIGNAL(readyRead()),
            this,SLOT(slotReadData()));							//有数据可读时调用
    connect(m_tcpSocket,SIGNAL(disconnected()),
            this,SLOT(slotDisconnected()));						//用户连接断开时调用
}
mythread::~mythread()
{
	delete tcpSocket;
}
void mythread::run()//线程入口函数
{
    while(1)		//让线程一直执行
}
void mythread::slotReadData()//处理数据信息
{
	quint32 head = 0X5A5A5A5A;
	QByteArray msg = m_tcpSocket->readAll();
    QDataStream packet(msg);
    quint32 h;
    quint16 cmd;
    quint32 len;
    quint32 seq;
    quint32 channelNo;
    quint32 frequency;
    quint32 tail;
    arrayValue val;
    packet>>h>>cmd>>len>>seq>>channelNo>>frequency>>tail;
    if(h == head)
    {
        qDebug()<<"cmd:"<<cmd<<"len:"<<len<<"seq:"<<seq<<"channelNo:"<<channelNo<<"frequency:"<<frequency;
    }
    qint16 state = -1;
    QDataStream replay(&msg,QIODevice::WriteOnly);
    msg.resize(0);					//清空数据
    replay<<h<<quint16(0xC4)<<quint32(16)<<seq+1<<state<<tail;			//根据协议组装数据
    m_tcpSocket->write(msg);
}
void slotDisconnected()
{
	exit();
}

main_server.h

#ifndef MAIN_SERVER_H
#define MAIN_SERVER_H

#include <QMainWindow>
#include <QTcpSocket>
#include <QTcpServer>
#include "myserver.h"

namespace Ui {
class main_server;
}

class main_server : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit main_server(QWidget *parent = 0);
    ~main_server();
    
private:
    Ui::main_server *ui;
    myserver *my_server;
};

#endif // MAIN_SERVER_H

main_server.cpp

#include "main_server.h"
#include "ui_main_server.h"

main_server::main_server(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::main_server)
{
    ui->setupUi(this);
    my_server = new myserver();
    my_server->setMaxPendingConnections(5);//设置连接的最大数
    my_server->listen(QHostAddress::Any,8888);//监听连接,用于触发incomingConnection()

}

main_server::~main_server()
{
    delete ui;
    delete my_server;
}
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值