1. 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();
}
编译与运行
- 在项目目录执行
qmake && make(Linux/macOS)或qmake && nmake(Windows MSVC)生成可执行文件。 - 启动一个 TCP 回显服务器(如使用
nc -l 8080或自写简易服务器)。 - 运行客户端:
./tcpclient 127.0.0.1 8080(Windows 下为tcpclient.exe 127.0.0.1 8080)。
验证方法
程序运行后观察输出:
- 若服务器可达且正常回显,客户端依次打印
[已连接]、[收到回显] Hello TCP Server、[验证通过],随后自动退出,退出码为 0。 - 若服务器未启动或地址错误,打印
[错误]及原因,退出码为 1。 - 若连接成功但服务器不回显,5 秒后打印
[超时],退出码为 2。
满足“收到回显且打印验证通过”即表示 TCP 客户端基础连接功能实现正确。