2011-11-18 258 views
8

我發現這篇文章關於Java實現的簡單的代理服務器:壓縮和解壓流

http://www.java2s.com/Code/Java/Network-Protocol/Asimpleproxyserver.htm

的代碼只是獲取來自客戶端的一些數據流,之後發送到服務器,並從獲取流之後服務器並將響應發送給客戶端。我想要做的就是在發送它之前壓縮這些流,並在收到它之後解壓縮。

我發現類GZIPInputStream,但我不知道如何使用它,以及我在互聯網上找到的東西沒有幫助我。我不是那麼瞭解,或者對我來說這不是一個好的解決方案。

我的想法是太那個,但我不知道,如果它的確定:

final InputStream streamFromClient = client.getInputStream(); 
final OutputStream streamToClient = client.getOutputStream(); 
final InputStream streamFromServer = server.getInputStream(); 
final OutputStream streamToServer = server.getOutputStream(); 

InputStream gzipStream = new GZIPInputStream(streamFromClient); 
try 
{ 
     while ((bytesRead = gzipStream.read(request)) != -1) 
     { 
        streamToServer.write(request, 0, bytesRead); 
        streamToServer.flush(); 
     } 
} 
catch (Exception e) { 
System.out.println(e); 
} 

現在發送到服務器的數據應該在發送之前被壓縮(但我不知道這是否是一個正確的解決方案)。是嗎?

現在設想服務器向我發送壓縮數據。 所以這個流:

final InputStream streamFromServer = server.getInputStream(); 

被壓縮。

我怎麼能解壓縮並寫入

final OutputStream streamToClient = client.getOutputStream(); 

感謝您的幫助,夥計們!

+0

cross-post:[java-forums.org - compress-decompress-streams](http://www.java-forums.org/new-java/51442-compress-decompress-streams.html) –

回答

9

閱讀這些流的javadoc:http://download.oracle.com/javase/6/docs/api/java/util/zip/GZIPInputStream.htmlhttp://download.oracle.com/javase/6/docs/api/java/util/zip/GZIPOutputStream.html

GZIPOutputStream在將它們發送到包裝的輸出流之前壓縮您寫入的字節。 GZIPInputStream從包裝流中讀取壓縮字節並返回未壓縮的字節。

所以,如果你想發送壓縮字節給任何人,你必須寫一個GZIPOutputStream。但是,當然,這隻有在接收端知道它並解壓縮接收到的字節時纔有效。

同樣,如果你想讀取壓縮字節,你需要從GZIPInputStream中讀取它們。但是,當然,只有在發送端使用相同的算法壓縮字節時纔會起作用。

+0

謝謝你,非常有幫助! –