QT/C++ TCP/IP服务端程序
适用于Linux和Windows,QT4/QT5,且实测不会阻塞崩溃。
.h文件
#include <QObject>
#include <QThread>
#include <QString>
#include <QDebug>
#include <QTcpSocket>
#include <QHostAddress>
#include <QByteArray>//#define _Linux
#define _Win#ifdef _Linux
#include <unistd.h>
#else
#include <windows.h>
#endifenum MessageType{ConnectRequest,ConnectSuccess,DisConnect,DataRequest};class TCPSocketThread : public QObject
{Q_OBJECT
public:explicit TCPSocketThread(QObject *parent = nullptr);~TCPSocketThread(void);void setFlag(bool flag = true);private:QTcpSocket *mTcpSocket;bool isStop;bool isConnected;void ConnectServer();public slots:void doWork();void writeData(QString str);private slots:void readData();void ConnectedSuccess();void disConnectedSuccess();void onError(QAbstractSocket::SocketError);signals:void signal_connectsuccess(QString str);void signal_back(QString str);
};
.cpp
#include "tcpsocketthread.h"#include <QApplication>TCPSocketThread::TCPSocketThread(QObject *parent) : QObject(parent)
{isStop = false;isConnected = false;mTcpSocket = new QTcpSocket(this);connect(mTcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(onError(QAbstractSocket::SocketError)));connect(mTcpSocket,SIGNAL(connected()),this,SLOT(ConnectedSuccess()));connect(mTcpSocket,SIGNAL(disconnected()),this,SLOT(disConnectedSuccess()));connect(mTcpSocket,SIGNAL(readyRead()),this,SLOT(readData()));
}TCPSocketThread::~TCPSocketThread(void)
{
}void TCPSocketThread::doWork()
{while(!isStop){if(!isConnected)ConnectServer();QApplication::processEvents();}
}void TCPSocketThread::setFlag(bool flag)
{isStop = flag;
}void TCPSocketThread::ConnectServer()
{QString serverIp = "192.168.137.10";qint16 serverPort = 1234;mTcpSocket->abort();mTcpSocket->connectToHost(QHostAddress(serverIp),serverPort);mTcpSocket->waitForConnected();
}void TCPSocketThread::ConnectedSuccess()
{isConnected = true;emit signal_connectsuccess("connected");
}
void TCPSocketThread::disConnectedSuccess()
{isConnected = false;emit signal_connectsuccess("disconnected");
}
void TCPSocketThread::onError(QAbstractSocket::SocketError)
{emit signal_connectsuccess(mTcpSocket->errorString());
}
void TCPSocketThread::writeData(QString str)
{//qDebug() << "write";mTcpSocket->write(str.toUtf8());// mTcpSocket->waitForBytesWritten();
}
void TCPSocketThread::readData()
{//qDebug() << "read";QByteArray buf = mTcpSocket->readAll();//mTcpSocket->waitForReadyRead();if(buf.size() < 1)return;emit signal_back(buf.data());
}
主线程:
tcpClient::tcpClient(QWidget *parent, Qt::WFlags flags): QWidget(parent, flags)
{ui.setupUi(this);mTcpSocketThread = new TCPSocketThread();mThread = new QThread();mTcpSocketThread->setParent(nullptr);mTcpSocketThread->moveToThread(mThread);connect(this,SIGNAL(StartThread()),mTcpSocketThread, SLOT(doWork()));connect(this,SIGNAL(signal_write()),mTcpSocketThread, SLOT(writeData()));connect(mTcpSocketThread,SIGNAL(signal_connectsuccess()),this,SLOT(slot_handle_state()));connect(mTcpSocketThread,SIGNAL(signal_back()),this,SLOT(slot_handle_data()));if(!mThread->isRunning()){mTcpSocketThread->setFlag(false);mThread->start();emit StartThread();//enter thread}
}