我有一个遗留系统,服务器会在几周内缓慢更新。层次结构如下:
1
2
3 4 5
1 is the client pc
2 is a master server
3 4 and 5 are servers across the country.
目前所有这些都是以未压缩格式来回发送POJO(普通的旧Java对象)。想想OjbectOutputStream()等。
我想压缩通过网络序列化的数据,但这样做的方式是只压缩从查询接收的数据。发送的数据是微不足道的(查询过滤器数据)。
只有客户端#1和主服务器#2立即更新。服务器#3,#4和#5可以相隔数周或数月更新。我需要一种方法让服务器#2能够检测从#3,#4或#5返回的流是否被压缩并相应地处理它(当它们升级时)。
CNC中 对于服务器#3,#4和#5,解决方案必须不引人注目。如果发生异常,这些服务器没有重新发送数据的概念。
以下是#2用于与#3,#4或#5通信的代码示例:
// Set the content type to be application/x-java-serialized-object
connection.setRequestProperty("Content-Type", "application/x-java-serialized-object");
setupHeaderAttributes(getHttpHeaders());
setupSessionCookies(getHttpHeaders());
// Load/add httpHeaders
addHeadersToConnection(connection, getHttpHeaders());
// Write the serialized object as post data
objectoutputstream = new ObjectOutputStream(connection.getOutputStream());
objectoutputstream.writeObject(obj);
objectoutputstream.flush();
// Get ready to receive the reply.
inputstream = connection.getInputStream();
setHttpStatus(connection.getResponseCode());
这可能吗?谢谢你的时间。
丹尼斯
答案 0 :(得分:1)
您可以在流的标题中读取。 GZIPOutputStream
在其他任何内容之前将GZIP标头写入流中,并且在词汇十六进制中,它看起来像:
0x1f8b 0800 0000 0000 0000
请注意,如果旧版服务器未使用Java GZIPOutputStream
,则最后8个字节可能不同。但是,the first 2 bytes will always be 0x1f8b
。剩下的标题值只是关于它来自何处以及GZIP格式使用的其他标志的信息。
答案 1 :(得分:1)
mark()
和reset()
来重置流,如果它不是GZipped流:
InputStream in = // stream from server
in = new BufferedInputStream(in);
in.mark(1024);
try {
in = new GZIPInputStream(in);
}
catch (ZipException ex) {
in.reset();
}
// "in" is now ready for use
BufferedInputStream
在这里有两个目的:首先,我知道它支持标记/重置。其次,如果底层流没有缓冲,它将提高IO性能(尽管如果它是套接字流,它将是)。
标记值1024是任意值。 GZipInputStream
构造函数应该能够通过读取前两个字符来确定底层流是否是GZip。但是,GZIP标头长度为10个字节,因此可能会尝试读取更多字节。它不应该读取超过1024个字节(如果是,则增加标记值)。
编辑:由于我从您的编辑中看到您正在使用Content-Type标头,您还可以使用它来选择性地解压缩流:新服务器将返回类似x-application/java-gzipped-serialized-object
的内容,而旧服务器将继续返回x-application/serialized-java-object
(或其他任何东西)。
以“x-”开头的内容类型不受限制;只要双方都同意,你就可以随心所欲地使用它。
答案 2 :(得分:0)
constructors of GZIPInputStream如果无法处理输入流,则抛出ZipException。
ZipException - 如果发生GZIP格式错误或压缩 使用的方法不受支持