2011-05-09 3 views
1

클라이언트 서버 프로그램에서 이미지 파일과 2 개의 int를 메시지로 보내고 싶습니다.QT에서 소켓을 통해 더 큰 물체를 전송하는 방법은 무엇입니까?

나는 이것에 대한 QLocalSocketQImage을 사용하고 있습니다.

그러나 이미지와 정수가 버퍼에 완전히 기록 된 후에 만 ​​소켓을 읽는 방법을 모르겠다. readyRead 신호가 이미 첫 번째 바이트 수 이후에 발생하기 때문에.

여기 내 코드의 일부를 다음과 같습니다

// sending 
QDataStream stream(socket); 
stream << image << i << j; 


// recieving 
void MainWindow::readyRead() { 
    // ... 
    if (socket->bytesAvailable() > 400) 
    { 
     QByteArray b = socket->readAll(); 
     QDataStream stream(&b, QIODevice::ReadOnly); 

     QImage image; 
     int i, j; 
     stream >> image >> i >> j; 
    // ... 
    } 
} 
내가 들어오는 파일 크기를 추측했지만, QImage는 PNG로 직렬화하기 때문에 데이터 크기가 가변적이며 때로는 파일의 끝이 기록되지 않습니다

내가 그것을 읽기 시작하기 전에 버퍼.

쉬운 해결책이 있습니까?

+1

당신은 단지 첫 번째 이미지의 크기를 보낼 수 있습니까? 예를 들어 공통 인터페이스로 정의 된 헤더 구조. 보낸 사람 태그, 타임 스탬프, 이름 등의 유용한 정보도 포함 할 수 있습니다. – Dennis

답변

1

BMP 형식에는 크기 정보가 있고 PNG 형식에는 각 청크에 대한 크기 정보가 있습니다. QImage가 직렬화하는 형식입니다.

당신이 다음 QBuffer 먼저 QImage를 직렬화 원시 데이터에서 정보를 추출 할 수없는 경우

는 (그래서 당신은/제어 크기 및 형식 더 잘 알고있다). 그런 다음 크기와 버퍼를 스트리밍합니다.

+0

감사합니다. QBuffer에서 개체의 크기를 가져 와서 지금 작동합니다. – sekmet64

3

전송할 데이터를 설명하는 고정 크기 헤더를 먼저 보내야합니다. 구체적으로 유형 및 크기 (바이트)입니다.

그러면 readReady 이벤트를 수신 할 때 버퍼에서 사용할 수있는 데이터를 가져옵니다. 필요한 모든 데이터를 받았다고 판단되면 QImage 객체로 스트리밍 할 수 있습니다.

1

코드 예제 : 당신이 socket->bytesAvailable() 전체 QByteArray을 스트리밍 할 수 있습니다 얼마나 큰 알 수 있도록

QBuffer buffer; 
image.save(&buffer, "PNG", 100); //can change the compression level to suit the application - see http://qt-project.org/doc/qt-4.8/qimage.html#save 
qint64 length = sizeof(quint32) + buffer.data().size(); //http://doc.qt.digia.com/4.7/datastreamformat.html 
stream << length; 
stream << buffer.data(); 

그런 다음 다른 쪽 끝에서 먼저 qint64 길이를 스트리밍. 그런 다음 :

QByteArray ba; 
stream >> ba; 
QImage image = QImage::fromData(ba); // Get image from buffer data 
관련 문제