2011-11-18 154 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

谢谢你,非常有帮助! –