跳转至

TCP 客户端

使用 Qt 网络功能前


首先在使用 Qt 的 TCP 网络功能时, 需要在项目工程中的配置文件(.pro)中增加如下语句。

将这行代码后追加 network 即可

QT       += core gui

即为

QT       += core gui network

其次还需要导入 QTcpSocket

#include <QTcpSocket>

TCP

初始化


首先初始化 QTcpSocket 类。

QTcpSocket *socket;

其次对这个指针进行初始化, 在构造函数中初始化对象。

socket = new QTcpSocket;


连接远程时, 首先需要知道其 IP 地址和端口号, 示例程序中通过用户点击 Connect 按钮获取用户输入在输入框中的 IP 地址和端口号。

获取 IP 地址和 端口


获取 IP 地址和端口号

1
2
3
// 获取用户输入的 IP 地址和端口号
QString target_ip = ui->IP_Edit->text();
QString target_port= ui->Port_Edit->text();

连接到目标服务器


连接到目标服务器, 使用 connectToHost

connectToHost 这个函数所传入的目标 IP 地址为一个 QHostAddress 类, 因此在传入参数时需要将 QString 类型转换为 QHostAddress 类型。

QHostAddress 是一个封装好的 IP 地址类, 使用这个类需要引入相应的头文件 #include <QHostAddress>

// 连接服务器
// QHostAddress(target_ip) -> 将 QString 类型转换为 QHostAddress 类型
// target_port.toUShort() -> 将 QString 类型转换为 quint16 类型
socket->connectToHost(QHostAddress(target_ip), target_port.toUShort());

判断连接异常状态


socket 发出连接请求后, 判断是否连接成功。

如果成功连接, 则 socket 对象会发出一个信号, 通过判断这个信号即可判断是否连接成功。

同理, 如果连接异常 (连接断开等) socket 对象同样会发出一个信号。

// 判断服务器是否连接成功
// 如果连接成功, socket 对象会发出一个信号
connect(socket, &QTcpSocket::connected, [this](){
    // 连接成功后输出用户提示
    ui->Message_Edit->insertPlainText("Message: connected!\n");
});
// 连接异常
// 当连接状态异常, 例如断开连接, socket 对象也会发出一个信号
// &QTcpSocket::disconnect -> 连接断开信号
connect(socket, &QTcpSocket::disconnected, [this](){
   // 提示用户连接断开
   ui->Message_Edit->insertPlainText("Message: disconnect!\n");
i});