以下是一个基于 Qt C 的多线程发送请求客户端示例使用QThread实现多线程并发请求支持配置线程数量和请求地址适用于 HTTP 等基于 TCP 的请求场景功能说明多线程并发发送请求示例为 TCP 连接请求可扩展为 HTTP 等每个线程独立管理连接和数据发送支持配置线程数量、目标服务器 IP 和端口实时输出各线程的请求状态成功 / 失败代码实现1. 线程任务类处理单个请求cpp// RequestThread.h #ifndef REQUESTTHREAD_H #define REQUESTTHREAD_H #include QThread #include QTcpSocket #include QString #include QDebug class RequestThread : public QThread { Q_OBJECT public: // 构造函数传入目标IP、端口和线程ID explicit RequestThread(const QString ip, quint16 port, int threadId, QObject *parent nullptr) : QThread(parent), m_ip(ip), m_port(port), m_threadId(threadId) {} protected: // 线程执行函数发送请求 void run() override { QTcpSocket socket; // 连接服务器 socket.connectToHost(m_ip, m_port); if (!socket.waitForConnected(3000)) { // 超时3秒 qDebug() [线程 m_threadId ] 连接失败 socket.errorString(); return; } // 发送请求数据示例简单字符串 QString requestData Hello from thread QString::number(m_threadId); socket.write(requestData.toUtf8()); socket.flush(); // 等待服务器响应可选 if (socket.waitForReadyRead(2000)) { // 等待2秒响应 QByteArray response socket.readAll(); qDebug() [线程 m_threadId ] 发送成功收到响应 response; } else { qDebug() [线程 m_threadId ] 发送成功未收到响应; } // 断开连接 socket.disconnectFromHost(); } private: QString m_ip; // 目标服务器IP quint16 m_port; // 目标服务器端口 int m_threadId; // 线程ID用于区分日志 }; #endif // REQUESTTHREAD_H2. 客户端主窗口管理多线程cpp// MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include QMainWindow #include QPushButton #include QLineEdit #include QVBoxLayout #include QHBoxLayout #include QLabel #include QSpinBox #include QVector #include RequestThread.h class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent nullptr) : QMainWindow(parent) { // 设置窗口标题和大小 setWindowTitle(多线程请求客户端); setFixedSize(400, 200); // 控件初始化 QLabel* ipLabel new QLabel(服务器IP:); m_ipEdit new QLineEdit(127.0.0.1); // 默认本地IP QLabel* portLabel new QLabel(端口:); m_portEdit new QSpinBox(); m_portEdit-setRange(1, 65535); m_portEdit-setValue(8080); // 默认端口 QLabel* threadLabel new QLabel(线程数量:); m_threadSpin new QSpinBox(); m_threadSpin-setRange(1, 50); // 限制最大50线程 m_threadSpin-setValue(5); // 默认5线程 m_startBtn new QPushButton(开始发送请求); // 布局管理 QVBoxLayout* mainLayout new QVBoxLayout(); QHBoxLayout* ipLayout new QHBoxLayout(); ipLayout-addWidget(ipLabel); ipLayout-addWidget(m_ipEdit); QHBoxLayout* portLayout new QHBoxLayout(); portLayout-addWidget(portLabel); portLayout-addWidget(m_portEdit); QHBoxLayout* threadLayout new QHBoxLayout(); threadLayout-addWidget(threadLabel); threadLayout-addWidget(m_threadSpin); mainLayout-addLayout(ipLayout); mainLayout-addLayout(portLayout); mainLayout-addLayout(threadLayout); mainLayout-addWidget(m_startBtn); // 设置主窗口中心部件 QWidget* centralWidget new QWidget(); centralWidget-setLayout(mainLayout); setCentralWidget(centralWidget); // 连接按钮点击信号 connect(m_startBtn, QPushButton::clicked, this, MainWindow::startRequests); } private slots: // 启动多线程请求 void startRequests() { QString ip m_ipEdit-text(); quint16 port m_portEdit-value(); int threadCount m_threadSpin-value(); qDebug() 开始发送请求IP ip , 端口 port , 线程数 threadCount; // 创建并启动多个线程 m_threads.clear(); // 清空之前的线程 for (int i 0; i threadCount; i) { RequestThread* thread new RequestThread(ip, port, i 1); // 线程ID从1开始 m_threads.append(thread); thread-start(); // 启动线程执行run()函数 } // 线程结束后自动释放避免内存泄漏 for (auto thread : m_threads) { connect(thread, RequestThread::finished, thread, RequestThread::deleteLater); } } private: QLineEdit* m_ipEdit; // 服务器IP输入框 QSpinBox* m_portEdit; // 端口输入框 QSpinBox* m_threadSpin; // 线程数量选择 QPushButton* m_startBtn; // 开始按钮 QVectorRequestThread* m_threads; // 线程列表用于管理 }; #endif // MAINWINDOW_H3. 程序入口cpp// main.cpp #include MainWindow.h #include QApplication int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }代码说明线程任务类RequestThread继承QThread重写run()函数实现具体请求逻辑建立 TCP 连接connectToHost发送数据write等待响应waitForReadyRead断开连接disconnectFromHost主窗口MainWindow提供 UI 界面配置服务器 IP、端口和线程数量点击 “开始发送请求” 时创建指定数量的RequestThread并启动线程结束后通过deleteLater自动释放避免内存泄漏扩展性若需发送 HTTP 请求可将QTcpSocket替换为QNetworkAccessManager需在run()中使用事件循环或改用QObjectmoveToThread模式可添加请求内容编辑框自定义发送的数据可增加请求间隔设置避免瞬间高并发压垮服务器使用方法确保目标服务器已启动并监听指定端口如用nc -l 8080在本地启动简单 TCP 服务器测试输入服务器 IP、端口设置线程数量点击 “开始发送请求”在控制台查看各线程的请求状态成功 / 失败信息此示例通过多线程实现并发请求适合需要模拟多客户端并发访问的场景实际使用时可根据需求扩展协议如 HTTP、MQTT 等和错误处理逻辑。