【发布时间】:2017-02-06 04:43:01
【问题描述】:
我正在尝试使用 GZIPOutputStream 在客户端中对字符串进行编码,然后使用 GZIPOutputStream 在服务器中解码该字符串。
客户端代码(初始socket连接建立后)为:
// ... Establishing connection, getting a socket object.
// ... Now proceeding to send data using that socket:
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
String message = "Hello World!";
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(message);
gzip.close();
String encMessage = out.toString();
out.writeInt(encMessage.getBytes().length);
out.write(encMessage.getBytes());
out.flush();
和服务器端代码(同样,建立连接后):
DataInputStream input = new DataInputStream(socket.getInputStream());
int length = input.readInt();
byte[] buffer = new byte[length];
input.readFully(buffer);
GZIPInputStream gz = new GZIPInputStream(new ByteArrayInputStream(buffer));
BufferedReader r = new BufferedReader(new InputStreamReader(gz));
String s = "";
String line;
while ((line = r.readLine()) != null)
{
s += line;
}
我检查并正确传递了缓冲区长度(即编码消息的大小),因此传输了正确的字节数。 但是,我得到了这个:
java.util.zip.ZipException: invalid code lengths set
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164)
at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117)
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:122)
at parsing.ReceiveResponsesTest$TestReceiver.run(ReceiveResponsesTest.java:147)
at java.lang.Thread.run(Thread.java:745)
有什么想法吗?
提前感谢您的帮助!
【问题讨论】:
-
在客户端的 gzip.close() 之前尝试 gzip.finish()。 GZIP 在流的末尾需要一些结束字节。
-
谢谢尤金,最终只使用字节流而不是编码成字符串然后解码该字符串工作:)
标签: java sockets gzipinputstream gzipoutputstream