QT学习笔记之TCP通信2(TCP客户端)

基于QT实现的TCP连接的网络通信(客户端) 阅读详情
AI摘要

本文介绍了如何在Qt中使用QTcpSocket创建TCP客户端,包括连接服务器、接收和发送数据,以及如何在UI界面中设置控件并与服务器交互。还涉及了如何通过信号槽机制处理连接状态和数据传输,以及关闭客户端的逻辑。

一、创建TCP客户端

创建TCP客户端只需要用到一个类:QTcpSocket。

      QtcpSocket:QTcpSocket类用于创建TCP客户端或处理服务器端的连接。作为客户端,它提供连接到服务器、发送数据和接收数据的功能。作为服务器端,它用于处理由QTcpServer接受的新连接。

示例代码(作为客户端使用):

    QTcpSocket *tcpSocket = new QTcpSocket(this);

    connect(tcpSocket, &QTcpSocket::readyRead, this, [tcpSocket](){});// 读取数据

    connect(tcpSocket, &QTcpSocket::disconnected, this, [tcpSocket](){});// 客户端断开连接

    tcpSocket->connectToHost("serverAddress", 1234); // 连接到服务器

在这个例子中,tcpSocket对象被创建并尝试连接到指定的服务器地址和端口。

二、新建QT工程(与TCP服务器步骤相同)

第一步:打开QT软件,新建工程;

第二步:选择一个模板(默认即可);

第三步:设置项目名称以及项目存储路径;

第四步:编译器选择(默认即可)

第五步:基类选择(QWidget)

第六步:项目管理(默认即可)

三、新类的使用(QTcpSocket Class)

步骤:帮助->索引->搜索“QTcpSocket类”

1. 在widget.h文件中,添加所用头文件:#include <QTcpSocket>

2. 在.pro文件中,添加network;

3. 在widget.h文件中,定义指针变量,用于创建和操作TCP客户端;

4.在widget.cpp文件中的构造函数中,使用new关键字,为指针变量分配内存,初始化指针。

 

四、设置UI界面(400*480)

1. 接收框:Plain Text Edit控件(重命名:receiveEdit):380*260,15

2. 发送框:Line Edit控件(重命名:sendEdit):380*30,15

3. 接收窗口和发送窗口:Group Box控件:380*30,15;380*30,15

4. 端口号框:Line Edit(重命名:portEdit) + Label控件:100*30,12

5. IP地址框:Line Edit(重命名:ipEdit) + Label控件:150*30,12

5. 按钮:PushButton 控件:

打开客户端(重命名:openBt)、关闭客户端(重命名:closeBt)、发送(重命名:sendBt):100*30,12;110*30,12;80*30,12

五、功能实现逻辑代码编写

TCP客户端所需要实现的功能:

①打开客户端:连接服务器;

②接收服务器传送的数据,并在接收窗口显示数据;

③客户端发送数据至TCP服务器;

④关闭客户端。

1. 打开服务器,并监听指定端口的客户端数据

第一步:关联“打开客户端按钮控件”信号和槽(自动关联);

 

第二步:编写代码,连接服务器;

Public Functions

virtual void  connectToHost(const QString &hostName, quint16 port, QIODevice::OpenMode openMode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)

注释:这段代码定义了Widget类中的一个槽函数on_openBt_clicked,该函数在用户点击某个触发连接服务器动作的按钮(假设按钮对象名为openBt)时被调用。这个槽函数的作用是启动一个TCP客户端连接到指定的服务器。以下是on_openBt_clicked函数的工作流程:

1. 获取用户输入的服务器IP地址和端口号:

ui->ipEdit->text() 这行代码通过ipEdit控件(假设是一个QLineEdit或其他文本输入控件)获取用户输入的服务器IP地址。

ui->portEdit->text().toUInt() 这行代码通过portEdit控件获取用户输入的端口号,并使用toUInt方法将其转换为无符号整数(uint类型)。

2. 连接到服务器:

