카테고리 없음
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문 반복
}
}
}