카테고리 없음

onReadyRead 수정 전/후

joo_coding 2025. 6. 21. 10:28

수정 전

void ImageSocketManager::onReadyRead() {
    // 1. 이미지 크기 먼저 수신 (4바이트)
    if (imageSize == 0 && m_socket->bytesAvailable() >= 4) {
        QByteArray sizeBytes = m_socket->read(4);
        imageSize = (quint8)sizeBytes[0]
                    | ((quint8)sizeBytes[1] << 8)
                    | ((quint8)sizeBytes[2] << 16)
                    | ((quint8)sizeBytes[3] << 24);
        qDebug() << "📦 수신할 이미지 크기:" << imageSize;
        bytesReceived = 0;
        buffer.clear();
    }

    // 2. 이미지 데이터 누적 수신
    while (m_socket->bytesAvailable() > 0 && bytesReceived < imageSize) {
        QByteArray chunk = m_socket->read(qMin(1024, imageSize - bytesReceived));
        buffer.append(chunk);
        bytesReceived += chunk.size();
    }

    // 3. 수신 완료 후 QImage 변환
    if (bytesReceived >= imageSize) {
        qDebug() << "📷 최종 수신된 이미지 크기:" << buffer.size();
        QImage image;
        if (image.loadFromData(buffer)) {
            qDebug() << "✅ 이미지 로딩 성공";
            emit imageReceived(image, pending_st_id);
        } else {
            qWarning() << "❌ 이미지 로딩 실패";
        }

        // 초기화
        imageSize = 0;
        bytesReceived = 0;
        buffer.clear();
    }
}

 

 

수정 후

void ImageSocketManager::onReadyRead() {
    // 소켓에 데이터가 남아 있는 동안 계속 처리
    while (true) {
        // 1. 아직 이미지 크기 정보가 없다면, 4바이트 먼저 읽기
        if (imageSize == 0) {
            if (m_socket->bytesAvailable() < 4)
                return; // 데이터가 부족하니 대기
            QByteArray sizeBytes = m_socket->read(4);
            imageSize = (quint8)sizeBytes[0]
                        | ((quint8)sizeBytes[1] << 8)
                        | ((quint8)sizeBytes[2] << 16)
                        | ((quint8)sizeBytes[3] << 24);
            qDebug() << "📦 수신할 이미지 크기:" << imageSize;
            bytesReceived = 0;
            buffer.clear();
            if (imageSize <= 0) {
                qDebug() << "⚠️ 이미지 크기가 0 이하! (이미지 없음 처리)";
                imageSize = 0;
                return;
            }
        }

        // 2. 데이터가 충분하지 않으면 일단 대기
        if (m_socket->bytesAvailable() < (imageSize - bytesReceived))
            break;

        // 3. 이미지 데이터 누적 수신
        int needRead = imageSize - bytesReceived;
        QByteArray chunk = m_socket->read(needRead);
        buffer.append(chunk);
        bytesReceived += chunk.size();

        // 4. 수신 완료 후 QImage 변환
        if (bytesReceived >= imageSize) {
            qDebug() << "📷 최종 수신된 이미지 크기:" << buffer.size();
            QImage image;
            if (image.loadFromData(buffer)) {
                qDebug() << "✅ 이미지 로딩 성공";
                emit imageReceived(image, pending_st_id);
            } else {
                qWarning() << "❌ 이미지 로딩 실패";
            }
            // 초기화
            imageSize = 0;
            bytesReceived = 0;
            buffer.clear();
            // 만약 소켓에 데이터가 남아있다면 (여러 이미지 연속 수신 시), while문 반복
        }
    }
}