2011-05-09 15 views
1

我想在客戶端服務器程序中發送/接收圖像文件和2個整數作爲消息。如何通過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 2011-05-09 17:06:38

回答

1

的BMP格式具有尺寸信息和PNG格式具有用於每個塊的大小的信息。這些是QImage序列化的格式。

如果你不想提取原始數據中的信息,然後第一序列的QImage到Q緩衝器(所以你知道/控制大小和格式更好)。然後流傳輸大小和緩衝區。

+0

謝謝,我設法從QBuffer獲得對象的大小,現在它可以工作。 – sekmet64 2011-05-10 14:38:58

3

我將發出一個固定大小標頭的第一描述正在發送的數據,特別是在字節類型和大小。

然後當你收到你拉什麼數據是可用到緩衝區readReady事件。一旦你確定你已經收到了所有必要的數據,你可以將它流入一個QImage對象。

1

代碼示例:

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長度,所以你知道socket->bytesAvailable()有多麼大,是流出來的完整的QByteArray。然後:

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