保姆级教程(超详细解说)惠州保洁13825404095

文章正文
发布时间:2024-11-03 11:16

目录

一.TCP基础知识(了解)

1.TCP的概念

TCP(Transmission Control Protocol)——是一种用于在计算机网络中传输数据的协议。它是一种可靠的、面向连接的协议,确保数据在传输过程中不会丢失、损坏或者乱序。

TCP通过建立连接、数据传输、数据确认和连接关闭等步骤来保证数据的可靠传输。

TCP是互联网中最常用的传输层协议之一,它与IP(Internet Protocol)共同组成了TCP/IP协议栈,用于实现数据的可靠传输和网络通信。

2.实现TCP网络通信的条件

要实现TCP网络通信,通常需要以下条件:

1. IP地址:每个设备都需要有一个唯一的IP地址,用于在网络中进行通信。

2. 端口号:TCP通信需要使用端口号来区分不同的应用程序或服务。

3. TCP协议栈:操作系统中集成了TCP/IP协议栈,用于实现TCP通信。

4. 网络连接:设备之间需要通过网络连接(如局域网、互联网)来进行通信。

虽然通常情况下,TCP通信需要一个服务器(server)和一个客户端(client)来进行通信,服务器负责监听连接请求并处理客户端的请求,客户端则负责向服务器发送请求并接收服务器的响应。但也可以通过模拟客户端和服务器之间的通信来进行测试或演示,以便于调试和开发。
 

二.使用QT进行TCP模拟通信

在上面我们也说了,TCP通信需要一个服务器(server)和一个客户端(client)来进行通信。

所以在QT中我们主要创建一个Server(服务器)窗口和一个Client(客户端)窗口来进行通信。

也就是说,我们要在QT中建立两个文档,一个是Server,一个是Client。

一. 服务器窗口

1.添加库和头文件

在QT的帮助里面搜索QTcpServer和QTcpSocket,可以看到:

图中的Header后的#include<QTcpServer>和#include<QTcpSocket>是我们需要在QT中添加的头文件,qmake后的QT+=network是我们需要添加的QT模块。

让我们新建一个文档。

打开QT ——>进入欢迎界面——>在该界面中点击 Project 旁边的 +New——>项目选择Application的Qt Widgets Application——>点击右下侧的choose按钮继续——>名称自己随便起,为了方便标识,建议设置成TCP_Server——>然后选择路径,继续点击下一步——>Define Build System就选默认的qmake即可,继续——>进入Class Information中,Base class选择QWidget,其他名称会自动改变,当然这里你也可以自己设置一个名字,继续——>进入Translation File,不做改变,继续——>进入Kit Selection,这里选默认即可,继续——>进入 Project Management,在当前界面可以看到我们创建这个文件之后,将要添加的问价,最后点击完成。

这里默认是32位,但是如果电脑是64位并且安装了64位的系统,建议选择64位。

最后点击完成,就新建了一个文档,接下来我们将对该文档进行一系列编辑,来实现服务器的功能。

首先进入TCP_Server.pro文档中,在右侧代码界面中的         QT        += core gui 后加上 network。

接着进入widget.h头文件中,添加头文件:#include <QTcpServer>,#include <QTcpSocket>,在这之前一定要先添加network模版。

编译后没有问题,进入下一步。

2.布局

进入widget.ui界面中,开始布局。

为了方便编程,我们给各个Edit改下名字。

其中接收窗口——recvEdit、发送窗口——sendEdit、打开服务器按钮——openBt、关闭服务器按钮——closeBt、发送——sendBt。

3.实例化

在widget.h文件中声明对象和槽函数。

#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpServer> //添加的头文件 #include <QTcpSocket> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private: Ui::Widget *ui; //添加的对象 QTcpServer *tcpServer; QTcpSocket *tcpSocket; private slots: void newConnection_Slot(); //添加的槽函数 void readyRead_Slot(); void on_openBt_clicked(); void on_closeBt_clicked(); void on_sendBt_clicked(); }; #endif // WIDGET_H

