抽出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);
        }
    }

}

 

openamf-java openamf,java版本的remoting 立即下载

相关推荐

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

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

Flex通信-Java服务端通信实例

Flex与Java通信的方式有很多种,比较常用的有以下方式: WebService:一种跨语言的在线服务,只要用特定语言写好并部署到服务器,其它语言就可以调用 HttpService:通过http请求的形式访问服务器 RmoteObject:通过AMF协议,以二进制的形式交互数据 Socket:套接字协议,服务器和客户端以IO的形式交互数据 上面几种各有个的优势:WebService常用...

上善若水任方圆 237

AMF抓取flex页面数据

抓取AMF协议的flex页面,支持模拟登录和页面抓取。

amf3 java_java amf3格式数据的接收与响应

package org.jivesoftware.openfire.plugin.mongodb.file;import javax.servlet.ServletInputStream;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet...

weixin_28727943的博客 346

IEC61850实战:从ICD文件解析到模型构建

本文深入解析IEC61850标准中的ICD文件结构,从Header、IED到DataTypeTemplates部分,详细介绍了如何构建电力自动化设备的数据模型。通过实战案例展示ICD文件的创建过程,并分享常见问题的调试技巧,帮助工程师快速掌握IEC61850建模方法,提升电力系统自动化项目的实施效率。

weixin_26841743的博客 496

Pika Labs vs Runway ML:零基础小白如何选择最适合自己的AI视频生成工具?

本文详细对比了Pika Labs和Runway ML两款AI视频生成工具,从操作界面、生成效果、隐藏成本、工作流适配性和未来兼容性五个维度进行分析。Pika Labs适合零基础用户快速生成社交媒体短内容,而Runway ML则更适合专业级视频制作。帮助用户根据自身需求选择最适合的AI视频生成工具。

wood5的博客 598

flex java amf,用于AMF调用的服务浏览器(Flex至Java)