tcpSocket->connectToHost() 这行代码调用QTcpSocket类的connectToHost方法,尝试连接到用户指定的IP地址和端口号。tcpSocket是一个指向QTcpSocket对象的指针,它负责管理与服务器的TCP连接。

3. 建立信号与槽的连接:

connect(tcpSocket,SIGNAL(connected()),this,SLOT(connected_Slot())) 这行代码使用connect函数将tcpSocket的connected信号连接到当前对象的connected_Slot槽函数。当tcpSocket成功连接到服务器时,connected信号会被触发,这时connected_Slot函数将被调用以处理连接成功后的逻辑。

注释①:这行代码是Qt网络编程中的一个常用操作,它使用QTcpSocket类的connectToHost方法来尝试建立到指定服务器的TCP连接。这个方法是异步的,它发起连接请求,但不会阻塞当前线程直到连接完成。连接的结果(成功或失败)将通过信号和槽机制来处理。

1. tcpSocket:这是一个指向QTcpSocket对象的指针。QTcpSocket是Qt提供的一个用于TCP网络通信的类,可以用来创建和管理TCP连接。

2. connectToHost:这是QTcpSocket类的一个方法,用于发起到远程主机的连接。它接受两个参数:远程主机的IP地址和端口号。

3. ui->ipEdit->text():这是从用户界面中的ipEdit控件(如QLineEdit)获取的文本,它包含了远程服务器的IP地址。ipEdit控件应该是一个文本输入框,用户可以在其中输入服务器的IP地址。

4. ui->portEdit->text().toUInt():这是从用户界面中的portEdit控件获取的文本,并将其转换为无符号整数(uint类型)。这个整数表示远程服务器的端口号。portEdit控件应该是一个文本输入框,用户可以在其中输入要连接的端口号。

当这行代码被执行时,tcpSocket将尝试连接到用户在ipEdit和portEdit控件中输入的IP地址和端口号所指定的服务器。连接的结果可以通过连接connected信号到一个相应的槽函数来进一步处理,实现接下来的逻辑。

注释②:这行代码是Qt框架中信号和槽机制的一个应用实例。它将tcpSocket对象的connected信号连接到当前对象的connected_Slot槽函数上。当tcpSocket成功建立连接时,connected信号会被发出,随后connected_Slot函数将被调用。具体来说:

1. tcpSocket 是一个 QTcpSocket 类型的指针,它代表了一个TCP套接字,用于网络通信。

2. SIGNAL(connected()) 是 QTcpSocket 类的一个信号,当套接字成功连接到远程主机时发出。

3. this 指代当前对象,通常是 Widget 类的实例。

4. SLOT(connected_Slot()) 是当前对象的一个槽函数,当信号发出时,这个槽函数将被调用。

这种机制使得程序能够在特定事件发生时自动执行相应的处理函数,而无需手动检查每个事件的状态。在这个例子中,一旦TCP连接建立,connected_Slot函数将被执行,你可以在这个函数中编写代码来处理连接成功后的逻辑,例如更新用户界面、发送数据或其他任何需要在连接建立后执行的操作。这是Qt框架中实现事件驱动编程的关键特性之一。

2. 接收服务器传送的数据,并在接收窗口显示数据(同理于服务器的槽函数编写,手动关联)

第一步:在widget.h文件中定义槽函数:void connected_Slot();

第二步:在widget.cpp文件中编写槽函数void Widget::connected_Slot()代码

注释:这行代码是Qt框架中的一个典型用法,用于将信号(signal)连接到槽(slot)上。Qt的信号和槽机制是一种强大的对象间通信方法,它允许程序组件在发生特定事件时自动响应。

1. connect:这是Qt框架提供的一个函数,用于建立信号和槽之间的连接。当你调用 connect 时,你需要提供三个参数:信号的发送者(sender),信号(signal)本身,以及接收信号并作出响应的槽函数(slot)。

