最近做的一个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);
}
}
}
分享到:
相关推荐
- **Flash External Interface (FEI)**:Flash Player允许ActionScript代码通过ExternalInterface API调用JavaScript函数,进而与网页中的Java代码进行交互。这种方式适用于浏览器环境,Java可以通过JavaScript操作...
Java与Flash之间的数据交互,允许前端展示与后端数据服务紧密结合,实现动态内容的实时更新和用户交互。 实现Flash和Java的数据交互通常有两种主要方式:Socket通信和AMF(Action Message Format)。 1. **Socket...
Java Socket AMF3 Flash Game Framework 是一个专门为Flash游戏设计的后端框架,它结合了Java技术和AMF3编码,使得游戏开发者能够构建交互性强、安全可靠的Web游戏。在这个框架中,Java作为服务器端语言,提供了稳定...
这个项目“Flash与JSP和Java交互”可能包含了以上技术的实例,通过导入到MyEclipse这样的集成开发环境(IDE)中,你可以查看源代码,理解它们是如何配合工作的。例如,可能有一个JSP页面作为前端接口,接收用户请求...
在Java端,可以使用java.net.Socket类来创建服务器端,而在Flex客户端,使用Flash Player的Socket类进行通信。 在实际应用中,开发者通常根据项目需求选择最适合的交互方式。AMF适合大量数据交换且对性能有较高要求...
Flex与Java的交互是跨平台应用开发中的常见技术组合,允许前端用户界面(UI)与后端业务逻辑进行高效沟通。在本文中,我们将深入探讨如何使用Flex 4与Java进行通信,并通过三种不同的方法实现这一目标:RemoteObject...
### Flex与Java交互知识点 #### 一、简介 在Flex与Java进行交互的过程中,主要涉及到的是前后端的数据传输。本文将详细介绍如何通过Flex与Java进行数据交换,包括Flex客户端的实现方式、Java后端的数据处理逻辑,...
在Java环境中,我们通常使用BlazeDS,这是Adobe提供的一个免费服务器端技术,它可以提供AMF服务,让Spring与Flash进行无缝通信。 3. **配置Spring MVC**: 要使用BlazeDS,我们需要在Spring的配置文件中添加相应的...
Plug_in+blazeds实现Flex和Java交互.pdf"的文件,这很可能是一个详细的教程或指南,教你如何在MyEclipse 8.5集成开发环境中使用Flash Builder 4(FB4)插件和BlazeDS来实现Flex与Java之间的通信。 1. **Flex与Java...
1. **Flash External Interface (AS3):** 这是Flash Player提供的一个API,允许ActionScript 3代码(Flash的编程语言)调用JavaScript函数,进而与网页中的C# Web服务或Ajax接口通信。C#服务端可以处理请求并返回...
本主题将深入探讨如何使用C#作为后端语言,与前端的Flash进行有效的数据通信,实现丰富的用户交互体验。 C#是Microsoft开发的一种面向对象的编程语言,广泛应用于桌面应用、Web应用以及游戏开发等领域。它提供了...
Java和Flash是两种在Web...总之,Java与Flash的交互技术是一个综合了网络编程、数据交换格式和客户端服务器架构等多个领域的复杂主题。通过深入理解和掌握这些通信机制,开发者可以构建出更具创新性的跨平台Web应用。
在Flash中,我们可以使用ActionScript 3.0来编写代码,通过XMLSocket或HTTPService类与Java后台进行数据通信。XMLSocket允许双向实时通信,适合需要频繁交互的应用;而HTTPService则基于HTTP协议,更适合简单的请求-...
本示例“Flash+Java通信例子”聚焦于如何利用Adobe Flash与Java应用程序之间进行数据交互。这两种技术结合,可以为用户提供丰富的交互式Web体验,特别是在多媒体、游戏和动态内容展示方面。 Flash是一款广泛应用于...
Flex和Java交互搭建是开发富互联网应用程序(RIA)时常用的一种技术组合,它允许前端的Flex界面与后端的Java服务器进行数据交换和业务逻辑处理。这个项目新手用来练手非常合适,因为其结构简单,易于理解。接下来,...
这个框架允许开发者利用ActionScript(Flash编程语言)与Java进行交互,实现富互联网应用程序(RIA)的开发。OpenAMF提供了一种高效的AMF(Action Message Format)数据序列化机制,使得Java对象可以被快速、高效地...
在Flex中,我们可以使用Flash Player的Socket类来创建socket连接,而在Java中,通常会用到ServerSocket和Socket类来监听和接受连接请求。这种方式的优点在于能够实时、高效地传输大量数据,但相对于AMF,它的实现...
综上所述,Flex与Java数据交互是一个涉及客户端与服务器端协同工作的复杂过程,涉及到的技术点包括AMF协议、服务暴露、数据序列化、错误处理等多个方面。通过深入理解和熟练掌握这些知识点,开发者可以构建出高性能...
这种交互通常是通过AMF(Action Message Format)协议实现的,它提供了一种高效的数据序列化方式,使得Flex能够与Java服务进行低延迟的双向通信。 描述中的“入门实例”意味着我们将探讨如何创建一个基础的Flex-...