Has anyone used or is aware of a service browser to test AMF calls? I am looking for a tool similar to ZamfBrowser ( http://www.zamfbrowser.org ), but one that works for the Java environment. ZamfBro...

weixin_42515376的博客 213

【软件系统架构】系列四:嵌入式软件-NPU(神经网络处理器)系统及模板

NPU(Neural Processing Unit) 是专门用于人工神经网络推理与训练的处理器,具备高并行、低功耗、低延迟等特点。它是边缘 AI、自动驾驶、智能摄像头、语音识别等场景中的关键硬件。

moton2017的博客 2247

amf3 java_AMF3+JAVA的调用范例

[AS3]AMF3+JAVA的调用范例amf是Adobe独家开发的数据封装格式,Flash可以直接访问,由于它是基于二进制的数据传输,所以相对于xml SOAP、json、webService等基于字符串的数据格式,有数据体积小和效率高的特点。amf目前有AMF0和AMF3两种格式,flash8以前版本只支持AMF0,flash9支持两种格式。AMF3比AMF0效率更高。调试环境:1、JDK ...

weixin_42465051的博客 581

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 2049

uni-app - 文本展开 / 收起折叠功能,支持自定义样式(当文本内容超出规定行数后,展开收起折叠的功能)兼容 H5 / App / 小程序且易用更容易修改的插件组件源码,超详细的示例代码及注释

uniapp实现文本的展开与收起功能,uniapp展开全部和收起,uniapp里文本的展开与收起,uniapp中文本内容超出规定行数后展开收起的处理,UNIAPP兼容h5、微信小程序多行文本展开或收起,uni-app中,文字超出隐藏并显示省略号(实现展开、收起全文),uni-app中文本过长-实现折叠与展开效果,中文本内容超出规定行数(字数)后展开收起的处理,超出部分...显示,uniapp适用于uniapp多行文本溢出显示...,多行文本展开或收起,uni-app-文本展开/收起折叠功能,支

🏆 前端领域优质创作者 5636

amf3 java_java与as3,amf交互相互解析vo数据例子

AMF这东西跟服务端交互还是挺爽的,搜了一下,发现网上没有很完整的例子,大多只有一段。今天整理下之前的项目代码,抽出amf来上个教程,怕以后忘记了。本教程写的是http,Servlet交互的方式。socket方式要写粘包,代码麻烦,不写了。调试环境1.java jdk 1.62.flash builder 4.53.blazeDS(下载地址http://opensource.adobe.com/w...

weixin_39627430的博客 297

【Android 11】使用Android Studio调试系统应用之Settings移植(五):编译Settings 模块、解决编译错误

基于Andorid 11,系列第5篇文章,本章开始,终于轮到解决正主Settings的编译问题了,使用android studio编译出Settings.apk,能看到这一章的同学,也着实不容易了,再接再厉

上周的博客 3919

java与as3,amf交互相互解析vo数据例子

为什么80%的码农都做不了架构师?>>> ...

weixin_33753003的博客 245

STM32入门教程:水位传感器应用

这是一个简单的STM32水位检测系统的入门教程。希望通过学习本教程,您能对STM32微控制器的基本应用有更深入的了解,并能成功构建一个水位检测系统。如果您需要更详细的代码实例和教程,请参考相关的STM32开发手册和应用笔记。STM32是一款功能丰富且广泛应用于嵌入式系统的微控制器系列。在本教程中,我们将介绍如何使用STM32微控制器和水位传感器构建一个水位检测系统。

wx_linying1029的博客 533

DMA engine initialization failed rk3568的原因及解决方案

刚开始调试 switch 芯片的时候由于rgmii 时钟是output , rk3568的 GMAC 需要 switch 芯片提供 125M的时钟,如果没有这个时钟就会初始化失败,进入文件系统后 ethx 不会出现(当然,如果屏蔽掉这里ethx 会出现,但是引发更多的问题,笔者在这块耍小聪明,导致耗费了近一个月时间,把网络这块整个查了一遍 -----)dma 软复位是在进入文件系统后,网络系统启动的时候,我想如果在这个之前只要提供合适的时钟那么就是可以的,那么------以上是官方的文档说明。

Nyiragongo的博客 4572

AMF3+JAVA的调用范例

 amf是Adobe独家开发的数据封装格式,Flash可以直接访问,由于它是基于二进制的数据传输,所以相对于xml SOAP、json、webService等基于字符串的数据格式,有数据体积小和效率高的特点。    amf目前有AMF0和AMF3两种格式,flash8以前版本只支持AMF0,flash9支持两种格式。AMF3比AMF0效率更高。调试环境:1、JDK 1.52、Resin 3.03、

飞鸟Blog 2306

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java amf3_Java AMF3 反序列化漏洞分析

写在前面的话AMF(Action Message Format)是一种二进制序列化格式,之前主要是Flash应用程序在使用这种格式。近期,Code White发现有多个Java AMF库中存在目前,漏洞相关信息已上报至美国CERT(详情请参考美国CERT VU#307983)概述目前,Code White主要对以下几种热门的Java AMF实现:Flex BlazeDS by AdobeFlex ...

weixin_39793420的博客 1178

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

flex java amf_java平台下关于flex的AMF-RPC实现

下载Flash Builder4. 给出链接(可能失效了),该ide包含了flexSDK,且为收费软件。下载BlazeDS,为了实现java-amf使用。给出链接 下载下来之后是一个war包,里面有2个文件夹WEB-INF 跟META-INF。下载Cairngorm 2,记得是2.2.1版本,其他版本有异,且笔者尚未尝试。给出链接感谢电子工业出版社的《Flex 4开发实践》 ,该书是不错的入门材料...

weixin_36122809的博客 184

基于AMF协议的Flex应用程序-性能测试

  接触过Flex应用的,基本上对于其表现层的视觉效果都是非常赞赏的,也正是由于其华丽的外表掩盖了其诸多内在的缺陷,比如说响应速度、内存泄漏等等性能问题,对于大部分的Flex开发程序员或者是测试人员都是非常头痛的事情。本人最近就碰到基于Flex应用程序的性能测试,由于它本身的特殊性,通信组建、协议基本上都是Adobe自己开发的,所以基本上通用的测试工具对他支持都是不太理想的。通过一系列的摸索,最终...

weixin_33806509的博客 182

AMF-RPC for java 基础入门

今天就是想复习下上周自学的,好像有点忘记了.一.关于AMF-RPC技术简介:AMF是专用于FLASH远程数据传输的一种数据格式.RPC是远程过程调用,也是WEB分布式服务的一种.网络上找的解释如下:Remote Procedure Calls远程过程调用 (RPC) 是一种协议,程序可使用这种协议向网络中的另一台计算机上的程序请求服务。由于使用 RPC 的程序不必了解支持通信的网络

构件.接口 3274

AMF java与as3类转换对应

ActionScript type (AMF 3)Deserialization to JavaSupported Java type bindingArray (dense)java.util.Listjava.util.Collection, Object[ ] (native array)If the typ

帆软爱好者的专栏 1831

Object转换byte[],byte[]转换Object的传统转换以及AMF的实现方式.(1)

package cn.vicky.unit;import java.io.ByteArrayOutputStream;import java.io.DataOutputStream;import java.io.IOException;import java.io.UnsupportedEncodingException;import flex.messaging.

噬日者 2473
上一篇: 公司的风气
下一篇: Linux下修改war包下的文件
jayjayjayjayjayjay
博客等级 码龄20年 1粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值