2. tcpSocket:这是信号的发送者,通常是一个指向 QTcpSocket 或其子类实例的指针。QTcpSocket 是Qt提供的一个用于TCP网络通信的类。

3. SIGNAL(readyRead()):这指定了要连接的信号。readyRead 是 QTcpSocket 类的一个信号,当有新的数据可从套接字读取时,这个信号会被触发。SIGNAL 宏用于在Qt的元对象系统中注册这个信号。

4. this:这是当前对象的指针,表示信号的接收者。在这个例子中,this 指向 Widget 类的实例。

5. SLOT(readyRead_Slot()):这是与信号连接的槽函数。readyRead_Slot 是 Widget 类的一个成员函数,它会被调用以响应 readyRead 信号。SLOT 宏用于在Qt的元对象系统中注册这个槽函数。

当你执行这行代码时,你告诉Qt:每当 tcpSocket 套接字有数据可读时(即 readyRead 信号被发出时),自动调用 Widget 类的 readyRead_Slot 函数。

第三步:在widget.h文件中定义槽函数:void readyRead_Slot ();

第四步:在widget.cpp文件中编写槽函数void Widget::readyRead_Slot()代码

注释:这行代码是Qt框架中的一个操作,用于将从TCP客户端套接字接收到的数据追加到一个文本编辑器—(ui->receiveEdit)接收框控件中。这是一个典型的槽函数操作,通常在响应 readyRead 信号时被调用。下面是对这行代码的详细解释:

1. ui->receiveEdit:这是一个指向 QTextEdit 或类似的文本显示控件的指针。receiveEdit 是在Qt Designer中为该文本编辑器控件设置的对象名。

2. appendPlainText:这是 QTextEdit 类的一个成员函数,用于向文本编辑器中追加纯文本数据。此函数接受一个 QString 类型的参数,即要追加的文本内容。

3. tcpSocket->readAll():这是 QTcpSocket 类的一个成员函数,用于从当前的TCP客户端套接字中读取所有可用的数据。该函数返回一个 QByteArray 类型的对象,包含了从套接字读取的二进制数据。为了将这些二进制数据转换为纯文本并追加到文本编辑器中,需要将 QByteArray 转换为 QString。

这行代码的作用是将TCP客户端套接字中所有待读取的数据读取出来,并将其作为纯文本追加到用户界面中的(ui->receiveEdit)文本编辑器控件中,从而实时显示接收到的数据。这种方式常用于显示网络通信的日志,或者在客户端和服务器之间传输文本信息时的实时数据显示。

3. 客户端发送数据至TCP服务器

第一步:关联“发送按钮控件”信号和槽(自动关联);

 

第二步:编写代码,将(ui->sendEdit)控件输入的数据发送给的客户端;

注释:这段代码定义了`Widget`类中的一个槽函数`on_sendBt_clicked`,该函数在用户点击某个触发发送数据动作的按钮(假设按钮对象名为`sendBt`)时被调用。这个槽函数的作用是通过已建立的TCP连接发送数据。以下是`on_sendBt_clicked`函数的工作流程:

1. 获取用户输入的文本:

   `ui->sendEdit->text()`,这行代码通过`sendEdit`控件(假设是一个`QLineEdit`或其他文本输入控件)获取用户输入的文本。用户通过这个控件输入他们想要发送的数据。

2. 将文本转换为本地8位字符序列:

   `.toLocal8Bit()`,`toLocal8Bit`是一个QString类的方法,它将QString对象中的文本转换为本地编码的8位字符序列。这是因为`QTcpSocket`的`write`方法需要一个`const char*`类型的参数,而QString对象包含的是Unicode字符。

3. 调用`data()`方法:

   `.data()`,`data`方法返回一个指向转换后的8位字符序列的指针。这个指针被用作`write`方法的参数。

4. 发送数据:

   `tcpSocket->write()`,`write`方法是`QTcpSocket`类的一个成员函数,它将提供的数据通过当前的TCP连接发送到远程主机。在这个例子中,它发送用户通过`sendEdit`输入框输入的文本。

