7.4 Qt 开发 网络编程
Qt网络编程采用事件驱动模型,通过信号槽机制实现异步通信,避免了传统阻塞式网络编程的复杂性。
一、基于 TCP 的网络编程
TCP是面向连接的、可靠的、基于流的传输协议。在Qt中,服务器端使用QTcpServer监听连接,客户端使用QTcpSocket连接服务器。
- 服务器端实现:
// 创建TCP服务器
QTcpServer *tcpServer = new QTcpServer(this);
// 监听指定地址和端口
if (!tcpServer->listen(QHostAddress::Any, 12345)) {
qDebug() << "Server could not start:" << tcpServer->errorString();
} else {
qDebug() << "Server started on port 12345";
}
// 新连接到达时的处理
connect(tcpServer, &QTcpServer::newConnection, this, [=]() {
// 获取与客户端通信的套接字
QTcpSocket *clientSocket = tcpServer->nextPendingConnection();
// 记录客户端信息
qDebug() << "New connection from:" << clientSocket->peerAddress().toString()
<< ":" << clientSocket->peerPort();
// 接收数据
connect(clientSocket, &QTcpSocket::readyRead, this, [=]() {
// TCP是流式协议,可能需要处理粘包/拆包
QByteArray data = clientSocket->readAll();
qDebug() << "Received from client:" << data;
// 示例:回显数据
clientSocket->write("Server echo: " + data);
});
// 处理连接断开
connect(clientSocket, &QTcpSocket::disconnected, this, [=]() {
qDebug() << "Client disconnected";
clientSocket->deleteLater(); // 安全删除套接字
});
// 处理错误
connect(clientSocket, &QTcpSocket::errorOccurred, this, [=](QAbstractSocket::SocketError error) {
qDebug() << "Socket error:" << clientSocket->errorString();
});
});
- 客户端实现:
// 创建TCP套接字
QTcpSocket *tcpSocket = new QTcpSocket(this);
// 连接状态变化的处理
connect(tcpSocket, &QTcpSocket::connected, this, [=]() {
qDebug() << "Connected to server";
// 发送数据
QString message = "Hello, Server!";
tcpSocket->write(message.toUtf8());
qDebug() << "Sent:" << message;
});
connect(tcpSocket, &QTcpSocket::disconnected, this, [=]() {
qDebug() << "Disconnected from server";
});
// 异步连接到服务器
tcpSocket->connectToHost("127.0.0.1", 12345);
// 接收数据
connect(tcpSocket, &QTcpSocket::readyRead, this, [=]() {
QByteArray data = tcpSocket->readAll();
qDebug() << "Received from server:" << data;
});
// 错误处理
connect(tcpSocket, &QTcpSocket::errorOccurred, this, [=](QAbstractSocket::SocketError error) {
qDebug() << "Connection error:" << tcpSocket->erro
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++/嵌入式开发 秋招面经 文章被收录于专栏
一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。
查看12道真题和解析