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、通信协议及开发工具链等核心内容。

全部评论

相关推荐

点赞 评论 收藏
分享
评论
4
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务