`
worldterminator
  • 浏览: 28962 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

FLASH与服务器通讯 (JAVA)

阅读更多

1.FLASH 通过URL地址获得服务器数据。

这种方式最为简单,就像在浏览器的地址栏里面敲一样。
先建立一个URLRequest,然后用URLLoader载入就行了。

下面这个是载入一个图片,html页面也用同样方法载入。

//worldterminator原创,转载请注明此处

public function Net()
{
var loader:URLLoader;
var request:URLRequest = new URLRequest("http://www.adobe.com/devnet/images/248x148/fldc_samples_3.jpg");
loader = new URLLoader(request);
loader.addEventListener(Event.COMPLETE,completeListener);
}

		function completeListener(event:Event):void
		{
			trace( "load completed "+loader.data+" are the data ");
		}

 

这种方法的缺点显而易见,大量的参数必须写到地址里,数据被暴露而且格式转换麻烦。

//worldterminator原创,转载请注明此处

2.通过AMF协议来通讯。

AMF协议是ADOBE自己开发的一种建立在HTTP基础上的协议。可以装一个flash mx remoting来实现或者装openAMF来实现,这里只讨论openAMF。先下载一个openAMF,最好带example版本的。然后把openamf.ear放到tomcat的webapps下,启动tomcat,输入
http://localhost:8080/openamf/gateway

如果看到空白页,说明openAMF好用了。如何用呢?


amf的通信方式是在服务器端把java的class放到web-inf的class中,然后在flash端直接调用这个class的方法就行了。
比如helloworld这个例子。

 

package abc;
public class HelloServlet 
{  public String hello()  {  return "this is java server!"; }  }

 

用javac编译,把生成的class放到openAMF/classes/abc/
FLASH端这样写:

 

用javac编译,把生成的class放到openAMF/classes/abc/
FLASH端这样写:
 

建立一个netconnection,然后连接那个gateway,用call的方法调用java类的方法,格式是 包名.类名.方法名。至于返回值,用responder来接收,responder在接收到数据时会调用fun函数,把返回值写到fun函数的参数里。

 

3.socket方式通信

这种方法应该可以和任何语言通信,使用TCP/IP协议。但是,对于FLASH PLAYER 9及其以后的版本,比较麻烦的一点就是安全设置,

包括AMF方式在内,如果不设置会出现“安全沙箱”的错误。
FLASH 在连接服务器之前会发一个验证信息:内容如下:
<policy-file-request/>
对应的,你也应该发回一个验证信息,XML格式,一般可以这样写:

<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\0

注意!如果把这个串存到字符串里发回去,不要忘记那个\0,XML都是以\0结尾的。

然后FLASH会主动断开,再执行连接,然后才算连上。
//worldterminator原创,转载请注明此处

先看FLASH端代码如何写:

 

			socket = new Socket();
			socket.addEventListener(ProgressEvent.SOCKET_DATA,receiveData);
			socket.addEventListener(Event.CONNECT,begin);
			socket.connect("127.0.0.1",843);

		function begin(event:Event):void
		{
			var s:String = "a\n";
			socket.writeByte(s.charCodeAt(0));
			socket.writeByte(s.charCodeAt(1));
			socket.flush();
		}
 

FLASH端比较简单,先connect,添加CONNECT事件,如果连上了,执行begin函数,会向服务器写两个byte。
接收的时候用 receivedData函数,函数里面可以这么写:
        socket.readBytes(received);
readBytes是把发过来的字符数组存到received里,当然还可以用socket别的方法读取数据。

相对于FLASH端,JAVA服务器端就比较麻烦了。
JAVA服务器这里我们用了多线程,因为可能有很多人访问服务器。先说一下代码思路,main函数里建立一个serversocket,然后不断的接收请求,每收到一个请求,就建立一个进程,把对应的socket放到线程中。另外有一个sender取得所有线程socket的outputstream,实现广播功能。

 

public class Main {


    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(843);
        File x;
        Thread receiver;
        System.out.println("server start");
        Sender sender = new Sender();
        while (true)
        {
            Socket socket=null;
            System.out.println("waiting...");
            socket = ss.accept();
            receiver = new Receiver(socket,sender);
            System.out.println("connect from address: "+socket.getInetAddress());
            receiver.start();
        }
        //System.out.println("server over");        
    }
}
 

//worldterminator原创,转载请注明此处

这个是非主线程运行的代码:

 

package for_flash_socket;
import java.net.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Receiver extends Thread {

    Socket socket;
    final int BYTE_ARRAY_MAX_LEN = 1000;
    final String FLASH_SAFE = "<policy-file-request/>";
    static String safe = "<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-

policy>\0";
    Sender sender;
    public Receiver(Socket socket,Sender sender )
    {
        this.socket = socket;
        this.sender = sender;
    }
    
    @Override
    public void run()
    {
        try
        {
            InputStream is = socket.getInputStream();
            byte [] reader = new byte [BYTE_ARRAY_MAX_LEN];
            BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream()));
            OutputStream out = socket.getOutputStream();
            sender.addOutput(out);
            int ch=0;
            String s;            
            while ( is.read(reader) != -1 )
            {
                //System.out.println("ch - "+ch);
                s = new String(reader);
                System.out.println("reader len:"+reader.length);
                System.out.println(s);
                
                if ( s!=null && s.indexOf("<policy-file-request/>")>=0 )//安全策略
                {
                    for ( int i=0;i<s.length();i++ )
                    {
                        System.out.println(i+" "+(int)s.charAt(i));
                    }

                    bw.write(safe,0,safe.length());
                    bw.flush();
                    //bw.close();
                    System.out.println(safe);
                }
                else
                {
                    synchronized(sender)
                    {
                        sender.send(s);
                    }
                }
                reader = new byte [BYTE_ARRAY_MAX_LEN];
            }
            bw.close();
            synchronized (sender)
            {
                sender.removeOutput(out);
            }
        }
        catch (Exception ex)
        {
            System.out.println("error in receiver");
            ex.printStackTrace();
        }
        try
        {
            socket.close();
            System.out.println(socket.getInetAddress()+" disconnected");
        } catch (IOException ex1) {
            System.out.println("socket close error");
            Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex1);
        }
        
    }
}

 //worldterminator原创,转载请注明此处

sender:

 

package for_flash_socket;
import java.util.*;
import java.io.*;
public class Sender {

    ArrayList outputArrayList;
    public Sender()
    {
        outputArrayList = new ArrayList();
    }

    public void addOutput(OutputStream out)
    {
        outputArrayList.add(out);
    }

    public void removeOutput(OutputStream out)
    {
        outputArrayList.remove(out);
    }

    public void send(String s)
    {
        for (int i=0;i<outputArrayList.size();i++)
        {
            PrintWriter pw = new PrintWriter((OutputStream)outputArrayList.get(i));
            pw.write(s);
            pw.flush();
        }
    }

}
 


线程那个部分代码写得比较搓,明白原理就行了……
//worldterminator原创,转载请注明此处
这样基本的通信功能就实现了,在接收的时候先判断一下发过来的是不是安全认证s.indexOf("<policy-file-request/>")>=0
如果是返回安全认证,就是那个safe字符串。
否则把发过来的信息广播出去。sender.send方法。
//worldterminator原创,转载请注明此处
要注意的是:
 while ( is.read(reader) != -1 )这一行
我一开始用的是BufferedReader readLine()方法读取的。总是莫名奇妙的出错,所以建议不要用BufferedReader,直接读取byte或者byte数组的方式比较好。再把byte[]转成string判断是否是FLASH发过来的安全认证。

如果出现安全沙箱错误,一般是安全认证没有返回,但是别的情况也有可能出现这个错误,比如服务器的socket关闭早了,或者服务器没有把socket流内的内容读取完毕就关闭了,都会导致这个错误。
所以socket读到不能再读,然后再关闭,这个地方需要注意。

还有一个用XMLSocket的方式通信的,和socket差不多,这里不多说了,安全认证也是一样的,比socket简单一些。

这样,就完成了基本的 FLASH与JAVA 通信。

//worldterminator原创,转载请注明此处

分享到:
评论
1 楼 恋曲2000 2010-09-26  
学习了 谢谢lz

相关推荐

    flash网游基础通讯(FMS,JAVA)

    在本话题中,我们将深入探讨Flash网游基础通讯,重点关注Flash与FMS(Flash Media Server)以及Flash与Java之间的交互。这些技术在构建实时互动游戏和多媒体应用时起着至关重要的作用。 首先,让我们来看看Flash与...

    java_and_flash.rar_flash java_java flash

    "www.pudn.com.txt"和"java与flash通讯"这两个文件可能包含了关于这些通信方式的详细教程、示例代码或最佳实践,对于开发者来说是一份宝贵的学习资源。 总之,Java与Flash的交互技术是一个综合了网络编程、数据交换...

    Flex与java通讯

    可以使用如Flash Builder的模拟器进行前端测试,而Java服务可以通过JUnit等工具进行后端测试。 综上所述,Flex与Java之间的通信涉及多个层次和技术,包括数据传输协议、服务组件、后端框架集成、安全性以及性能优化...

    一苏通(java+flash)通讯工具

    "一苏通"是一款基于Java和Flash技术实现的通讯工具,专用于局域网内的实时聊天功能。这个项目展示了如何将两种不同的编程语言和技术融合在一起,以创建一个交互性强、实时性好的通信平台。下面我们将深入探讨其中...

    flash 843安全策略文件 java版本

    标题中的“flash 843安全策略文件 java版本”指的是在Flash开发中,为了实现Flash Player与服务器之间的Socket通信,必须遵循的安全策略。Flash Player在默认情况下不允许跨域访问,即不能连接到不同源的服务器。...

    flex与java通讯配置源码demo

    Apache BlazeDS项目提供了AMF通道,使得Flex能够与Java应用服务器进行AMF通讯。在Demo中,你可以找到配置BlazeDS服务以及在Flex客户端创建AMFChannel的方法,同时在Java端设置服务端点,以处理Flex发送过来的请求。 ...

    Flex与java通讯例子

    1. **AMF通信**:AMF是一种二进制格式,用于在Flash Player或Flex与服务器之间高效地传输数据。Adobe的 BlazeDS 和 LCDS 服务支持AMF,可以实现Flex与Java之间的快速、低开销的数据交换。在Flex中,我们可以使用`...

    AS与java socket通讯解决安全沙箱

    在IT行业中,网络通信是应用程序之间交互的重要方式之一。在这个场景中,我们关注的是...提供的压缩包文件“AS与java socket通讯 解决安全沙箱”可能包含示例代码或更详细的说明,帮助你更好地理解和实践这个过程。

    Flex Soket与Java通讯

    Flex Socket与Java通讯是网络编程中的一个重要领域,它允许基于Adobe Flex的客户端应用程序与服务器端的Java应用进行数据交换。Flex是一种开源的、基于ActionScript的框架,常用于创建富互联网应用程序(RIAs)。而...

    FLASH与后台总动员.pdf

    通过Socket,Flash可以实时地与服务器进行双向数据传输,实现即时通讯、在线游戏等功能。而HTTP请求则用于向服务器发送异步请求,获取数据,更新状态等。此外,Flash还可以利用FileReference对象上传文件,使用...

    通过MyEclpise整合JAVA与FLEX进行通讯(通过将JAVA工程加到FLEX工程中)

    通过上述步骤,我们完成了JAVA与FLEX的集成,实现了两者的通讯。这种方式在开发需要复杂交互和实时更新的Web应用时特别有用,如在线游戏、实时数据可视化或交互式图表等。 在实际开发中,还需要注意一些最佳实践,...

    通过MyEclpise整合JAVA与FLEX进行通讯(通过将Flex工程加到Java web工程中)

    本话题主要关注如何通过MyEclipse这个流行的Java集成开发环境(IDE)整合JAVA与FLEX,使得它们能够有效地进行通讯。这一过程涉及到将Flex工程添加到Java Web工程中,以便在后端服务器和前端富互联网应用程序(RIA)...

    java开源包6

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包9

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包4

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包101

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    基于nima的即时通讯例子

    在Flash中,可能使用ActionScript 3与服务器进行XMLSocket通信,实现即时通讯功能。对于那些仍需支持Flash的场景,这部分代码具有参考价值。 详细文档很可能是项目实施的指南,包括了系统架构、技术选型、关键功能...

    java开源包5

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    flex与java通讯,URL,HTTPService,Socket

    Flex与Java之间的通信是开发跨平台应用程序时的关键技术,它允许客户端(通常为Flex应用程序)与服务器端(通常是Java应用程序)进行数据交换。本篇将深入探讨几种主要的通信方式:URLLoader,HTTPService和Socket。...

    java开源包8

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

Global site tag (gtag.js) - Google Analytics