音频应用   音频插件联盟,正版插件,欢迎大家选择!

 找回密码
 快速注册

QQ登录

只需一步,快速开始

阅读: 22693|回复: 1

[资讯] Flash的几种通信方式《转载》

[复制链接]

205

积分

3

听众

125

音贝

音频应用

Rank: 1

积分
205
发表于 2015-12-23 | |阅读模式
音频应用公众号资讯免费发布推广
1. SWF间的通讯——LocalConnection

在同一台机器上运行的两个(或多个)swf,可以使用LocalConnection进行通讯。可以有多个发送端,但接收端只能有一个。

在发送端定义LocalConection,连接接收端通道,使用其send方法发送信息。在接收端定义LocalConnection,打开连接通道,定义信息接收函数。两个flash之间就可以进行通讯了。

示例浅析:

接收端:

//创建接收端本地连接 private var _recive :LocalConnection = new LocalConnection(); //定义连接通道 private var _channel:String = "_connection" //打开通道 _recive.connect(_channel); //设置接收者为本身 _recive.client = this; //定义信息接收方法(由发送端调用) public function reciveTest(_name:String):void {              var _text:TextField = new TextField();              _text.text = "接收端,收到信息:" + "\n" + "Hello," + _name;              addChild(_text);              _text.x = 10, _text.y = 10; }

发送端:

//创建发送端本地连接 private var _send :LocalConnection = new LocalConnection(); //定义连接通道(名称要与接收端的一致) private var _channel:String = "_connection"; //建立连接 _send.connect(_channel); //发送信息,信息接收函数为接收端的reciveTest,传递参数"tata" _send.send(_channel, "reciveTest", "tata"); //运行时先打开接收端swf,再打开发送端swf。



2. Flash

本地共享对象SharedObject

ActionScript

中, SharedObject

类实现了客户端机器数据的持久性存储。本地local shared objects (LSOs)

,很类似于浏览器中 cookies

,可用于存储用户名,游戏数据等。

LSOs

通过SharedObject.getLocal

创建或打开。

用法:

var so:SharedObject = SharedObject.getLocal(name:string, localPath:string = null, secure:Boolearn = false);

如果共享对象已存在,将返回SharedObject

实例,否则根据名字创建新的。可以通过so.data.someData

的形式向so

中写入或读取数据。若要删除共享对象的值,要使用delete

方法,如delete so.data.someData

,若要删除整个共享对象,则调用其clear()

方法,如so.clear()



若要使同一个域的swf

访问同个本地共享对象,可以通过设置getLocal

的第二个参数实现。该参数为绝对或相对路径字符串,指定LSO

的存储位置。

示例浅析:

以不同swf

访问同个本地共享对象为例

//写入端: private var writeSO:SharedObject; //创建本地共享对象mySO writeSO = SharedObject.getLocal("mySO", "/"); //向共享对象写入数据 writeSO.data.nameInfo = "Hello,tata"; //读取端: private var readSO:SharedObject; //打开本地共享对象mySO readSO = SharedObject.getLocal("mySo", "/"); //从共享对象中读取数据 trace(readSO.data.nameInfo);

3. Flash

与JS

交互

       ExternalInterface

类允许 Flash

播放器以异步的方式与宿主程序进行通信,宿主程序一般指的是Web

浏览器。

       ExternalInterface

支持以下浏览器:

Internet Explorer 5.0+ (Windows)

Netscape 8.0+ (Windows and Mac OS X)

Mozilla 1.7.5+ (Windows and Mac OS X)

Firefox 1.0+ (Windows and Mac OS X)

Safari 1.3+ (Mac OS X)

ActionScript

调用JavaScript

函数,可使用ExternalInterface.call()

。该方法采用异步调用JS

函数机制。用法:ExternalInterface.call(JS

方法名:string

[,参数1

:*,

参数2

:*

……])

。如果JS

函数有返回值,可用变量存储:如var str:String = ExternalInterface.call(“jsFunction”);

可以用ExternalInterface.available

查看浏览器是否支持,若不支持,可使用navigateToURL()

方法。

用法:

var request:URLRequest = new URLRequest(“javascript:JS

函数(

传递参数)”);

navigateToURL(request);

但使用这个方法没有返回值。

两种方法都在flash.net

包下。

JavaScript

调用ActionScript

函数:使用ExternalInterface.addCallback()

注册AS

函数,然后在JS

端进行调用。用法:ExternalInterface.addCallback(

被调用函数对JS

的别名:strin

,被调用函数:function)

。如:ExternalInterface.addCallback(“helloWordAS”,helloWord);



示例浅析:

