【Qt】QTcpServer/QTcpSocket通信

这里写目录标题

1.pro文件

QT       += network

2.服务器

h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>

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 on_setListenButton_clicked();
    void on_sendMsgButton_clicked();

private:
    Ui::MainWindow *ui;
    QTcpServer *tcpServer;
    QTcpSocket *tcpSocket;
};
#endif // MAINWINDOW_H

cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->portEdit->setText("8899");
    setWindowTitle("服务器");

    // 创建监听服务器的对象
    tcpServer = new QTcpServer(this);
    connect(tcpServer,&QTcpServer::newConnection,this, [=](){
        tcpSocket = tcpServer->nextPendingConnection(); // 有新的客户端连接,得到一个用于通信的服务器对象
        ui->statusLabel->setText("已连接");

        // 检测是否可以接收数据
        connect(tcpSocket,&QTcpSocket::readyRead,this,[=](){
            QByteArray data = tcpSocket->readAll(); // data为client发来的数据
            ui->recordEdit->append("客户端:" + data);
        });

        connect(tcpSocket,&QTcpSocket::disconnected,this,[=](){
            tcpSocket->close();
            tcpSocket->deleteLater();
            ui->statusLabel->setText("未连接");
            ui->setListenButton->setDisabled(false);
        });
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_setListenButton_clicked()
{
    unsigned short port = ui->portEdit->text().toUShort();
    tcpServer->listen(QHostAddress::Any, port); // 监听port
    ui->setListenButton->setDisabled(true);
}

void MainWindow::on_sendMsgButton_clicked()
{
    QString msg = ui->messageEdit->toPlainText();
    tcpSocket->write(msg.toUtf8());
    ui->recordEdit->append("服务器:" + msg);
}

3.客户端

h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpSocket>
#include <QHostAddress>

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 on_sendMsgButton_clicked();
    void on_connectButton_clicked();
    void on_disconnectButton_clicked();

private:
    Ui::MainWindow *ui;
    QTcpSocket *tcpSocket;
};
#endif // MAINWINDOW_H

cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->portEdit->setText("8899");
    ui->ipEdit->setText("127.0.0.1");
    setWindowTitle("客户端");
    ui->disconnectButton->setDisabled(true);

    // 创建监听服务器的对象
    tcpSocket = new QTcpSocket();

    connect(tcpSocket,&QTcpSocket::readyRead,this,[=](){
        QByteArray data = tcpSocket->readAll(); // data为client发来的数据
        ui->recordEdit->append("服务器:" + data);
    });

    connect(tcpSocket,&QTcpSocket::disconnected, this, [=](){
        tcpSocket->close();
        tcpSocket->deleteLater();
        ui->statusLabel->setText("未连接");
        ui->recordEdit->append("断开连接");
        ui->connectButton->setDisabled(false);
        ui->disconnectButton->setEnabled(false);
    });

    connect(tcpSocket,&QTcpSocket::connected, this, [=](){
        ui->statusLabel->setText("已连接");
        ui->recordEdit->append("连接成功");
        ui->connectButton->setDisabled(true);
        ui->disconnectButton->setEnabled(true);
    });

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_sendMsgButton_clicked()
{
    QString msg = ui->messageEdit->toPlainText();
    tcpSocket->write(msg.toUtf8());
    ui->recordEdit->append("客户端:" + msg);
}

void MainWindow::on_connectButton_clicked()
{
    QString ip = ui->ipEdit->text();
    unsigned short port = ui->portEdit->text().toUShort();
    tcpSocket->connectToHost(QHostAddress(ip), port);
}

void MainWindow::on_disconnectButton_clicked()
{
    tcpSocket->close();
    ui->connectButton->setDisabled(false);
    ui->disconnectButton->setEnabled(false);
}

相关推荐

  1. Socket通信

    2024-07-20 07:56:08       58 阅读
  2. linux通信

    2024-07-20 07:56:08       44 阅读
  3. Netlink通信

    2024-07-20 07:56:08       45 阅读
  4. SPI<span style='color:red;'>通信</span>

    SPI通信

    2024-07-20 07:56:08      46 阅读
  5. TCP<span style='color:red;'>通信</span>

    TCP通信

    2024-07-20 07:56:08      26 阅读
  6. 计算机通信

    2024-07-20 07:56:08       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 07:56:08       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 07:56:08       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 07:56:08       45 阅读
  4. Python语言-面向对象

    2024-07-20 07:56:08       55 阅读

热门阅读

  1. Compose_Modifier 修饰符的常见使用

    2024-07-20 07:56:08       20 阅读
  2. 题解:T480718 eating

    2024-07-20 07:56:08       18 阅读
  3. 云计算的发展历程与边缘计算

    2024-07-20 07:56:08       15 阅读
  4. Ruby教程

    2024-07-20 07:56:08       19 阅读
  5. Spark学习之SparkSQL

    2024-07-20 07:56:08       15 阅读
  6. 探索Transformer:依存句法分析的新纪元

    2024-07-20 07:56:08       20 阅读
  7. AI学习指南机器学习篇-t-SNE的优缺点

    2024-07-20 07:56:08       10 阅读
  8. 部署django

    2024-07-20 07:56:08       16 阅读
  9. Leetcode 202. 快乐数

    2024-07-20 07:56:08       17 阅读
  10. bug等级和优先级

    2024-07-20 07:56:08       15 阅读