`
jayjayjays
  • 浏览: 214874 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

抽出flash与java 用AMF交互代码

阅读更多

最近做的一个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);
        }
    }

}

 

5
0
分享到:
评论

相关推荐

    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