———————-*.pro—————————————-
QT += network
——————–mainwindow.h———————————-
#pragma once
#include
#include “TcpServer.h”
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void onStartButtonClicked();
void onStopButtonClicked();
void onSendToSelectedButtonClicked();
void onBroadcastButtonClicked();
void onClientConnected(const QString &clientInfo);
void onClientDisconnected(const QString &clientInfo);
void onClientRcvData(const QByteArray &data);
private:
Ui::MainWindow *ui;
TcpServer *server;
};
————————–TcpServer.h———————————–
#pragma once
#include
#include
#include
#include
#include
class TcpServer : public QTcpServer {
Q_OBJECT
public:
explicit TcpServer(QObject *parent = nullptr);
void startServer();
void stopServer();
void sendToClient(qintptr socketDescriptor, const QString &message);
void broadcastMessage(const QString &message);
signals:
void clientConnected(const QString &clientInfo);
void clientDisconnected(const QString &clientInfo);
void clientRcvData(const QByteArray &data);
protected:
void incomingConnection(qintptr socketDescriptor) override;
private:
QMap
QMap
};
——————————main.cpp—————————————
#include “mainwindow.h”
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
————————mainwindow.cpp————————————-
#include “mainwindow.h”
#include “ui_mainwindow.h”
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, server(new TcpServer(this)) {
ui->setupUi(this);
connect(ui->startButton, &QPushButton::clicked, this, &MainWindow::onStartButtonClicked);
connect(ui->stopButton, &QPushButton::clicked, this, &MainWindow::onStopButtonClicked);
connect(ui->sendToSelectedButton, &QPushButton::clicked, this, &MainWindow::onSendToSelectedButtonClicked);
connect(ui->broadcastButton, &QPushButton::clicked, this, &MainWindow::onBroadcastButtonClicked);
connect(server, &TcpServer::clientConnected, this, &MainWindow::onClientConnected);
connect(server, &TcpServer::clientDisconnected, this, &MainWindow::onClientDisconnected);
connect(server, &TcpServer::clientRcvData, this, &MainWindow::onClientRcvData);
}
MainWindow::~MainWindow() {
delete ui;
}
void MainWindow::onStartButtonClicked() {
server->startServer();
}
void MainWindow::onStopButtonClicked() {
server->stopServer();
}
void MainWindow::onSendToSelectedButtonClicked()
{
QListWidgetItem *selectedItem = ui->clientListWidget->currentItem();
if (selectedItem)
{
qDebug()<
qintptr socketDescriptor = selectedItem->text().toInt();
server->sendToClient(socketDescriptor, ui->messageInput->toPlainText());
}
}
void MainWindow::onBroadcastButtonClicked() {
server->broadcastMessage(ui->messageInput->toPlainText());
}
void MainWindow::onClientConnected(const QString &clientInfo) {
ui->clientListWidget->addItem(clientInfo);
}
void MainWindow::onClientDisconnected(const QString &clientInfo) {
QList
for (QListWidgetItem *item : items) {
delete ui->clientListWidget->takeItem(ui->clientListWidget->row(item));
}
}
void MainWindow::onClientRcvData(const QByteArray &data)
{
ui->textEdit->setText(“111”);
}
———————————TcpServer.cpp——————————–
#include “TcpServer.h”
#include
#include
TcpServer::TcpServer(QObject *parent) : QTcpServer(parent) {}
void TcpServer::startServer() {
if (!listen(QHostAddress::Any, 12345)) {
qCritical() << "Server could not start!";
} else {
qDebug() << "Server started on port 12345";
}
}
void TcpServer::stopServer() {
close();
qDeleteAll(clients);
qDeleteAll(clientThreads);
}
void TcpServer::incomingConnection(qintptr socketDescriptor)
{
QThread *clientThread = new QThread;
QTcpSocket *clientSocket = new QTcpSocket;
clientSocket->setSocketDescriptor(socketDescriptor);
clientSocket->moveToThread(clientThread);
connect(clientThread, &QThread::started, [this,clientSocket,clientThread]()
{
connect(clientSocket, &QTcpSocket::readyRead, [this,clientSocket,clientThread]()
{
QString clientIpAddress = clientSocket->peerAddress().toString();
qDebug() << "Client connected from IP address:" << clientIpAddress;
QByteArray data = clientSocket->readAll();
// Handle data
qDebug()<<"Handle data";
int cpu_id = sched_getcpu(); // 获取当前线程运行的 CPU 核编号
qDebug() << "Thread is running on CPU core:" << cpu_id;
emit clientRcvData(data);
});
connect(clientSocket, &QTcpSocket::disconnected, clientSocket, &QTcpSocket::deleteLater);
});
connect(clientSocket, &QTcpSocket::disconnected, [this, socketDescriptor]()
{
clientThreads.remove(socketDescriptor);
clients.remove(socketDescriptor);
emit clientDisconnected(QString::number(socketDescriptor));
});
connect(clientThread, &QThread::finished, clientThread, &QThread::deleteLater);
clientThreads.insert(socketDescriptor, clientThread);
clients.insert(socketDescriptor, clientSocket);
clientThread->start();
emit clientConnected(QString::number(socketDescriptor));
}
void TcpServer::sendToClient(qintptr socketDescriptor, const QString &message)
{
if (clients.contains(socketDescriptor))
{
clients[socketDescriptor]->write(message.toUtf8());
}
}
void TcpServer::broadcastMessage(const QString &message)
{
for (QTcpSocket *clientSocket : clients.values())
{
clientSocket->write(message.toUtf8());
}
}
——————————–*.ui——————————————————-
broadcastButton – QPushButton
sendToSelectedButton
startButton
stopButton
clientListWidget – QListWidget
messageInput – QTextEdit
textEdit