QT网络通信TCP客户端实现详解

Rae ·
更新时间:2024-09-20
· 1039 次阅读

本文实例为大家分享了QT网络通信TCP客户端实现的具体代码,供大家参考,具体内容如下

QT中基于TCP套接字的网络通信需要用到两个类

QTcpServer:服务器类,用于监听客户端连接和客户端建立连接

QTcpSocket:通信套接字类,客户端和服务端都需要使用*

这两个类都属于网络通信的network
需要在工程路径下添加network

QT += core gui network

服务器

mainwindow.cpp

#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) :     QMainWindow(parent),     ui(new Ui::MainWindow) {     ui->setupUi(this);     ui->port->setText("8899");     ui->ip->setText("127.0.0.1");     setWindowTitle("客户端");     m_tcp = new QTcpSocket(this);     connect(m_tcp,&QTcpSocket::readyRead,this,[=](){         QByteArray data = m_tcp->readAll();         ui->record->append("服务端:"+data);     });      connect(m_tcp,&QTcpSocket::disconnected,this,[=]()     {          ui->connect->setEnabled(true);          ui->disconnect->setDisabled(true);         m_tcp->close();  //       m_tcp->deleteLater();//状态释放         m_status->setPixmap(QPixmap(":/red.png").scaled(20,20));         ui->record->append("断开连接");     });      connect(m_tcp,&QTcpSocket::connected,this,[=](){        m_status->setPixmap(QPixmap(":/green.png").scaled(20,20));        ui->connect->setDisabled(true);        ui->disconnect->setEnabled(true);        ui->record->append("连接成功");      });     //     ui->disconnect->setDisabled(true);     m_status = new QLabel;     m_status->setPixmap(QPixmap(":/red.png").scaled(20,20));     ui->statusBar->addWidget(new QLabel("连接状态:"));     ui->statusBar->addWidget(m_status); } MainWindow::~MainWindow() {     delete ui; } void MainWindow::on_sendMsg_clicked() {    QString msg = ui->message->toPlainText();     m_tcp->write(msg.toUtf8());     ui->record->append("客户端:"+msg); } void MainWindow::on_connect_clicked() {     QString ip=ui->ip->text();     unsigned short port=ui->port->text().toUShort();     m_tcp->connectToHost(QHostAddress(ip),port);     ui->connect->setEnabled(false);     ui->disconnect->setDisabled(false); } void MainWindow::on_disconnect_clicked() {     m_tcp->close();     ui->connect->setEnabled(true);     ui->disconnect->setDisabled(true); }

mainwindow.h

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTcpSocket> #include <Qlabel> #include <QHostAddress> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow {     Q_OBJECT public:     explicit MainWindow(QWidget *parent = nullptr);     ~MainWindow(); private slots:     void on_sendMsg_clicked();     void on_connect_clicked();     void on_disconnect_clicked(); private:     Ui::MainWindow *ui;     QTcpSocket  *m_tcp;     QLabel     *m_status; }; #endif // MAINWINDOW_H

ui文件

<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0">  <class>MainWindow</class>  <widget class="QMainWindow" name="MainWindow">   <property name="geometry">    <rect>     <x>0</x>     <y>0</y>     <width>428</width>     <height>606</height>    </rect>   </property>   <property name="windowTitle">    <string>MainWindow</string>   </property>   <widget class="QWidget" name="centralWidget">    <layout class="QVBoxLayout" name="verticalLayout">     <item>      <widget class="QWidget" name="widget" native="true">       <layout class="QGridLayout" name="gridLayout">        <item row="1" column="0">         <widget class="QLabel" name="label_3">          <property name="text">           <string>IP:</string>          </property>         </widget>        </item>        <item row="0" column="0">         <widget class="QLabel" name="label">          <property name="text">           <string>端口:</string>          </property>         </widget>        </item>        <item row="1" column="1">         <widget class="QLineEdit" name="ip"/>        </item>        <item row="1" column="2">         <widget class="QPushButton" name="disconnect">          <property name="text">           <string>断开连接</string>          </property>         </widget>        </item>        <item row="0" column="1">         <widget class="QLineEdit" name="port"/>        </item>        <item row="0" column="2">         <widget class="QPushButton" name="connect">          <property name="text">           <string>连接服务器</string>          </property>         </widget>        </item>       </layout>      </widget>     </item>     <item>      <widget class="QGroupBox" name="groupBox">       <property name="title">        <string>历史信息</string>       </property>       <layout class="QHBoxLayout" name="horizontalLayout_2">        <item>         <widget class="QTextEdit" name="record"/>        </item>       </layout>      </widget>     </item>     <item>      <widget class="QGroupBox" name="groupBox_2">       <property name="title">        <string>发送信息</string>       </property>       <layout class="QHBoxLayout" name="horizontalLayout_3">        <item>         <widget class="QTextEdit" name="message"/>        </item>       </layout>      </widget>     </item>     <item>      <widget class="QWidget" name="widget_2" native="true">       <layout class="QHBoxLayout" name="horizontalLayout_4">        <item>         <spacer name="horizontalSpacer_2">          <property name="orientation">           <enum>Qt::Horizontal</enum>          </property>          <property name="sizeHint" stdset="0">           <size>            <width>136</width>            <height>20</height>           </size>          </property>         </spacer>        </item>        <item>         <widget class="QPushButton" name="sendMsg">          <property name="text">           <string>发送信息</string>          </property>         </widget>        </item>        <item>         <spacer name="horizontalSpacer">          <property name="orientation">           <enum>Qt::Horizontal</enum>          </property>          <property name="sizeHint" stdset="0">           <size>            <width>135</width>            <height>20</height>           </size>          </property>         </spacer>        </item>       </layout>      </widget>     </item>    </layout>   </widget>   <widget class="QMenuBar" name="menuBar">    <property name="geometry">     <rect>      <x>0</x>      <y>0</y>      <width>428</width>      <height>23</height>     </rect>    </property>   </widget>   <widget class="QToolBar" name="mainToolBar">    <attribute name="toolBarArea">     <enum>TopToolBarArea</enum>    </attribute>    <attribute name="toolBarBreak">     <bool>false</bool>    </attribute>   </widget>   <widget class="QStatusBar" name="statusBar"/>  </widget>  <layoutdefault spacing="6" margin="11"/>  <resources/>  <connections/> </ui>

ui界面



tcp

需要 登录 后方可回复, 如果你还没有账号请 注册新账号