这个槽函数使得用户界面能够与网络通信功能交互,允许用户通过点击按钮来发送数据。这是创建交互式网络应用程序的一个重要组成部分。需要注意的是,`tcpSocket`变量应该在调用`on_sendBt_clicked`之前已经被初始化并与某个远程主机建立了连接。此外,为了确保槽函数能够正常工作,`tcpSocket`和`sendEdit`必须有效,且`ui`指针应该正确指向了包含这些控件的用户界面。

4. 关闭客户端

实现逻辑:点击关闭服务器按钮时,关闭之前通过 tcpServer 对象启动的TCP服务器。

第一步:关联“关闭服务器按钮控件”信号和槽(自动关联);

第二步:编写代码,关闭之前通过 tcpServer 对象启动的TCP服务器;

注释:Widget::on_closeBt_clicked() 是一个槽函数,它在某个名为 closeBt 的按钮被点击时触发。这个函数的作用是关闭之前通过 tcpServer 对象启动的TCP服务器。

tcpServer->close();这行代码调用了 close 方法来关闭 QTcpServer 对象。QTcpServer 是Qt框架中用于创建TCP服务器的类。当这个方法被调用时,如果服务器正在监听某个端口,它将停止监听,并且关闭所有已建立的连接。

为了使这段代码能够正常工作,您需要确保以下几点:

1. tcpServer 指针已经被正确初始化,并且指向了一个有效的 QTcpServer 对象。

2. 在调用 close 方法之前,tcpServer 对象应该已经通过 listen 方法启动并开始监听端口。

3. 应用程序已经包含了Qt网络模块,并且正确链接了相关的库文件。

这段代码通常位于某个Qt应用程序中,它是一个槽函数,用于响应用户界面中的按钮点击事件。当用户点击关闭按钮时,这个槽函数会被触发,执行关闭服务器的操作。这是一种常见的模式,用于在图形用户界面程序中实现用户交互功能。

QT:Socket通讯(TCP) 学习笔记 阅读详情

相关推荐

QT之TCP客户端线程通信

摘要最近因为工作上的需求要利用到tcp,之前接触的比较多的是C语言的tcp通信,转到QT之后多多少少有些不适应,因为QT把TCP通信的功能封装好了。让我们一起看看TCP客户端加上线程是如何实现的。 线程因为C语言的影响,我会首选线程来实现TCP客户端。因为GUI编程下不知道进程是否操作的好这是其一,其二是因为线程与进程相比对系统的资源开销比较小,利于优化,减少界面的卡顿提高用户体验这是很重要的一点。

u014430031的博客 1万+

QT TCP客户端实现

QTcpSocket实例首先是通过connectToHost()尝试连接到服务器,需要指定服务器的IP地址和端口。connectToHost()是异步方式连接服务器,不会阻塞程序运行,连接后发射connected()信号。如果需要使用阻塞方式连接服务器,则使用waitForConnected()函数阻塞程序运行,直到连接成功或失败。与服务器建立连接后,就可以向缓冲区写数据或从接收缓冲区读取数据,实现数据的通信。

hw5230的博客 2279

基于QT的TCP通信

利用QTcpServer类以及QTcpSocket类进行TCP通信,实现了行数据的传输。

weixin_43479242的博客 2697

Qt中使用TCP服务端及客户端

在Qt中使用TCP服务端及客户端是一种可靠、高效的方法来进行网络通信。QTcpServer和QTcpSocket类提供了一个面向对象的解决方案,使得您能够轻松地开发出各种类型的网络应用程序。然而,请注意因多种原因(例如网络中断、远程主机关闭连接等)导致的时延和异常情况,并确保在代码中处理这些情况以确保应用程序的稳定性。

qq_25549309的博客 3508

基于Qt的多客户端TCP通信设计(含源码)

