2012-10-22 77 views
4

我試圖通過套接字在Qt服務器中發送圖像上載,並在使用Java創建的客戶機中將其可視化。到目前爲止,我只是通過傳輸字符串來雙方進行通信,並嘗試了不同的示例來發送圖像,但沒有任何結果。使用qt通過套接字發送圖像並使用java讀取它

我用於將圖像中的QT傳輸的代碼是:

QImage image; 
image.load("../punton.png"); 
qDebug()<<"Image loaded"; 
QByteArray ban; // Construct a QByteArray object 
QBuffer buffer(&ban); // Construct a QBuffer object using the QbyteArray 
image.save(&buffer, "PNG"); // Save the QImage data into the QBuffer 
socket->write(ban);   

在另一端的代碼在Java中讀的是:

BufferedInputStream in = new BufferedInputStream(socket.getInputStream(),1); 
File f = new File("C:\\Users\\CLOUDMOTO\\Desktop\\JAVA\\image.png"); 
System.out.println("Receiving..."); 
FileOutputStream fout = new FileOutputStream(f); 
byte[] by = new byte[1]; 
for(int len; (len = in.read(by)) > 0;){ 
fout.write(by, 0, len); 
System.out.println("Done!"); 
} 

在Java中的方法卡住,直到我關閉Qt服務器,之後生成的文件已損壞。

我會很感激任何幫助,因爲這對我來說是必要的,我也是新手來使用這兩種語言進行編程。

此外,我用了以下命令,並且接收過程現在結束並顯示一條消息,但該文件已損壞。

socket->write(ban+"-1"); 
socket->close(); in qt. 

而且在Java:

System.out.println(by); 
String received = new String(by, 0, by.length, "ISO8859_1"); 
System.out.println(received); 
System.out.println("Done!"); 

enter image description here

+0

你在循環之後在FileOutputStream上調用'close'嗎? –

+0

嘗試在寫入數據後刷新Qt服務器中的套接字流。另外,爲什麼你的緩衝區只有1個字節大小? – Vulcan

+0

它應該是什麼大小它是我的圖像是1x1像素和使用命令image.size()是105.我也嘗試過socket-> write(ban);插座 - >沖洗(); socket-> waitForBytesWritten(10000);另外我已經嘗試了不同的字節大小,並且該進程總是在java中的循環中搜索。 – user1764246

回答

1

在這樣簡單的方法你不能傳輸文件了插座。你沒有給接收器任何線索,即將來到的字節數。仔細閱讀javadoc InputStream.read()。您的接收器處於無限循環狀態,因爲它正在等待下一個字節,直到流被關閉。因此,您通過在發件人端撥打socket->close()來部分解決該問題。理想情況下,需要在緩衝區之前將ban的長度寫入套接字,然後在接收端讀取該長度,然後只接收該字節量。另外flushclose接收器流嘗試讀取收到的文件之前。

我完全不知道您想用socket->write(ban+"-1")實現什麼目標。您的記錄輸出以%PNG開頭,這是正確的。我可以在最後看到"-1",這意味着你添加了字符到圖像二進制文件,因此你已經損壞了它。爲什麼這樣?

不,1x1 PNG不具有1字節的大小。它甚至沒有4個字節(紅色,綠色,藍色,阿爾法)。 PNG需要一些東西,如標題和控制校驗和。看看文件系統上文件的大小。這是您要求的尺寸by

+0

感謝您的答案,它幫助了我很多,我注意到該文件不打開,因爲ini字符串在beginnig,因爲我使用該字符串發送命令我解決了添加in.skip(字節)的問題,所以在字符串不會出現的最終文件。 – user1764246

相關問題