接着在widget.cpp中初始化和撰写槽函数。

#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); setWindowTitle("Server"); tcpServer = new QTcpServer(this); tcpSocket = new QTcpSocket(this); connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnection_Slot())); } void Widget::newConnection_Slot() //连接槽函数 { tcpSocket=tcpServer->nextPendingConnection(); connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot())); } void Widget::readyRead_Slot() //读取数据槽函数 { QString buf; buf=tcpSocket->readAll(); ui->recvEdit->appendPlainText(buf); } Widget::~Widget() //析构函数 { delete ui; } void Widget::on_openBt_clicked() //打开按钮按下 { tcpServer->listen(QHostAddress::Any,ui->portEdit->text().toUInt()); } void Widget::on_closeBt_clicked() //关闭按钮按下 { tcpServer->close(); } void Widget::on_sendBt_clicked() //发送按钮按下 { tcpSocket->write(ui->sendEdit->text().toUtf8()); }

到此为止,服务器窗口建立完毕,下面,我们开始建立客户端窗口。

二. 客户端窗口

1.添加库和头文件

添加的步骤和服务器制作相同。

在pro文件中添加 network。

在widget.h头文件中添加 #include <QTcpSocket>。

注意,这里只需要添加QTcpSocket,不需要添加QTcpServer了。

2.布局

进入widget.ui界面中,开始布局。

和上面一样,为了方便编程,改一下每一个Edit的名字。

其中,接收框——recvEdit、端口号——portEdit、IP——IPEdit、发送框——sendBt、打开客户端、关闭客户端、发送按钮分别对应——openBt、closeBt、sendBt。

3.实例化

进入widget.h文件中,声明对象和槽函数。

#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpSocket> //添加的头文件 QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private: Ui::Widget *ui; //声明对象 QTcpSocket *tcpSocket; private slots: void connected_Slot(); //声明槽函数 void readyRead_Slot(); void on_openBt_clicked(); void on_closeBt_clicked(); void on_sendBt_clicked(); }; #endif // WIDGET_H

进入widget.cpp文件中开始初始化和撰写槽函数。

#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); setWindowTitle("Client"); tcpSocket= new QTcpSocket(this); } void Widget::connected_Slot() //连接槽函数 { connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot())); } void Widget::readyRead_Slot() //读取数据槽函数 { ui->recvEdit->appendPlainText(tcpSocket->readAll()); } Widget::~Widget() //析构函数 { delete ui; } void Widget::on_openBt_clicked() //打开按钮按下 { tcpSocket->connectToHost(ui->IPEdit->text(),ui->portEdit->text().toUInt()); connect(tcpSocket,SIGNAL(connected()),this,SLOT(connected_Slot())); } void Widget::on_closeBt_clicked() //关闭按钮按下 { tcpSocket->close(); } void Widget::on_sendBt_clicked() //发送按钮按下 { tcpSocket->write(ui->sendEdit->text().toUtf8()); }

到此为止,客户端窗口制作完毕,下面我们来进行验证。

三.验证

1.首先运行Server窗口,得到

2.接着运行Client窗口,得到

3.测试一下它们的发送和接收功能吧!!

首先可以回到电脑桌面,按住电脑的win+r键,输入cmd,接着输入IPConfig,可以看到

复制一下其中的IPv4地址,如果有多个,复制第一个即可。

在上面的图中,IPv4地址就为:192.168.124.39

然后回到QT中,将该地址粘贴到Client的IP中,端口号填写1234即可,要保证Client的端口号和Server的端口号是相同的。

填写好后,按下Client中的打开客户端按钮和Server中的打开服务器按钮,然后就可以开始发送数据啦!!!

当然,这还只是最基础的功能,我甚至还有很多地方是比较粗糙,不够完善的,后续有机会,会继续完善,希望对你有帮助!!