基于Qt的多客户端TCP通信设计 项目介绍 该项目基于Qt的多客户端TCP通信系统,采用了TCP传输控制协议进行客户端与服务端安全通信。服务端采用了QThread多线程对客户端高并发响应。当TCP连接建立后,多个客户端可同时向服务端发送数据,服务端接收到数据后连接了sqlite数据库对通信记录,及ip+port进行存储。当然,也采用了QT中的Viewtable控件,将数据表中的数据整体展示出来。 注意点: 该项目分为客户端和服务端,分别对应文件TCPClient、TCPServer项目文件,为了展示多客户

leadingme的博客 2395

Qt Tcp通信服务端+客户端

代码我已经上传了,不需要积分,有两套,一套是服务端客户端结合成一个软件,一套是服务端客户端分开的(代码简洁明了,用于速成) 1.环境配置 Qt自带tcp通信,不需要引入外部库,直接在工程文件加入network就可以了 QT += core gui network 加入头文件,因为是服务端客户端共用,所以都加上,QTcpServer套接字服务端专用,用于监听客户端发来的连接请求。QTcpSocket服务端客户端共用,用于数据的通信 #include <QTcpServer>//监听套

qq_45220555的博客 2197

【QT】QT实现TCP通信

QT中的TCP通信原理及实现 (如果看着繁琐,可直接定位到文章末尾,有源码连接) QT中可以通过TCP协议让服务器和客户端之间行通信。服务器和客户端的具体流程: A、服务器: 1.创建QTcpServer对象 2.启动服务器(监听)调用成员方法listen(QHostAddress::Any,端口号) 3.当有客户端链接时候会发送newConnection信号,触发槽函数接受链接(得到一个与客户端通信的套接字QTcpSocket) 4.QTcpsocket发送数据用

mitongxue的博客 2万+

QT tcp Socket 通信开发

折腾了很久TCP IP通信机制。 以前虽然看过bsd tcp/ip的so called 基础通信代码。什么bind, listen ,accept , receive, write, read,但是一直没真正理解。 这次由于公司需求,我狠狠地读了代码,并且搬出QT老本行,开始了QT For windows的编程。 这个大体构架是做一个聊天室软件。 每个client都

1万+

QT - 创建TCP Socket通信

QT创建TCP Socket通信        最近在学习QT,了解到QT可以进行SOCKET网络通信,进行学习,并建立一个简单的聊天DEMO。为了测试是否能与VS2012下的程序进行通信,在VS2012下建立一个客户端程序,进行通信测试,发现可以进行通信。由此也可以证明,对于采用同一种通信协议(TCP)的两个程序而言,不管是采用什么编译器,尽管采用的语法不同,仍是能够进行通信的。下面先对QT的...

bailang_zhizun的博客 7万+

QT自制TCP客户端

QT自制TCP客户端,亲测可用

大脑曝光 4680

UE5游戏逆向实战:用FModel提取.pak文件中的3D模型(附Dumper-7避坑指南)

本文详细介绍了在UE5游戏逆向工程中使用FModel提取.pak文件中3D模型的实战技巧,包括Dumper-7工具的深度配置与避坑指南。针对UE5特有的unversioned属性系统,提供了从源码编译到智能注入的全链路解决方案,帮助开发者高效获取游戏资产并优化处理流程。

weixin_30374009的博客 495

Qt之TCP通信

TCP 协议(Transmission Control Protocol)全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是大多数 Internet 协议(包括 HTTP 和 FTP)用于数据传输的低级网络协议。它是一种可靠的,面向流,面向连接的传输协议。它特别适合连续数据传输。TCP 通信必须先建立 TCP 连接,通信端分为客户端和服务端。服务端通过监听某个端口来监听是否有客户端连接到来,如果有连接到来,则建立新的 socket 连接;

风间琉璃的博客 1万+

Allegro PCB设计小技巧:如何用Shift键快速平移复制走线和过孔?

