GZIPOutputStream을 사용하여 클라이언트에서 String을 인코딩하려고 시도하고 GZIPOutputStream을 사용하여 서버에서 문자열을 디코딩하려고합니다.GZIPInputStream 수신자 측에서 디코딩 할 수 없습니다. (유효하지 않은 코드 길이가 설정되었습니다.)
(초기 소켓 연결 설정 이후) 클라이언트 측 코드는 다음과 같습니다 제가 확인
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;
}
과 :
// ... 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();
그리고 서버 측 (연결을 설정 한 후 다시) 코드 버퍼 길이 (즉, 코딩 된 메시지의 크기)가 올바르게 전달되므로 올바른 바이트 수가 전송됩니다. 그러나 나는 이것을 얻고 있습니다 :
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에는 스트림 마지막 부분에 몇 가지 끝 바이트가 필요합니다. – Eugene
Thx Eugene, 결국 문자열로 코딩하는 대신 바이트 스트림을 사용한 다음 해당 문자열을 디코딩하면됩니다. – amirkr