Qt TCP简单通信

这篇具有很好参考价值的文章主要介绍了Qt TCP简单通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Qt实现TCP通信

在.pro文件中添加网络模块 Qt += network

服务端:

1. 创建QTcpServer 对象,用于监听,创建套接字等;

QTcpServer * serverSocket = new QTcpServer(this);

2.进行监听,通过QTcpServer对象 QTcpServer::listen();

bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);
例子:
    // 获取单行输入框输入的数为端口号
    short port = ui->lineEdit->text().toInt();
    tcpServer->listen(QHostAddress::Any, port); // QHostAddress::Any表示自动绑定

3.使用信号槽,connect(), 判断是否有客户端来连接,QTcpServer::newConnection();

[signal] void QTcpServer::newConnection()

例子:
    // 3.基于 QTcpServer::newConnection() 信号检测是否有新客户端连接
    connect(tcpServer, &QTcpServer::newConnection, this, [=]()
    {
        // 创建用于通信的套接字
        // 4.如果有新的客户端连接调用 QTcpSocket* QTcpServer::nextPendingConnection()
        // 在通信编辑框中显示成功与客户端取得连接
        // 5.准备与客户端通信
        // 6.判断客户端是否断开连接    
    });

4.在步骤3的基础上,创建套接字,QTcpSocket socketServer = QTcpServer::nextPendingConnection();

5.在步骤3的基础上,使用信号槽connect(),判断是否接收客户端发了 的信息QTcpSocket::readyRead();

6. 在步骤5的基础上,通过套接字调用readAll() ,读取客户端发来的信息;

7.在步骤3的基础上,通过套接字判断客户端是否下线,关闭套接字;

客户端:

1. 创建套接字对象,用于通信 QTcpSocket *clientSocket = new QTcpSocket(this);

2. 调用信号槽,connect() ,判断是否成功连接服务端connected;

3. 调用信号槽,connect() , 判断是否接受来着服务端发来的信息 readyRead();

4. 在步骤3的基础上,利用套接字对象调用readAll() 方法,读取服务端发来的消息;

5. 利用套接字调用write() 方法,将消息发送给服务端;

6. 调用信号槽,connect() , 判断是否断开连接,释放套接字;

服务端代码:

MainWindow.cpp

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

#include "QDebug"
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 设置窗口名称
    setWindowTitle(QString("Server-TCP"));
    setWindowIcon(QIcon(QPixmap("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本.png")));

    // 刚进来是将连接状态图片置成灰色的
    m_pixmap.load(QString("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本_副本.png"));

    // 2.socket 通信
    //tcpSocket = new QTcpSocket();
    // 获取套接字
    // 服务端通信流程
    // 1.创建套接字服务器 QTcpServer对象
    tcpServer = new QTcpServer(this);
    // 2.通过QTcpServer对象设置监听,即QTcpServer::listen()
    // 3.基于 QTcpServer::newConnection() 信号检测是否有新客户端连接
    connect(tcpServer, &QTcpServer::newConnection, this, [=]()
    {
        // 成功连接则切换图片颜色
        m_pixmap.load(QString("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本.png"));

        // 创建用于通信的套接字
        // 4.如果有新的客户端连接调用 QTcpSocket* QTcpServer::nextPendingConnection()
        tcpSocket = tcpServer->nextPendingConnection();
        // 在通信编辑框中显示成功与客户端取得连接
        ui->textEdit->append("成功与客户端取得连接!!!");
        // 5.准备与客户端通信
        connect(tcpSocket, &QTcpSocket::readyRead, this, [=]()
        {
            // 调用套接字读取客户端发的数据
            QString acceptText = tcpSocket->readAll(); // QByteArray 可以强制转成 QString
            // 将读取到的数据写到通信编辑框中
            ui->textEdit->append("客户端say:" + acceptText);
        });

        // 6.判断客户端是否断开连接
        connect(tcpSocket, &QTcpSocket::disconnected, this, [=]()
        {
            //QMessageBox(, QMessageBox::Warning, );
            QMessageBox::warning(this, "连接状态", "客户端已断开连接");
            tcpSocket->deleteLater();
            // 将连接状态图片置成灰色的
            m_pixmap.load(QString("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本_副本.png"));

            //tcpServer->deleteLater();
        });

    });

    // 1.状态栏显示信息
    showMessageStatusBar();
}

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

