jekeyhui99 发表于 2015-11-23 20:43:13

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


由于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<String, Object> map=new HashMap<String, Object>();
    Double[] arr=new Double;
    for(int index=0;index<10000;index++)
    {
   arr=Math.random();
    }
    map.put("arr", arr);
    map.put("name", "weni");
    map.put("age", "27");
    try
    {
amfOut.writeObject(map);
dataOutStream.flush();
} catch (IOException e)
{
e.printStackTrace();
}

    byte[] messageBytes = outStream.toByteArray();
   
   
   
    try
    {
      FileOutputStreamos;
      OutputStreamWriterow;
      BufferedWriterout;
      os=newFileOutputStream("D://test.txt");
      ow=newOutputStreamWriter(os);
      out=newBufferedWriter(ow);
      os.write(messageBytes);
      os.flush();
      os.close();
      messageBytes=compressBytes(messageBytes); //将数据进行压缩
      System.out.println("OK");
}catch(Exceptione)
{
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;
ByteArrayOutputStream o = new ByteArrayOutputStream(input.length);
try
{
byte[] buf = new byte;
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;
decompresser.reset();
decompresser.setInput(input);
ByteArrayOutputStream o = new ByteArrayOutputStream(input.length);
try
{
byte[] buf = new byte;


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)
}
}
页: [1]
查看完整版本: Java和flash通信中数据的zlib压缩与解压缩