`
hereson
  • 浏览: 1454159 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

抽出flash与java 用AMF交互代码

    博客分类:
  • flex
阅读更多

最近做的一个java 与flash通讯的项目,由于项目框架的需要,要把AMF 格式解析代码抽出.代码有点乱,现丑了.

 

package com.musicxx.web.servlet;  
  
  
  
import java.io.ByteArrayOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
  
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
import juan.framework.action.Action4J;  
import juan.framework.arguments.ArgumentsFactory;  
import juan.framework.arguments.IArguments;  
import juan.view.context.IContext;  
import juan.view.context.impl.InnerContextImpl;  
  
import org.apache.commons.logging.Log;  
import org.apache.commons.logging.LogFactory;  
  
import flex.messaging.io.SerializationContext;  
import flex.messaging.io.amf.ActionMessage;  
import flex.messaging.io.amf.Amf0Input;  
import flex.messaging.io.amf.Amf0Output;  
import flex.messaging.io.amf.Java15Amf0Output;  
import flex.messaging.io.amf.MessageBody;  
import flex.messaging.io.amf.MessageHeader;  
  
  
  
/** 
 * Description : AMF通讯方式 
 *  
 * @author: JayChou 
 * @version 1.0 
 * @Created on Aug 18, 2008 5:57:21 PM 
 */  
public class AmfServlet extends HttpServlet  {  
 private static Log logger = LogFactory.getLog(AmfServlet.class);  
    /** 
     * flash-->java 
     * @return 
     * @throws IOException  
     * @throws ClassNotFoundException  
     * @throws Exception 
     */  
    private ActionMessage in(InputStream is) throws IOException, ClassNotFoundException {  
        ActionMessage inMs = new ActionMessage();  
        Amf0Input amfIn = new Amf0Input(SerializationContext.getSerializationContext());  
        amfIn.setInputStream(is);  
        int version = amfIn.readUnsignedShort();  
        inMs.setVersion(version);  
  
        int headerCount = amfIn.readUnsignedShort();  
        for (int i = 0; i < headerCount; ++i) {  
            MessageHeader header = new MessageHeader();  
            inMs.addHeader(header);  
            header.setName(amfIn.readUTF());  
            header.setMustUnderstand(amfIn.readBoolean());  
            amfIn.readInt();  
            amfIn.reset();  
            header.setData(amfIn.readObject());  
        }  
  
        int bodyCount = amfIn.readUnsignedShort();  
        for (int i = 0; i < bodyCount; ++i) {  
            MessageBody body = new MessageBody();  
            inMs.addBody(body);  
            body.setTargetURI(amfIn.readUTF());  
            body.setResponseURI(amfIn.readUTF());  
            amfIn.readInt();  
            amfIn.reset();  
            body.setData(amfIn.readObject());  
        }  
  
        amfIn.close();  
        amfIn=null;  
          
        return inMs;  
    }  
  
    /** 
     * java --> flash 
     * @param o 
     * @throws IOException  
     * @throws Exception 
     */  
    private void out(ActionMessage outMs,HttpServletRequest request, HttpServletResponse response) throws IOException {  
        ByteArrayOutputStream outBuffer = new ByteArrayOutputStream();    
          
        Amf0Output amfOut = new Java15Amf0Output(SerializationContext.getSerializationContext());  
        int version = outMs.getVersion();  
        amfOut.setAvmPlus(version > 0);  
        amfOut.setOutputStream(outBuffer);  
        amfOut.writeShort(version);  
  
        int headerCount = outMs.getHeaderCount();  
        amfOut.writeShort(headerCount);  
        for (int i = 0; i < headerCount; ++i) {  
            MessageHeader header = outMs.getHeader(i);  
            amfOut.writeUTF(header.getName());  
            amfOut.writeBoolean(header.getMustUnderstand());  
            amfOut.writeInt(-1);  
            amfOut.reset();  
            amfOut.writeObject(header.getData());  
        }  
  
        int bodyCount = outMs.getBodyCount();  
        amfOut.writeShort(bodyCount);  
        for (int i = 0; i < bodyCount; ++i) {  
            MessageBody body = outMs.getBody(i);  
            if (body.getTargetURI() == null)  
                amfOut.writeUTF("null");  
            else  
                amfOut.writeUTF(body.getTargetURI());  
            if (body.getResponseURI() == null)  
                amfOut.writeUTF("null");  
            else  
                amfOut.writeUTF(body.getResponseURI());  
            amfOut.writeInt(-1);  
            amfOut.reset();  
            amfOut.writeObject(body.getData());  
        }  
  
        response.setContentType(request.getContentType());  
        response.setContentLength(outBuffer.size());  
        outBuffer.writeTo(response.getOutputStream());  
        response.flushBuffer();  
        amfOut.flush();  
        amfOut.close();  
        amfOut=null;  
    }  
      
    @Override  
    protected void service(HttpServletRequest req, HttpServletResponse resp)  
            throws ServletException, IOException {  
        Action4J action = new Action4J();  
        IContext icontext = new InnerContextImpl();  
        IArguments args = ArgumentsFactory.getArguments();  
          
        action.setContext(icontext);  
        action.setRequest(req);  
        action.setResponse(resp);  
        action.setServletConfig(getServletConfig());  
        action.setServletContext(getServletContext());  
          
        ActionMessage outMs = new ActionMessage();  
        ActionMessage inMs = null;  
        try {  
         inMs = in(req.getInputStream());  
            outMs.setVersion(inMs.getVersion());  
              
            for(int i=0;i<inMs.getBodyCount();i++){  
                  
                MessageBody body = inMs.getBody(i);  
                String method = body.getReplyMethod().split("\\.")[1];  
                Object[] o = (Object[]) body.getData();  
                  
                Object[] arr = (Object[]) o;  
                for (int j = 0; j < arr.length; j++){  
                    args.add("index" + (j+1), arr[j]);  
                }  
                  
                action.execute("/"+method, args);  
                Object result=action.getContext().get("result");  
  
                MessageBody responseBody = new MessageBody();  
                responseBody.setData(result);  
                responseBody.setTargetURI( body.getResponseURI()+ "/onResult");  
                outMs.addBody(responseBody);       
                  
                args.clear();  
            }  
        } catch (Exception e) {    
         logger.error(e.getMessage());  
         MessageBody responseBody = new MessageBody();  
            responseBody.setData(new Object[]{100});  
            responseBody.setTargetURI( inMs.getBody(0).getResponseURI()+ "/onResult");  
            outMs.addBody(responseBody);    
        } finally {  
            args.clear();  
            out(outMs,req,resp);  
        }  
    }  
  
}  
 

分享到:
评论
1 楼 shijian0306 2009-12-03  
哥们,你的写的不错,有这个想法难得。
请允许我转下你的文章。。。

相关推荐

    FLASH与JAVA的交互

    - **Flash External Interface (FEI)**:Flash Player允许ActionScript代码通过ExternalInterface API调用JavaScript函数,进而与网页中的Java代码进行交互。这种方式适用于浏览器环境,Java可以通过JavaScript操作...

    Flash和java的数据交互

    Java与Flash之间的数据交互,允许前端展示与后端数据服务紧密结合,实现动态内容的实时更新和用户交互。 实现Flash和Java的数据交互通常有两种主要方式:Socket通信和AMF(Action Message Format)。 1. **Socket...

    java socket amf3 flash game framework

    Java Socket AMF3 Flash Game Framework 是一个专门为Flash游戏设计的后端框架,它结合了Java技术和AMF3编码,使得游戏开发者能够构建交互性强、安全可靠的Web游戏。在这个框架中,Java作为服务器端语言,提供了稳定...

    flash和jsp,flash和java交互的web project

    这个项目“Flash与JSP和Java交互”可能包含了以上技术的实例,通过导入到MyEclipse这样的集成开发环境(IDE)中,你可以查看源代码,理解它们是如何配合工作的。例如,可能有一个JSP页面作为前端接口,接收用户请求...

    flex与JAVA三种交互方式的源代码与视频教程

    在Java端,可以使用java.net.Socket类来创建服务器端,而在Flex客户端,使用Flash Player的Socket类进行通信。 在实际应用中,开发者通常根据项目需求选择最适合的交互方式。AMF适合大量数据交换且对性能有较高要求...

    Flex与Java的交互

    Flex与Java的交互是跨平台应用开发中的常见技术组合,允许前端用户界面(UI)与后端业务逻辑进行高效沟通。在本文中,我们将深入探讨如何使用Flex 4与Java进行通信,并通过三种不同的方法实现这一目标:RemoteObject...

    Flex和java交互的示例代码

    ### Flex与Java交互知识点 #### 一、简介 在Flex与Java进行交互的过程中,主要涉及到的是前后端的数据传输。本文将详细介绍如何通过Flex与Java进行数据交换,包括Flex客户端的实现方式、Java后端的数据处理逻辑,...

    构建FLASH和JAVA FOR SPRING应用(一)

    在Java环境中,我们通常使用BlazeDS,这是Adobe提供的一个免费服务器端技术,它可以提供AMF服务,让Spring与Flash进行无缝通信。 3. **配置Spring MVC**: 要使用BlazeDS,我们需要在Spring的配置文件中添加相应的...

    实现Flex和Java交互.rar

    Plug_in+blazeds实现Flex和Java交互.pdf"的文件,这很可能是一个详细的教程或指南,教你如何在MyEclipse 8.5集成开发环境中使用Flash Builder 4(FB4)插件和BlazeDS来实现Flex与Java之间的通信。 1. **Flex与Java...

    Flash与C#交互

    1. **Flash External Interface (AS3):** 这是Flash Player提供的一个API,允许ActionScript 3代码(Flash的编程语言)调用JavaScript函数,进而与网页中的C# Web服务或Ajax接口通信。C#服务端可以处理请求并返回...

    C#与Flash交互

    本主题将深入探讨如何使用C#作为后端语言,与前端的Flash进行有效的数据通信,实现丰富的用户交互体验。 C#是Microsoft开发的一种面向对象的编程语言,广泛应用于桌面应用、Web应用以及游戏开发等领域。它提供了...

    java_and_flash.rar_flash java_java flash

    Java和Flash是两种在Web...总之,Java与Flash的交互技术是一个综合了网络编程、数据交换格式和客户端服务器架构等多个领域的复杂主题。通过深入理解和掌握这些通信机制,开发者可以构建出更具创新性的跨平台Web应用。

    flash获取java后台数据

    在Flash中,我们可以使用ActionScript 3.0来编写代码,通过XMLSocket或HTTPService类与Java后台进行数据通信。XMLSocket允许双向实时通信,适合需要频繁交互的应用;而HTTPService则基于HTTP协议,更适合简单的请求-...

    flash+java通信例子

    本示例“Flash+Java通信例子”聚焦于如何利用Adobe Flash与Java应用程序之间进行数据交互。这两种技术结合,可以为用户提供丰富的交互式Web体验,特别是在多媒体、游戏和动态内容展示方面。 Flash是一款广泛应用于...

    Flex和java交互搭建

    Flex和Java交互搭建是开发富互联网应用程序(RIA)时常用的一种技术组合,它允许前端的Flex界面与后端的Java服务器进行数据交换和业务逻辑处理。这个项目新手用来练手非常合适,因为其结构简单,易于理解。接下来,...

    openamf最完整实例java + flash+eclipse工程源码

    这个框架允许开发者利用ActionScript(Flash编程语言)与Java进行交互,实现富互联网应用程序(RIA)的开发。OpenAMF提供了一种高效的AMF(Action Message Format)数据序列化机制,使得Java对象可以被快速、高效地...

    flex与java交互源码

    在Flex中,我们可以使用Flash Player的Socket类来创建socket连接,而在Java中,通常会用到ServerSocket和Socket类来监听和接受连接请求。这种方式的优点在于能够实时、高效地传输大量数据,但相对于AMF,它的实现...

    Flex与Java数据交互

    综上所述,Flex与Java数据交互是一个涉及客户端与服务器端协同工作的复杂过程,涉及到的技术点包括AMF协议、服务暴露、数据序列化、错误处理等多个方面。通过深入理解和熟练掌握这些知识点,开发者可以构建出高性能...

    flex flex和 java交互

    这种交互通常是通过AMF(Action Message Format)协议实现的,它提供了一种高效的数据序列化方式,使得Flex能够与Java服务进行低延迟的双向通信。 描述中的“入门实例”意味着我们将探讨如何创建一个基础的Flex-...

Global site tag (gtag.js) - Google Analytics