// 状态栏添加提示信息
void MainWindow::showMessageStatusBar()
{
    // 设置窗口名称
    //QWidget::windowTitleChanged("Server-TCP");
    //ui->statusBar->setWindowTitle();

    // 通过加载QLable给状态栏显示文本
    QLabel *pLable = new QLabel();
    QLabel *lableText = new QLabel(QString::fromUtf8("连接状态:"));

    //lableText->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
    //pLable->setMinimumWidth(this->width()/2);

    //= new QLabel(QString::fromUtf8("连接状态:"));
    // 设置lable标签的大小
    //pLable->setMinimumSize(pLable->sizeHint());
    pLable->setFixedSize(30, 30);

    m_pixmap.scaled(pLable->width(), pLable->height());
    // 显示图片
    pLable->setPixmap(m_pixmap);
    // 按比例缩小图片

    //pLable->setFixedSize(QSize(50,50));
    // 设置状态栏样式
    //ui->statusBar->setStyleSheet(QString("QString::item{border:0px"));  // 不显示边框
    // 将标签加入到状态栏中
    ui->statusBar->addWidget(lableText);
    ui->statusBar->addPermanentWidget(pLable);//
}

// 处理点击启动服务器,进行监听
void MainWindow::on_pushButton_clicked()
{
    //qDebug() << "点击了 启动服务器按钮\n";
    // 获取输入框输入的数为端口号
    short port = ui->lineEdit->text().toInt();
    tcpServer->listen(QHostAddress::Any, port);
}

// 将数据发生给客户端
void MainWindow::on_pushButton_2_clicked()
{
    // 将发送数据编辑栏的文本通过套接字发生给客户端
    tcpSocket->write(ui->textEdit_2->toPlainText().toUtf8());
    // 需要将要发生的数据写到通信编辑栏中
    ui->textEdit->append("服务端say:" + ui->textEdit_2->toPlainText().toUtf8());
    // 清空发送消息编辑框
    ui->textEdit_2->clear();
}

mainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

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


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    // 在状态栏中设置文本+图标
    void showMessageStatusBar();

    QTcpServer* tcpServer;
    QTcpSocket* tcpSocket;

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
    // 用于加载图片路径
    QPixmap m_pixmap;
};

#endif // MAINWINDOW_H

程序UI

Qt TCP简单通信

 客户端:

client.cpp

#include "client.h"
#include "ui_client.h"

Client::Client(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Client)
{
    ui->setupUi(this);

    // 通信流程
    //1、创建套接字对象
    clientSocket = new QTcpSocket(this);
    //2、调用QTcpSocket::connectToHost() 绑定服务端IP和端口

    //3、通过套接字与服务端进行通信 收发
    // 判断是否成功连接服务端 开始读取服务端发来的信息
    connect(clientSocket, &QTcpSocket::readyRead, this, [=]()
    {
        // 通过套接字读取发来的信息
        QByteArray receiveAll = clientSocket->readAll();
        // 将获取到的信息显示到通信编辑栏中
        ui->textEdit_Record->append("服务端say:" + receiveAll);
    });

    // 开始的时候断开连接按钮置成不可用状态
    ui->disConBtn->setEnabled(false);

    // 判断是否连接成功
    connect(clientSocket, &QTcpSocket::connected, this, [=]()
    {
        // 将成功连接显示到通信记录编辑栏中
        ui->textEdit_Record->append("成功与服务端取得连接!!!");
        // 将断开连接置成可用状态
        ui->disConBtn->setEnabled(true);
    });

    // 判断是否断开连接
    connect(clientSocket, &QTcpSocket::disconnected, this, [=]()
    {
        // 将服务端断开连接显示到通信编辑框中
        ui->textEdit_Record->append("注意服务端已断开连接!!!");
        // 将连接服务端按钮置成不可用状态
        ui->conBtn->setEnabled(false);
    });

}

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

// 点击按钮连接服务器,绑定地址与端口
void Client::on_conBtn_clicked()
{
    // 获取编辑框中的ip和端口
    unsigned short port = ui->lineEdit_port->text().toUShort();
    QString addr = ui->lineEdit_add->text();
    clientSocket->connectToHost(addr, port);
    // 需要将按钮置成不可用状态
    ui->conBtn->setEnabled(false);
}

// 断开连接
void Client::on_disConBtn_clicked()
{
    //clientSocket->disconnected();
    // 关闭套接字
    clientSocket->close();
    // 将客户端断开连接提示显示到通信编辑框中
    ui->textEdit_Record->append("注意客户端已断开连接!!!");
    // 将连接服务端按钮置成可用状态
    ui->conBtn->setEnabled(true);
}

// 点击按钮发送数据
void Client::on_sendBtn_clicked()
{
    // 获取发送信息编辑框的文本
    //ui->textEdit_Send->toPlainText().toUtf8();

    // 将获取到的信息发送给服务端
    clientSocket->write(ui->textEdit_Send->toPlainText().toUtf8());
    // 将发送的信息显示到通信记录编辑框中
    ui->textEdit_Record->append(ui->textEdit_Send->toPlainText().toUtf8());
    // 需要将发送编辑框清空缓存
    ui->textEdit_Send->clear();
}

client.h

#ifndef CLIENT_H
#define CLIENT_H

#include <QMainWindow>
#include <QTcpSocket>

namespace Ui {
class Client;
}

class Client : public QMainWindow
{
    Q_OBJECT

public:
    explicit Client(QWidget *parent = nullptr);
    ~Client();

private slots:
    void on_conBtn_clicked();