AS端: if (ExternalInterface.available) {   //注册js回调方法clientFunction,"jsAlias"是clientFunction在js中的别名   ExternalInterface.addCallback("jsAlias", clientFunction);            if (ExternalInterface.call("isReady"))   {     _txt.appendText ("可以发送数据了!")     sayHello();   }else {     _txt.appendText ("等待发送数据...\n");     setTimeout(sayHello, 2000)      } } private function sayHello():void {   if (ExternalInterface.available)   {     //使用ExternalInterface调用js方法jsFunction,传递参数"hello,tata"     var str:String = ExternalInterface.call("jsFuntion", "hello,tata");     _txt.appendText(str + "\n");   } }

//js回调方法clientFunction

public function clientFunction(str:String):void

{

       _txt.appendText(str+"\n");

}

JS

端:

var jsReady = false;      function init() {   jsReady = true; } function isRead() {   return jsReady; }      function jsFuntion(msg) {   alert("来自AS的消息:"+msg);   this.sendToAs();   return "这是调用jsFunction返回的"; }      function thisMovie(movieName) {   if (navigator.appName.indexOf("Microsoft") != -1) {        return window[movieName];   } else {     return document[movieName];   } }      function sendToAs() {   //调用AS方法   thisMovie("tata").jsAlias("此信息来自JS!"); }



先编译出swf

,再打开index.html

才能看到结果,因为flashPlayer

不支持ExternalInterface

,要有浏览器包装。



4.

使用HttpService

连接服务器

      

如果想发送数据给服务端脚本,可以创建一个包含数据的URLRequest

实例,并用flash.net.sendToURL()

或flash.net.navigateToURL()

方法发送出去。

用法:



var request:URLRequest = new URLRequst(服务端脚本路径:string); var vars:URLVariables = new URLVariables(); vars.someData = “tata”; vars.someNumber = 10; request.data = vars; request.method = URLRequestMethod.POST或URLRequestMethod.GET; sendToURL(request);或navigateToURL(request[,”_blank/_self/_parent”]); 示例: //设置传递参数 var myVars:URLVariables = new URLVariables(); myVars.name = "tata";         //创建URLRequest对象 var request:URLRequest = new URLRequest("http://localhost/HttpServerConnect/test.php"); //设置传递模式 request.method = URLRequestMethod.POST; //设置参数 request.data = myVars; navigateToURL(request);

默认情况下,数据是通过HTTP POST

方式传输的,URLRequest

的method

属性指定数据的传输方式,URLRequestMethod.GET

指HTTP GET

,而URLRequestMethod.POST

指HTTP POST

。URLRequest

的data

属性设置要发送的数据,如果是URLVariables

实例,则发送名称/

值对到服务器,也可以是flash.util.ByteArray

,通过HTTP POST

方式传递二进制数据到服务器,或者是String

类型的数据作为XML-RPC

请求发送到服务器。

当需要处理服务器返回的结果时,应该使用URLLoader.load()

方法。通过侦听Event.COMPLETE

事件,在事件处理函数中处理服务端返回的结果。

用法:



var loader:URLLoader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.VARIABLES; loader.addEventListerner(Event.COMPLETE, loadedHd); loader.load(request); 示例: var myVars:URLVariables = new URLVariables(); myVars.name = "tata";         var request:URLRequest = new URLRequest("http://localhost/HttpServerConnect/test.php"); request.method = URLRequestMethod.POST; request.data = myVars;         //创建URLLoader对象 var loader:URLLoader = new URLLoader(request); //设置接收数据方式 loader.dataFormat = URLLoaderDataFormat.VARIABLES; loader.addEventListener(Event.COMPLETE, loadedHd); loader.load(request); private function loadedHd(e:Event):void {   trace("Hello,"+e.target.data.flashData); }



服务端:

5. 使用WebService连接服务器

       通过web services,可以使用其他网站提供的服务,完善自己客户端的功能:如加入天气预报,提供在线翻译,股市信息等。

       web services采用异步通讯。在调用web services对外提供的接口之前,要先加载其wsdl。

Flash播放器没有内建的web services支持,可以通过导入mx.rpc包引入调用web services方法。

示例浅析:

以调用天气预报接口获取天气预报为例。例子使用的是www.webxml.com.cn提供的天气预报web

服务。

//创建webServer对象 private var webSer:WebService; webSer = new WebService(); //webServer路径 webSer.wsdl= "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl"; //调用webServer的方法前要加载其wsdl webSer.loadWSDL();         //添加侦听器 webSer.addEventListener(LoadEvent.LOAD, wsdlLoaded); webSer.addEventListener(ResultEvent.RESULT, resultHandler); webSer.addEventListener(FaultEvent.FAULT, faultHandler); wdsl加载完毕后,才能调用webService的方法。在resultHandler事件中处理返回结果,在faultHandler事件中进行错误处理。 //调用webServer提供的外部方法getWeather webSer.getWeather({theUserID:"",theCityCode:”上海”}); //输出返回结果 private function resultHandler(e:ResultEvent):void { for each(var s:* in e.result) {   for each(var s2:* in s)   {   trace(s2[1]); //输出查询的城市 trace(s2[3]); //输出最后更新时间     var arr:Array = (s2[4] as String).split(";");     // 输出具体天气情况     for (var i:uint = 0; i < arr.length; i++)     {       trace(arr + "\n")     }     break;   } } }



6.

使用Flash Remote

连接服务器

Flash Remoting

通过 HTTP

通讯,采用二进制数据协议,称之为 Active Messaging Format (AMF)

。可以传输更多的数据,效率比起web serverices

更高,速度更快。Flash Player.

支持 Flash Remoting



Amfphp是一个PHPRPC工具箱。可用于PHP与Flash和Flex之间利用Remoting进行交互。

环境配置:

下载安装php安装包。

amfphp

安装配置:

1.      

下载安装Amfphp

:可以到http://www.5etdemi.coms/amfphp-1.9.beta.20070126.zip

下载,将其解压到你的php

网站根目录下。

2.      

安装AMF

扩展:到http://www.teslacore.it/projects/amfext/amfext-0.8.7a-bin.zip

下载,将php_amf.dll

解压缩到php

根路径下的\ext

中;打开php.ini

,加上下面这一行:extension = php_amf.dll

。再重启php

服务器。(如果你安装的php

安装包已有,可以省略这一步)。



Flash

使用NetConnection

类连接amfphp

,使用call

方法调用php

类函数。

用法:

客户端: //定义一个nc用于连接AMFPHP private var nc:NetConnection; //定义一个responder用于处理客户端调用服务端方法的结果 private var responder:Responder; //连接路径 private var gateway:String = "http://localhost/amfphp/gateway.php"; nc = new NetConnection(); responder = new Responder(resultHandler, faultHandler); resultHandler和faultHandler分别是结果处理函数和错误处理函数。 //创建连接 nc.connect(gateway); //调用服务器方法test,RemoteConnect为ConnectTest.php所在的文件夹,传递参数"tata" nc.call("RemoteConnect.ConnectTest.test", responder,"tata"); 如果不想要responder,可以指定为null; //结果处理 private function resultHandler(_name:String):void {   trace("调用服务器方法返回结果:");   trace("Hello," + _name); }



服务端:

在amfphp

下的service

目录下新建一文件夹,命名为RemoteConnect

,在此文件夹下新建一文档,命名为ConnectTest.php

。这里注意一点,提供给Flash

调用的类类名要与文件名相同。在ConnectTest.php

输入以下代码:



7.

使用Socket

连接服务器

Socket

套接字连接允许 Flash

播放器通过指定的端口与服务器通信, socket

连接与其他通信技术最大的不同是 socket

连接在数据传输完成后不会自动关闭。当 socket

连接创建后,连接会一直保持,直到客户端( Flash

播放器)和服务端主动关闭。Socket

连接被普遍用于创建多用户应用程序。Socket

通信方式是异步的,也就是说你不能直接从 socket

连接中读取数据,而是通过事件处理函数进行读取处理。——摘自ActionScript3.0 CookBook



使用Socket.connect()

方法建立连接。因为是异步通信,connect()

方法不会等待结果而是继续执行下面的语句,因此在连接之前要注册侦听器获取连接结果。

用法: var _socket:Socket = new Socket(); _socket.addEventListerner(Event.COMNECT,connectHd); _socket.connect(连接服务器地址:string,端口号:数字); socket连接的端口号必须大于1024,如果小于则需服务器提供策略文件允许。 示例: //创建socket对象 private var _socket:Socket _socket = new Socket(); _socket.addEventListener(Event.CONNECT, onConnected); _socket.addEventListener(ProgressEvent.SOCKET_DATA, onDataHd); _socket.connect("localhost",1337); private function onConnected(e:Event):void {   //向缓冲区写入数据   var message:ByteArray = new ByteArray();   message.writeMultiByte("tata", "utf-8");   _socket.writeBytes(message);   //发送数据   _socket.flush(); }      private function onDataHd(e:ProgressEvent):void {   //接收读取数据   while (_socket.bytesAvailable)   {     trace(_socket.readMultiByte(_socket.bytesAvailable , "utf-8"));   } } (示例服务端代码来自 http://www.111cn.cn/phper/30/7cadb3c9195ac7d8ac9104da61a25c6e.htm



8. Flash

与FMS

交互

Flash Media Server

,简称FMS

,也是一款视频、音频应用服务器。利用FMS

,可以很轻松的完成视频、音频的录制、点播。也可以利用其作为聊天室的服务器……

这里主要讲述flash

与fms

之间的交互,不涉及音、视频应用。



环境配置:

下载安装Flash Media Server3.5



安装路径不能包含中文。在安装时注意记住自己设置的的用户名和密码。安装完后打开fms

目录下的tool

文件夹,双击start.bat

启动服务器,然后打开Administrator.swf

,输入用户名和密码进入。服务端的trace

就是在该swf

中看的。如果改动了服务端文件,要点击右上角reload

按钮重新加载该服务。fms

下有个applications

文件夹,是用来放置服务端文件的,包括你以后录制的视频、音频,都可以在这个文件夹下找到。applications

的路径也可以另外设置。



Flash

客户端通过NetConnection

类连接FMS

,可以侦听NetStatusEvent

的NET_STATUS

事件来检测连接状态。用call

方法调用服务端方法,服务端返回值通过在调用call

方法时指定其responder

,在其resultFunction

(结果处理函数)中处理。

用法:

var nc:NetConnection = new NetConnection();

nc.call(

服务端方法名:string

[,结果/

错误处理:responder

,传递参数1

:*

,传递参数2

:*

,…]);



服务端文件以*.asc

的形式存在,命名为main

或与fms

实例同名,后加.asc

。当一个客户端试图连接FMS

服务器时,会触发FMS

的application.onConnect

事件,FMS

将自动为客户端分配一个client



application.onConnect = function(client)

{

在这里设置接受或是拒绝客户端的连接,以及供客户端调用的方法。

}

FMS

可以通过两种方式向客户端发送信息,一是client.call

,另一是application.broadcastMsg

。第一种方法只向特定的客户端发送消息,第二种方法称为广播,它向所有连接该FMS

实例的客户端发送消息,效率更高。

用法:

client.call(

客户端方法名:string [

,结果处理:responder

,传递参数1

:*

,传递参数2

:*

,…]);

application.broadcastMsg(

客户端方法名:string

[,传递参数1

:*

,传递参数2

:*

,…]);

示例浅析: 客户端: //定义一个nc用于连接FMS private var nc:NetConnection; //定义一个responder用于处理客户端调用服务端方法的结果 private var responder:Responder; nc = new NetConnection(); responder = new Responder(resultHandler, faultHandler); 这里resultHandler和faultHandler分别是结果处理函数和错误处理函数。 //连接FMS服务器下的fmsConnect实例 nc.connect("rtmp://localhost/fmsConnect"); //侦听连接状态 nc.addEventListener(NetStatusEvent.NET_STATUS, checkConnect); private function checkConnect(e:NetStatusEvent):void {   //e.info.code为nc的连接状态   trace(e.info.code);   if (e.info.code == "NetConnection.Connect.Success")   {     //如果连接成功,调用FMS服务端的方法fmsFunction     nc.call("fmsFunction",responder, "tata");     //指定nc的客户端为本类,FMS才能调用此客户端方法     nc.client = this;   } } //结果处理(接收参数类型根据服务端返回值的类型而定) private function resultHandler(str:String):void {   trace("返回结果:"+str); }   //错误处理   private function faultHandler(obj:*):void   {     for each (var s:String in obj)     {       trace(s)     }   }   再写一个方法,供服务端调用,此方法必须是public的   public function clientFunction(_name:String):void   {     trace("FMS回调客户端方法:");     trace("Hello "+_name);   }



服务端:

在FMS

服务器的applications

文件夹下新建一个文件夹,命名为fmsConnect

,在fmsConnect

下新建一个文档,命名为main.asc



在main.asc中输入: application.onConnect = function(client) { //接受客户端的连接(要拒绝连接的话可以用application.rejectConnection(client) )     application.acceptConnection(client);         client.fmsFunction = function(_name)     {       trace("客户端调用服务器方法:");       trace("Hello," + _name);            //调用客户端函数的两种方法:       client.call("clientFunction", null, _name);       //或是application.broadcastMsg("clientFunction",_name);            //返回_name给客户端       return _name;     } }
欢迎厂家入驻,推文!免费!微信:yinpinyingyong

3625

积分

7

听众

1433

音贝

音频应用新手发布

Rank: 3

积分
3625
发表于 2016-12-4 |
分享了啊 ,谢谢楼主啊
欢迎厂家入驻,推文!免费!微信:yinpinyingyong
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

音频应用搜索

小黑屋|手机版|音频应用官网微博|音频招标|音频应用 (鄂ICP备16002437号)

Powered by Audio app

快速回复 返回顶部 返回列表