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;
}