我正在使用套接字在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
答案 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