java服务器和客户端 GZIP解压缩 客户端不能解压

时间:2022-04-26 19:59:05
public void queryAllProduct(HttpServletRequest request,HttpServletResponse response, String json){
Enumeration<String> headers=request.getHeaderNames();
String repStr="";
byte[] result=null;
while(headers.hasMoreElements()){
String head=headers.nextElement();
log.debug(head+":"+request.getHeader(head));
}
try{
if(json==null || json.equals("")) {
repStr = getResponse("500", "报文格式错误");
}
Map map = (Map) JSON.parse(json);
List<Product> productList=productService.queryAllProduct();
        StringBuffer data=new StringBuffer();
        data.append( "\"productAmout\":"+productList.size()+","+"\"productList\":"+JSON.toJSONString(productList));
repStr = getResponse("200", "查询所有产品信息成功",data.toString() );
        //压缩
result = repStr.getBytes("UTF-8");
response.setHeader("Content-Length", result.length+"");
if(request.getHeader("Accept-Encoding").equalsIgnoreCase("gzip")){
ByteArrayOutputStream out = new ByteArrayOutputStream(); 
GZIPOutputStream gout = new GZIPOutputStream(out); 
gout.write(result);  
gout.close();  
result = out.toByteArray(); 
response.setHeader("Content-Encoding", "gzip");
}
        //解压缩
ByteArrayInputStream bis = new ByteArrayInputStream(result);
        GZIPInputStream gis =new GZIPInputStream(bis);
        int len = -1;
byte [] b1 =new byte[1024];
StringBuilder sb = new StringBuilder();
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        while((len = gis.read(b1)) != -1){
      bos.write(b1, 0, len);
}
bos.close();         
return;
}catch (Exception e) {
repStr=getResponse("500", "异常错误!");
log.info("程序出错:"+e.getMessage());
}
sendJSONToClient(result.toString(), response);
}



private String getResponse(String errorCode, String errorMsg, String data) {
String json = "{" + 
"\"returnFlag\":\""+errorCode+"\"," +
"\"returnMsg\":\"" +errorMsg+"\"";
if(data!=null) {
json += ",";
json += data;
}

json += "}";
return json;
}

private  void sendJSONToClient(String data,HttpServletResponse response){
response.setContentType("application/json;charset=UTF-8"); 
        response.setHeader("Pragma", "no-cache");      
        response.setHeader("Cache-Control", "no-cache, must-revalidate");      
        response.setHeader("Pragma", "no-cache"); 
        response.setHeader("Access-Control-Allow-Origin","*");
        try {      
            response.getWriter().write(data);      
            response.getWriter().flush();      
            response.getWriter().close();   
        } catch (IOException e) {      
            e.printStackTrace();  
        } 
}


现在的问题是,客户端解压出现readyfully异常,或者是unknown formart magic number异常
,客户端是android的,解压的代码是以前上线用的,怀疑是服务器压缩的有问题,或者是传输的字节编码问题,本地解压是可以的

5 个解决方案

#1


编码的可能性比较大,你先获取Content-Encoding看看。

#2


该回复于2014-02-10 10:43:28被版主删除

#3


java自带的zip压缩貌似对中文支持的不太好,用ant压缩试试。。。。。

#4


我也碰到这样的问题,请问现在你解决了吗

#5


内容不要自己做压缩,把原始的信息写入response,http服务器会根据客户端上传的参数,和自身支持的压缩方法,自动进行:

客户端请求中加入   Accept-Encoding:gzip, deflate, sdch,服务端响应中  包括 Content-Encoding:gzip
就实现了数据压缩,几种压缩方法主流服务器都能支持,可能需要配置参数

#1


编码的可能性比较大,你先获取Content-Encoding看看。

#2


该回复于2014-02-10 10:43:28被版主删除

#3


java自带的zip压缩貌似对中文支持的不太好,用ant压缩试试。。。。。

#4


我也碰到这样的问题,请问现在你解决了吗

#5


内容不要自己做压缩,把原始的信息写入response,http服务器会根据客户端上传的参数,和自身支持的压缩方法,自动进行:

客户端请求中加入   Accept-Encoding:gzip, deflate, sdch,服务端响应中  包括 Content-Encoding:gzip
就实现了数据压缩,几种压缩方法主流服务器都能支持,可能需要配置参数