Flash基础入门:FLASH通讯小结
小标 2018-07-09 来源 : 阅读 974 评论 0

摘要:本文主要向大家介绍了Flash基础入门:FLASH通讯小结,通过具体的内容向大家展现,希望对大家学习Flash基础入门有所帮助。

本文主要向大家介绍了Flash基础入门:FLASH通讯小结,通过具体的内容向大家展现,希望对大家学习Flash基础入门有所帮助。

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("//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("//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); 

 

服务端:

<?php 
         $name = $_REQUEST['name']; 
         echo "flashData=$name"; //这里注意echo 的数据必须是名称=值的形式。 

?> 

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= "//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[i] + "\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:可以到//www.5etdemi.com/uploads/amfphp-1.9.beta.20070126.zip下载,将其解压到你的php网站根目录下。

2.       安装AMF扩展:到//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 = "//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输入以下代码:

<?php 
class ConnectTest 

  function test($name) 
  { 
    return $name; 
  } 

?> 

 

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")); 
  } 

(示例服务端代码来自 
//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; 
    } 

 

本文由职坐标整理并发布,了解更多内容,请关注职坐标常用软件Flash频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程