`
ogd539kk
  • 浏览: 22168 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java和flash通信中数据的zlib压缩与解压缩

 
阅读更多

Java和flash通信中数据的zlib压缩与解压缩
2009年08月25日
  script type="text/javascript">  google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);
  上篇文章介绍和如何在java中将数据封装成flash可以直接读取的amf格式,amf虽然已经“压缩”过了(相对其他xml、json等,由于基于二进制而且比较少冗余数据,体积会小很多)。
  但是还可以进一步压缩的,由于as3的bytearray支持compress和uncompress。所以我们可以在Java端将数据压缩,然后在flash端读取再解压缩,这样数据在传输过程中又会小很多。
  下面就介绍使用方法,基于前篇文章的范例:
  服务端:
  import java.io.BufferedWriter;
  import java.io.ByteArrayOutputStream;
  import java.io.DataOutputStream;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.OutputStreamWriter;
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.zip.Deflater;
  import java.util.zip.DeflaterOutputStream;
  import java.util.zip.Inflater;
  import java.util.zip.ZipFile;
  import java.util.zip.ZipInputStream;
  import flex.messaging.io.SerializationContext;
  import flex.messaging.io.amf.Amf3Output;
  import flex.messaging.log.Log;
  import flex.messaging.messages.Message;
  public class Test {
  /**
  * @param args
  */
  public static void main(String[] args)
  {
  SerializationContext serializationContext=new SerializationContext();
  Amf3Output amfOut = new Amf3Output(serializationContext);
  ByteArrayOutputStream outStream = new ByteArrayOutputStream();
  DataOutputStream dataOutStream = new DataOutputStream(outStream);
  amfOut.setOutputStream(dataOutStream);
  HashMap map=new HashMap();
  Double[] arr=new Double[10000];
  for(int index=0;indexmap);
  dataOutStream.flush();
  } catch (IOException e)
  {
  e.printStackTrace();
  }
  byte[] messageBytes = outStream.toByteArray();
  try 
  { 
  FileOutputStream  os; 
  OutputStreamWriter  ow; 
  BufferedWriter  out; 
  os  =  new  FileOutputStream("D://test.txt"); 
  ow  =  new  OutputStreamWriter(os); 
  out  =  new  BufferedWriter(ow); 
  os.write(messageBytes);
  os.flush();
  os.close();
  messageBytes=compressBytes(messageBytes); //将数据进行压缩
  System.out.println("OK");
  }catch(Exception  e) 
  {
  System.out.println("error  :"  +  e);                      
  }
  }
  private static int cachesize = 1024;
  private static Inflater decompresser = new Inflater();
  private static Deflater compresser = new Deflater();
  public static byte[] compressBytes(byte input[])
  {
  compresser.reset();
  compresser.setInput(input);
  compresser.finish();
  byte output[] = new byte[0];
  ByteArrayOutputStream o = new ByteArrayOutputStream(input.length);
  try
  {
  byte[] buf = new byte[cachesize];
  int got;
  while (!compresser.finished())
  {
  got = compresser.deflate(buf);
  o.write(buf, 0, got);
  }
  output = o.toByteArray();
  } finally
  {
  try
  {
  o.close();
  } catch (IOException e)
  {
  e.printStackTrace();
  }
  }
  return output;
  }
  public static byte[] decompressBytes(byte input[])
  {
  byte output[] = new byte[0];
  decompresser.reset();
  decompresser.setInput(input);
  ByteArrayOutputStream o = new ByteArrayOutputStream(input.length);
  try
  {
  byte[] buf = new byte[cachesize]; 
  int got;
  while (!decompresser.finished())
  {
  got = decompresser.inflate(buf);
  o.write(buf, 0, got);
  }
  output = o.toByteArray();
  }catch(Exception e)
  {
  e.printStackTrace();
  }finally
  {
  try
  {
  o.close();
  } catch (IOException e)
  {
  e.printStackTrace();
  }
  }
  return output;
  }
  }
  客户端:
  public class AMF3Test extends Sprite
  {
  private var loader:URLLoader;
  public function AMF3Test()
  {
  loader=new URLLoader();
  loader.load(new URLRequest("D://test5.txt"));
  loader.addEventListener(Event.COMPLETE,onComplete);
  loader.dataFormat=URLLoaderDataFormat.BINARY;
  }
  private function onComplete(evt:Event):void
  {
  var start:Number=getTimer();
  var byte:ByteArray=loader.data as ByteArray;
  byte.uncompress() //将数据进行解压缩
  var obj:Object=byte.readObject();
  var end:Number=getTimer();
  trace("耗时:"+(end-start)+"毫秒")
  trace(obj.name,obj.age,obj.arr.length)
  }
  }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics