GZIPOutputStream套接字使用的长度

时间:2013-12-24 17:56:00

标签: java sockets http gzip

我正在使用套接字在Java中开发一个小型Web服务器。我让它像HTTP一样工作,Connection: keep-alive,依此类推。 现在,我想压缩(GZIP)发送的数据。

为了确保Connection: keep-alive得到尊重,我从不关闭套接字。这就是我需要在content-length发送每个回复的原因。使用普通文件很容易。 我就是这样做的。

out.println(HTTP_VERSION + " 200 OK");
out.println("Content-Type: "+Files.probeContentType(f.toPath())+"; charset=UTF-8\nContent-Length:"+f.length()+"\n");
Files.copy(f.toPath(), so.getOutputStream());

但我不知道如何检索GZIPOutputStream的大小。

这就是我想做的事。

GZIPOutputStream gos = new GZIPOutputStream(so.getOutputStream());
out.println(HTTP_VERSION + " 200 OK");
out.println("Content-Type: "+Files.probeContentType(f.toPath())+"; charset=UTF-8\nContent-Encoding: gzip\nContent-Length:"+SIZE HERE+"\n");
Files.copy(f.toPath(), gos);
gos.finish();

请问好吗?谢谢。祝圣诞快乐!

更新

我设法解决了我的问题。这是最终的代码:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
GZIPOutputStream gos = new GZIPOutputStream(bos);
Files.copy(f.toPath(), gos);
gos.finish();
out.println("Content-Type: "+Files.probeContentType(f.toPath())+"; charset=UTF-8\nContent-Encoding: gzip\nContent-Length:"+bos.toByteArray().length+"\n");
bos.writeTo(so.getOutputStream());

感谢JB Nizet和Brant Unger

1 个答案:

答案 0 :(得分:0)

我设法解决了我的问题。这是最终的代码:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
GZIPOutputStream gos = new GZIPOutputStream(bos);
Files.copy(f.toPath(), gos);
gos.finish();
out.println("Content-Type: "+Files.probeContentType(f.toPath())+"; charset=UTF-8\nContent-Encoding: gzip\nContent-Length:"+bos.toByteArray().length+"\n");
bos.writeTo(so.getOutputStream());

感谢JB Nizet和Brant Unger