1. TCP客户端基础连接

TCP客户端基础连接 学习卡片

任务说明

实现一个基于 QTcpSocket 的 TCP 客户端程序,连接指定服务器后发送一条测试消息,并接收服务器回显内容,以此验证连接成功。程序采用命令行参数方式传入服务器地址与端口,便于快速测试。

环境依赖

  • Qt 5.15 或更高版本(含 Qt Network 模块)
  • 编译器:支持 C++11 即可(如 MSVC、GCC、MinGW)
  • 构建工具:qmake 或 CMake(本案例使用 qmake)

完整实现

创建 tcpclient.pro 与 main.cpp 两个文件,代码如下:

# tcpclient.pro
QT += core network
QT -= gui
CONFIG += console c++11
TARGET = tcpclient
TEMPLATE = app
SOURCES += main.cpp
// main.cpp
#include <QCoreApplication>
#include <QTcpSocket>
#include <QHostAddress>
#include <QTextStream>
#include <QTimer>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QTextStream out(stdout);

    if (argc != 3) {
        out << "用法: tcpclient <服务器IP> <端口>\n";
        out << "示例: tcpclient 127.0.0.1 8080\n";
        return 1;
    }

    QString host = argv[1];
    quint16 port = QString(argv[2]).toUShort();

    QTcpSocket socket;
    QObject::connect(&socket, &QTcpSocket::connected, [&]() {
        out << "[已连接] " << host << ":" << port << "\n";
        socket.write("Hello TCP Server");
        socket.flush();
    });

    QObject::connect(&socket, &QTcpSocket::readyRead, [&]() {
        QByteArray data = socket.readAll();
        out << "[收到回显] " << data << "\n";
        out << "[验证通过] 连接与通信正常\n";
        socket.disconnectFromHost();
        app.quit();
    });

    QObject::connect(&socket, &QAbstractSocket::errorOccurred, [&]() {
        out << "[错误] " << socket.errorString() << "\n";
        app.exit(1);
    });

    // 5秒超时自动退出
    QTimer::singleShot(5000, [&]() {
        if (socket.state() != QAbstractSocket::UnconnectedState) {
            out << "[超时] 未收到服务器响应\n";
            socket.abort();
            app.exit(2);
        }
    });

    socket.connectToHost(host, port);
    return app.exec();
}

编译与运行

  1. 在项目目录执行 qmake && make(Linux/macOS)或 qmake && nmake(Windows MSVC)生成可执行文件。
  2. 启动一个 TCP 回显服务器(如使用 nc -l 8080 或自写简易服务器)。
  3. 运行客户端:./tcpclient 127.0.0.1 8080(Windows 下为 tcpclient.exe 127.0.0.1 8080)。

验证方法

程序运行后观察输出:

  • 若服务器可达且正常回显,客户端依次打印 [已连接]、[收到回显] Hello TCP Server、[验证通过],随后自动退出,退出码为 0。
  • 若服务器未启动或地址错误,打印 [错误] 及原因,退出码为 1。
  • 若连接成功但服务器不回显,5 秒后打印 [超时],退出码为 2。

满足“收到回显且打印验证通过”即表示 TCP 客户端基础连接功能实现正确。