    void on_disConBtn_clicked();

    void on_sendBtn_clicked();

private:
    Ui::Client *ui;

    // 创建套接字
    QTcpSocket * clientSocket;
};

#endif // CLIENT_H

程序UI

Qt TCP简单通信文章来源地址https://www.toymoban.com/news/detail-508002.html

到了这里,关于Qt TCP简单通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity】Socket网络通信(TCP) - 实现简单的多人聊天功能

    多客户端连接服务器其原理是在服务端保存客户端连入后与客户端通信的socket,由于等待客户端连接会阻塞主线程,所以结合多线程就能实现多客户端连入功能。多人聊天只需要将A客户端发来的消息,转发给除A客户端外的其他客户端,即可实现。如果你还不怎么熟悉服务端

    2024年02月03日
    浏览(62)
  • Qt TCP简单通信

    在.pro文件中添加网络模块 Qt += network 1. 创建QTcpServer 对象,用于监听,创建套接字等; 2.进行监听,通过QTcpServer对象 QTcpServer::listen(); 3.使用信号槽,connect(), 判断是否有客户端来连接,QTcpServer::newConnection(); 4.在步骤3的基础上,创建套接字,QTcpSocket socketServer = QTcpServer:: nex

    2024年02月11日
    浏览(34)
  • 「网络编程」第二讲:网络编程socket套接字(三)_ 简单TCP网络通信程序的实现

    「前言」文章是关于网络编程的socket套接字方面的,上一篇是网络编程socket套接字(二),下面开始讲解!  「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 「枫叶先生有点文青病」「每篇一句」 I do not know where to go,but I have been on the road. 我不知

    2024年02月11日
    浏览(50)
  • QT网络通信-TCP、UDP通信

    时间记录:2024/1/17 pro文件添加模块network (1)创建TCP服务器对象 QTcpServer (2)为 QTcpServer 对象的 newConnection 信号绑定槽,用来监听TCP客户端的新连接,有新的客户端连接便会触发此信号 (3)使用 nextPendingConnection 方法获取连接的Tcp客户端对象 QTcpSocket (4)为 QTcpSocket 的 r

    2024年01月18日
    浏览(57)
  • QT 中基于 TCP 的网络通信 (备查)

    基于 TCP 的套接字通信需要用到两个类: 1) QTcpServer :服务器类,用于监听客户端连接以及和客户端建立连接。 2) QTcpSocket :通信的套接字类,客户端、服务器端都需要使用。 这两个套接字通信类都属于网络模块 network 。 TCP协议是 双向连接,双向断开,即 三次握手,四次

    2024年02月03日
    浏览(54)
  • QT C++ 基于TCP通信的网络聊天室

    .ui .pro 在pro文件中添加network库 .h .main .cpp .ui .pro 在pro文件中添加network库 .h .main .cpp        

    2024年02月09日
    浏览(56)
  • 基于C++和Qt封装一个简单的socket(TCP/IP)通信UI界面

            最近在学习TCP/IP和socket套接字的有关知识,了解了三次握手四次挥手,TCP协议等等一大堆知识,但纸上得来终觉浅。网络上C++代码实现socket通信的资料很多,方便学习,于是想到自己用Qt实现一个基础的具有网络通信收发功能的服务端UI软件。进入正题:        

    2024年02月08日
    浏览(53)
  • 【Qt专栏】Qt实现TCP服务端和客户端通信

    网络通信是程序员必须会的一项生存技能,这里简单的实现了服务端和客户端通信的两个小示例,代码可以直接拿来用,开发环境是Qt5.9.6。 1.项目架构 2.tcpserver.h文件 3.tcpserver.cpp文件 4.测试效果 1.项目架构 2.tcpserver.h文件 3.tcpserver.cpp文件 4.测试效果 好了,两个小程序写完并

    2024年02月12日
    浏览(36)
  • 基于QT的TCP通信实现(TCPServer和TCPClient)

    近期因为测试需要用到 TCPServer(TCP服务端) 和 TCPClient(TCP客户端) 来进行通信和数据的发送以及接受,所以用QT分别写了TCP服务端和TCP客户端,本文分享以下基于QT开发TCPServer和TCPClient的经验, 文中包括源码,在文末处包含项目的源码文件 。 TCPServer可以绑定一个ip地址并监

    2024年02月15日
    浏览(32)
  • 【网络原理】使用Java基于TCP搭建简单客户端与服务器通信

    TCP服务器与客户端的搭建需要借助以下API ServerSocket 是创建TCP服务端Socket的API。 ServerSocket 构造方法 : 方法签名 方法说明 ServerSocket(int port) 创建一个服务端流套接字Socket,并绑定到指定端口 ServerSocket 方法: 方法签名 方法说明 Socket accept() 开始监听指定端口(创建时绑定的端

    2024年03月12日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包