You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QT6 C++ Socket服务器接收客户端数据为空问题排查

QT6 C++ Socket读取客户端数据失败问题

我用QT6编写的TCP服务端代码无法正常读取客户端(树莓派Python程序)发送的数据,但Python版本的服务端代码可以正常运行。以下是相关代码和运行情况:

我的QT6 C++代码

QTcpServer funcServer;
if (!(funcServer.listen(QHostAddress::AnyIPv4, 8011))) {
    qDebug() << "Failed to start the server.";
} else {
    qDebug() << "Server started on port" << funcServer.serverPort() << " with it's address = "<< funcServer.serverAddress();
}

// 等待客户端连接
if (funcServer.waitForNewConnection(-1)) {
    QTcpSocket* funcClientSocket = funcServer.nextPendingConnection();
    qDebug() << "A client is connected.";
    this->isConnected = true;
    // 处理客户端连接
    while(true){
        qDebug() << "Trying to receive:";
        QByteArray data = funcClientSocket->read(1024);
        qDebug() << "Received data:" << data;
        QThread::sleep(0.1);
    }
}

正常运行的Python服务端代码

import socket
listensocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listensocket.bind(('0.0.0.0', 8011))
# 启动服务端
listensocket.listen(999)
print("Server started at " + socket.gethostname() + " on port " + str(8011))
# 接受客户端连接
(clientsocket, address) = listensocket.accept()
print(f"New connection made! at address = {address}")
while True:
    message = clientsocket.recv(1024).decode()  # 获取传入消息
    print(message)

注:数据由树莓派Python程序发送,发送端与接收端处于同一Wi-Fi网络。

实际运行结果

QT6代码运行后持续输出空数据:

Trying to receive:
Received data: ""
Trying to receive:
Received data: ""
Trying to receive:
Received data: ""

问题原因及解决方法

核心问题

你的QT代码存在两个关键问题:

  1. 阻塞逻辑错误:read()方法在无数据时会立即返回空值,而Python的recv()默认是阻塞等待数据的。QT中需用waitForReadyRead()实现阻塞等待数据就绪。
  2. 对象生命周期问题:funcServer是局部变量,若这段代码所在函数执行完毕,funcServer会被销毁,直接导致Socket连接失效。

修复后的阻塞式代码

// 建议将funcServer和funcClientSocket改为类成员变量,避免局部变量销毁
QTcpServer* funcServer = new QTcpServer(this);
if (!(funcServer->listen(QHostAddress::AnyIPv4, 8011))) {
    qDebug() << "Failed to start the server.";
} else {
    qDebug() << "Server started on port" << funcServer->serverPort() << " with address = "<< funcServer->serverAddress();
}

// 等待客户端连接
if (funcServer->waitForNewConnection(-1)) {
    QTcpSocket* funcClientSocket = funcServer->nextPendingConnection();
    qDebug() << "A client is connected.";
    this->isConnected = true;
    
    // 处理客户端连接
    while(true){
        qDebug() << "Trying to receive:";
        // 阻塞等待数据就绪
        if(funcClientSocket->waitForReadyRead(-1)){
            QByteArray data = funcClientSocket->readAll(); // 读取所有可用数据
            qDebug() << "Received data:" << data;
        } else {
            qDebug() << "Socket error or disconnected.";
            break;
        }
    }
}

推荐的非阻塞信号槽实现

QT网络编程更推荐非阻塞的信号槽机制,避免阻塞主线程:

// 在类中定义槽函数
void onReadyRead(){
    QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());
    if(socket){
        QByteArray data = socket->readAll();
        qDebug() << "Received data:" << data;
    }
}

// 接受连接时绑定信号
if (funcServer->waitForNewConnection(-1)) {
    QTcpSocket* funcClientSocket = funcServer->nextPendingConnection();
    connect(funcClientSocket, &QTcpSocket::readyRead, this, &YourClass::onReadyRead);
    connect(funcClientSocket, &QTcpSocket::disconnected, funcClientSocket, &QTcpSocket::deleteLater);
    qDebug() << "A client is connected.";
    this->isConnected = true;
}

内容的提问来源于stack exchange,提问作者Aman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:32:07