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

一、创建TCP客户端

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

      QtcpSocketQTcpSocket类用于创建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*26015

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

3. 接收窗口和发送窗口:Group Box控件:380*3015380*3015

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

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

5. 按钮:PushButton 控件:

打开客户端(重命名:openBt)、关闭客户端(重命名:closeBt)、发送(重命名:sendBt):100*3012110*301280*3012

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

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函数将tcpSocketconnected信号连接到当前对象的connected_Slot槽函数。当tcpSocket成功连接到服务器时,connected信号会被触发,这时connected_Slot函数将被调用以处理连接成功后的逻辑。

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

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

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

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

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

当这行代码被执行时,tcpSocket将尝试连接到用户在ipEditportEdit控件中输入的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应用程序中,它是一个槽函数,用于响应用户界面中的按钮点击事件。当用户点击关闭按钮时,这个槽函数会被触发,执行关闭服务器的操作。这是一种常见的模式,用于在图形用户界面程序中实现用户交互功能。

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值