qt 多线程tcp服务端
时间: 2023-08-28 16:06:08 浏览: 130
QT/C++ Tcp服务端(多线程内置自动机制,自动发送数据包,响应速度快)
5星 · 资源好评率100%
以下是Qt多线程TCP服务端的实现示例:
1. 创建一个Qt控制台应用程序。
2. 在项目中添加一个新的类来实现TCP服务器。我们将称之为"TcpServer"。
3. 在TcpServer类的头文件中,添加以下内容:
```
#ifndef TCPSERVER_H
#define TCPSERVER_H
#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>
#include <QThread>
class TcpServer : public QObject
{
Q_OBJECT
public:
explicit TcpServer(QObject *parent = nullptr);
public slots:
void newConnection(); //处理新连接
void readData(); //读取数据
void socketDisconnected(); //处理断开连接
private:
QTcpServer *m_server = nullptr; //TCP服务器
QList<QTcpSocket*> m_sockets; //已连接的TCP套接字
};
#endif // TCPSERVER_H
```
4. 在TcpServer类的源文件中,实现以下内容:
```
#include "tcpserver.h"
TcpServer::TcpServer(QObject *parent) : QObject(parent)
{
m_server = new QTcpServer(this);
connect(m_server, &QTcpServer::newConnection, this, &TcpServer::newConnection);
if (!m_server->listen(QHostAddress::Any, 1234)) {
qWarning() << "Could not start server";
} else {
qDebug() << "Listening on port 1234...";
}
}
void TcpServer::newConnection()
{
QTcpSocket *socket = m_server->nextPendingConnection();
connect(socket, &QTcpSocket::readyRead, this, &TcpServer::readData);
connect(socket, &QTcpSocket::disconnected, this, &TcpServer::socketDisconnected);
m_sockets.append(socket);
}
void TcpServer::readData()
{
QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
if (!socket) {
return;
}
QByteArray data = socket->readAll();
qDebug() << "Received data:" << data;
//将数据发送回客户端
socket->write(data);
}
void TcpServer::socketDisconnected()
{
QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
if (!socket) {
return;
}
m_sockets.removeOne(socket);
socket->deleteLater();
}
```
5. 在main.cpp文件中,实例化TcpServer类并将其移动到一个新的线程中:
```
#include <QCoreApplication>
#include <QThread>
#include "tcpserver.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//创建TcpServer对象
TcpServer *server = new TcpServer();
//创建新线程并将服务器对象移动到该线程
QThread *thread = new QThread();
server->moveToThread(thread);
thread->start();
return a.exec();
}
```
这样,我们就创建了一个基本的Qt多线程TCP服务端。当客户端连接到服务器时,服务器将打印出"Listening on port 1234..."。当客户端发送数据时,服务器将打印出接收到的数据并将其发送回客户端。当客户端断开连接时,服务器将从已连接的套接字列表中删除该套接字。
阅读全文