2014-01-07 64 views
3

我將MultiPart內容發送到我的遠程服務器以將其存儲在文件系統中。爲此,我使用Java TCP/IP協議。爲避免網絡帶寬和TCP輸入/輸出緩衝存儲器,我以GZIP壓縮格式發送數據。但是,我無法解壓從客戶端收到的數據。我得到了Unexpected end of ZLIB input stream異常。它由於服務器正在接收數據而在chunksTCP Socket以GZIP壓縮格式發送數據

Java代碼的

客戶

OutputStream out = new GZIPOutputStream(sock.getOutputStream()); 
    byte[] dataToSend = FileUtil.readFile(new File("/Users/bharathi/Downloads/programming_in_go.pdf")); 
    out.write(dataToSend); 

服務器

out = new FileOutputStream("/Users/bharathi/Documents/request_trace.log"); 
    InputStream in = new GZIPInputStream(clntSocket.getInputStream()); 
    int totalBytesRead = 0; 
    int bytesRead; 
    byte[] buffer = new byte[BUFFER_SIZE]; 

    while ((bytesRead = in.read(buffer)) != -1) 
    { 
     out.write(buffer , 0 , bytesRead); 
     totalBytesRead += bytesRead; 
    } 

有沒有什麼解決派遣在插座GZIP壓縮格式的數據?

+1

您可能需要更改協議以首先發送大小以進行讀取。 –

回答

3

GZIPOutputStream生成一個GZIP file format,這意味着另一端必須接收完整的流(它是一個文件),然後才能處理它,這就是錯誤的原因。

如果你正在尋找實際上做一個基於數據流的數據傳輸,請放下gzip,並去zlib,我相信Zlib compression Using Deflate and Inflate classes in Java答案如何做到這一點。

+0

它不適用於Socket流。我們以塊的形式接收數據。解決的辦法是,我必須等待整個數據的接收。在這種情況下,記憶是我關心的。 – kannanrbk

+0

什麼不行? zlib的?當然它會,Zlib在Sockets下工作見 - http://javatechniques.com/blog/compressing-data-sent-over-a-socket/ – nrathaus

0

嘗試增加:

out.flush(); 
sock.shutdownOutput(); 

到您的客戶端代碼。