`

java amf压缩

阅读更多

http://www.5uflash.com/flashjiaocheng/Flashyingyongkaifa/2938.html

上篇文章介绍和如何在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<String, Object> map=new HashMap<String, Object>();
    Double[] arr=new Double[10000];
    for(int index=0;index<10000;index++)
    {
     arr[index]=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 
    { 
      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)
}
}

 

分享到:
评论

相关推荐

    amf解析构造.rar

    在实际项目中,AMF常用于Flex或Flash客户端与PHP、Java、Python等服务器端之间的数据交互,尤其是在实时性要求较高的游戏或Web应用程序中。因此,熟悉AMF解析构造不仅可以提升易语言编程能力,还能增强跨平台的Web...

    AMF抓取flex页面数据

    - AMF分为两种类型:AMF0和AMF3,其中AMF3提供了更好的压缩和性能。 2. **Flex与AMF通信** - Flex应用通常通过HTTP/HTTPS与服务器通信,使用AMF协议封装数据,通过Flash Player发送到服务器。这些请求可能包括...

    flex与amf

    AMF0是早期版本,而AMF3在性能和压缩率上有所提升。AMF能够序列化各种数据类型,包括字符串、数字、日期、对象等,且支持自定义类的序列化。 3. Flex与Java的连接:在Flex与Java通信中,通常使用 BlazeDS 或 ...

    Android调用AMF

    - AMF有AMF0和AMF3两个版本,AMF3提供了更好的压缩和效率。 - AMF数据类型包括Number、Boolean、String、Object、Array、Date、Null、Undefined和Mixed Array等。 - AMF数据是二进制的,因此需要解码才能读取和...

    Flex与java通讯

    AMF支持两种版本,AMF0和AMF3,其中AMF3提供了更好的压缩和性能。 3. **HTTP、HTTPS和WebSockets** Flex和Java可以通过HTTP或HTTPS协议进行通信,这是最常见的方式,适用于大多数跨域场景。BlazeDS支持通过...

    socket+AMF3

    结合"Client"这个压缩包子文件名,我们可以猜测这是一个客户端相关的实现,可能包含了一个使用socket进行网络通信,并且使用AMF3进行数据编码和解码的示例代码。在实际应用中,这样的客户端可能需要连接到服务器,...

    flex连接java服务端

    在Java中,可以使用 BlazeDS 或 GraniteDS 这样的开源项目来实现AMF支持,它们提供了与Flex客户端进行AMF通信的服务器端组件。 描述中提到的“NULL”可能意味着这篇博文主要关注的是具体的技术实现,而不是提供详细...

    Flash和java的数据交互

    实现Flash和Java的数据交互通常有两种主要方式:Socket通信和AMF(Action Message Format)。 1. **Socket通信**:Flash Player支持TCP和UDP Socket通信,可以与Java服务器建立直接的网络连接。Java服务器端可以...

    Flex与java交换数据 Flex数据交换 Flex与java交换数据教程

    AMF不仅压缩数据,还支持序列化,使得对象能在客户端和服务器之间直接传递,大大简化了数据交换的过程。 在Flex与Java交换数据时,通常需要以下步骤: 1. **设置环境**:确保你有Apache BlazeDS或Adobe LiveCycle ...

    flex与java通信

    当不使用AMF时,Flex可以借助HTTPService或WebService组件与Java进行XML或JSON数据交换。这种方式适用于跨域通信,但相比AMF,数据传输效率较低。 5. Flex客户端实现: 在Flex项目中,使用HTTPService或Web...

    FLEX JAVA THINGING IN JAVA

    在压缩包子文件的文件名"help&Api"来看,我们可以推测这个压缩包至少包含两部分:帮助文档和API参考。"help"可能是一系列的教程、指南或者常见问题解答,旨在帮助开发者理解和使用Flex与Java的集成技术。而"Api"很...

    openamf-1.0.2

    AMF有两种主要的版本:AMF0和AMF3,AMF3提供更好的压缩率和更高的性能,常被用于新的Flash Player版本。 二、OpenAMF:开源实现的AMF框架 OpenAMF是Java平台上实现的AMF库,允许开发者在服务器端处理来自Flash...

    flex调用java方法.pdf

    总结来说,Flex调用Java方法的关键在于使用Blazeds提供的Remoting服务,通过AMF(Action Message Format)通道,实现Flex客户端与Java服务器之间的高效双向通信。在Java端创建可序列化的实体类和业务处理类,同时在...

    Myeclipse整合flex4搭建java的Web项目

    在这个文件中,你可以配置Flex客户端与Java服务端通信的具体方式,例如AMF(Action Message Format)通道,以及服务的发布和安全设置。 **其他注意事项** 如果你计划在WebSphere上部署,还需要配置资源引用以支持...

    使用granite实现flex交互java

    例如,使用HTTPS确保通信安全,对AMF数据进行压缩减少网络传输开销,以及合理设计服务接口以减少不必要的数据交换。 8. **调试与日志**: 开发过程中,利用Flex的Debug Flash Player和服务器端的日志记录工具,...

    Flex与java 通信实例及配置

    Flex与Java的通信通常基于AMF (Action Message Format) 协议,而BlazeDS作为Adobe提供的服务器端解决方案,要求Java环境支持。因此,JDK版本至少为1.6。 2. **FlexBuilder 3**:这是一个集成开发环境(IDE),专门...

    java整合flex开发应用

    2. **数据交互**:使用AMF(Action Message Format)协议进行Java和Flex之间的数据传输,包括配置服务端的Servlet或Spring Bean,以及客户端的Proxy服务。 3. **Flex组件使用**:介绍Flex UI组件的创建和使用,如...

    Flex与java通讯例子

    Adobe的 BlazeDS 和 LCDS 服务支持AMF,可以实现Flex与Java之间的快速、低开销的数据交换。在Flex中,我们可以使用`RemoteObject`组件来连接到BlazeDS服务,然后调用Java服务的方法,传递和接收参数。 2. **配置...

Global site tag (gtag.js) - Google Analytics