本文深入解析了Allegro PCB设计中利用Shift键进行平移复制的核心技巧。通过对比传统复制粘贴流程,详细演示了如何高效、精准地批量复制走线和过孔,尤其适用于创建等间距电源总线、过孔阵列等场景,能显著提升PCB设计效率与准确性。

pz89012345的博客 553

QT实现TCP通信(服务器与客户端搭建)

【代码】QT实现TCP通信(服务器与客户端搭建)

小钱努力学C的博客 1万+

Python 映射函数map()详解

Python 映射函数map()详解

分享我的点点滴滴,在成长路上与你同行! 2139

【C++】开源:ncurses终端TUI文本界面库

ncurses配置使用(TUI)

DevFrank的博客 3164

Qt网络编程实现TCP通信

Qt网络编程实现TCP通信 标签(空格分隔): Tcp通信 一、Tcp简介 (1)TCP(Transmission Control Protocol,传输控制协议)TCP是一个用于数据传输的传输层网络协议,多个网络协议包括(HTTP和FTP都是基于TCP协议),TCP是面向数据流和连接的可靠的传输协议,它区别于传输层的另外一个协议UDP(具体可看—Qt简单实现UDP通信) 。 (2)QTcpSocket继承自QAbstractSocket,与QUdpSocket传输的数据报不同的是,QTcpSoc

qq_43686329的博客 1万+

详解AUTOSAR:专栏总述

本专栏系统介绍AUTOSAR规范及车用控制器软件开发,内容覆盖基础架构、SWC/RTE、通信栈、诊断、存储、安全、看门狗、工具链、环境配置与项目实战,并持续更新各模块的集成机制与工程要点。

不脱发的程序猿 3920

Qt中的TCP通信

Qt中的TCP通信

龙木南的博客 7967

WinCC实现定时存储数据至SQLServer

环境 Win10 WinCC V7.5 SQL Server 2016 运行结果 流程 WinCC变量 全局VB脚本 (我设置的是每2秒存一次,因此周期性触发器设置1秒)

skr? 3986

2024年12月数据月报

2024年12月大数据月报,为您准备了阿里、字节、百度等大厂150多篇实践案例

SmartSi 2654

QT实现TCP通信

目录 前言 一、TCP服务端的实现流程: 二、TCP客户端端的实现流程: 总结 前言 TCP通信的实现需要包含2个部分,TCP服务端和TCP客户端。 首先在工程文件中添加network: QT += core gui network 一、TCP服务端的实现流程: .h需要引入头文件: #include <QTcpServer> #include <QTcpSocket> 1.创建QTcpServer的对象用作监听套接字; ...

qq_40876689的博客 1万+

如何创建 SAP ABAP CDS View 的 Association

所以本文我们虽然学习了如何创建 SAP CDS View 的 association,知道了 association 是用来在 CDS View 里将两张数据库表关联起来,但根本不知道怎么使用这个 association. 而且从 association 的写法来看,似乎和本教程之前介绍 inner join,left join 这些数据库表的连接操作没什么区别,都是根据两张表的 carrid 和 connid 字段相同进行的连接。只看到了我们在 CDS View 源代码实现里,放出来的四个字段。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 902

Qt实现TCP通信

Qt要实现TCP通信需要两个类,第一个是服务器端,需要用到QTcpServer类,第二个是客户端,需要用到QTcpSocket类。另外,要想在Qt中进行网络通信,需要在pro文件中加入network模块。C语言建立Tcp通信时,需要经历“socket函数创建套接字-->bind绑定地址结构-->listen设置最大监听数-->accept监听来自客户端的连接”这几个阶段,QTcpServer中的listen函数就相当于C语言中bind和listen的功能。

2301_81261654的博客 1577

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

socket通信(UDP、TCP)的Qt实现

socket通信Qt实现

confidence092的博客 5969

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: QT学习笔记之TCP通信1(TCP服务器)
下一篇: QT学习笔记之TCP通信3(TCP服务器与客户端数据互传)
大可的学习笔记
博客等级 码龄7年 119粉丝 4原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值