flash交互方式

一.LoadVars篇
我之所以把XML也放在这里说,是因为XML和LoadVars数据交互的方式大体相同,就是传递时的数据内容有点不一样而已! 
我现在列出在开发过程最常用的 " 用户密码验证 " 实例,加以说明!

//======================================================= ; 

//  Flash代码; 

//======================================================= ;

// 定义LoadVars对象;
var data_lv 

  new  LoadVars(); 

// 提交的用户名变量和参数值;
data_lv.username 

  " kinglong " ; 

// 提交的密码变量和参数值;
data_lv.password 

  " king " ; 

// 提交后返回结果;
data_lv.onLoad 

  Function (() function (success){ 
// success,数据提交是否成功; 
// 这个只是表示数据传输是否成功,并不是用户验证的结果; 
if (success){ 
trace( " 数据提交成功! " ); 
// result也是用户验证返回的实际结果! 
if (this.result

" true " ){ 
trace( " yes " ); 
} else { 
trace( " no " );
}
} else {
trace( " 数据提交失败! " );
}
}

// 数据提交方法调用;

// 第一参数就是提交的页面地址; 

// 第二参数就是返回结果对象(只要是LoadVars对象就可以了); 

// 第三参数就是提交方式(这个和html中form表单类似,分为 " post " 和 " get " 两种方式) 
data_lv.sendAndLoad( " http://www.klstudio.com/save.asp " ,data_lv, " post " ); 

//======================================================= ; 

// 后台服务端页面处理及返回内容; 

//======================================================= ;

// 接收flash提交过来的变量和接收一个页面提交过来的变量一致的;
Request( " username " ) 就是flash端username变量传过来的值 " kinglong " ;
Request( " password " ) 就是flash端password变量传过来的值 " kinglong " ;
....数据库验证..... 

// 如果用户验证通过

& result

true

// 如果用户验证失败

& result

false  

// 整个页面返回内容就是上面那一行内容, & result对应用着flash端的result变量; 

// 如果是多个返回值的话,就是 & result

xxx & result1

xxx这种形式就可以了; 
如有不清楚的地方,你可查看flash帮助文档! 
至于XML的方式,请对应地查看flash帮助文档就可以了!
LoadVars方式的优点:
1 .flash代码实现起来简单,方便. 
2 .服务端接收页面和接收一个表单过来的数据一样处理,不需要专门的技术,所有服务端程序都可以实现! 
LoadVars方式的缺点: 

1 .传递的变量不宜过多.
2 .变量传递的值不宜过长.
3 .变量传递值只能使用 " 字符串 " 这一种数据类型,数据类型单一. 
4 .数据返回值当中不能有 " & " 字符,因此比较复杂的返回值都需进行URL编码处理.
二、Flash Remoting
Flash Remoting这种数据接口是四个之中效率最高的!
其优点:
1 .支持数据类型比较多(Converting from application server data types  to  ActionScript);
2 .传递数据量比较大;
3 .运行效率是现有几个当中最高的;
4 .对各种后台的支持也比较好;
5 .其还有调试模块(NetConnection Debugger)

其缺点:
1 .需要flash端装Flash Remoting MX Components(这个是免费提供的);
2 .需要后台服务端装相应版本的Flash Remoting模块才可以使用,MM提供的模块有j2ee和.net两个版本是要收费的,好在网上还有两个开源的(OpenAMF,AMFPHP);
3 .好像Remoting对虚拟主机的支持不太好(可以去google搜索一下,有没有解决方法).

================================================================   Flash端代码说明:(我这里用as1.0版本为例,其他版本到MM站查找)

================================================================    // 加载Remoting Component代码,这个是必须的;
#include  " NetServices.as "    // 加载Remoting 调试模块代码,这个是可选择的,用NetConnection Debugger查看调试信息;
#include  " NetDebug.as "    if  (inited 

 null){  
inited 

  true ; 
// 设置默认网关;
NetServices.setDefaultGatewayUrl( " http://localhost:8500/flashservices/gateway " ); 
// 建立网关连接;
gateway_conn 

 NetServices.createGatewayConnection(); 
// 获取一个服务;
myService 

 gateway_conn.getService( " myservice " , this); 
}

// 定义调用方法的函数;
Function getString() function  getString(name){
// 调用Remoting的getString方法;
myService.getString(name);

// 定义返回结果的函数;
Function getString_Result() function  getString_Result(result){
// result就为返回的结果;
trace(result);
}
// 定义返回状态的函数,此为可选的;
Function getString_Status() function  getString_Status( error ){ 
trace( " getString_Status " );
trace( error .code);
trace( error .description); 
trace( error .details); 
}

// 调用函数;
getString( " kinglong " ); 

================================================================   服务端方法定义(我这里以Coldfusion Component为例,其他版本请参考相应的资料)

================================================================

< !

文件名为myservice.cfc --->

< cfcomponent displayname

" 我的服务 "

 
< !

定义了getString方法,需将access设为remote,否则Flash remoting无法调用此方法 --->   < cffunction name

" getString "  access

" remote "  returntype

" string "

 
< cfargument name

" name "  type

" string "  required

" true "

 
< cfset myResult 

 arguments.name  &   " ,欢迎你! "

 
< cfreturn myResult

 
</ cffunction

 

</ cfcomponent

 
三、WebService
个人觉得WebService的数据访问速度,仅次于Remoting,但WebService是一种通用型的接口,一般服务端技术都支持的!
WebService的优点:
1 .WebService的接口支持比较广泛(Java,ASP.Net,PHP,Coldfusion

我下面举例用);
2 .WebService是一个通用型的接口,所以服务端写的接口,不局限于Flash使用,其他程序也可以调用, " 一举两得 " !
3 .WebService和Remoting一样,支持多种数据类型!
4 .今天还发现FMS除了支持Remoting接口,也支持WebService接口了:)
WebService的缺点:
Flash客户端到是没有什么问题,Flash的开发工具就自带了(WebServiceConnector 组件),但服务端虽说大多都支持这个接口技术,但除了Coldfusion生成WebService方便外,其他的实现都挺复杂的!

//======================================= ;

//  Flash客户端代码;

//  对于代码不是很熟悉的可以直接使用WebServiceConnector 组件,进行设置设置就可以了。

//  我这里主要是写用代码来调用WebService方法。

//  当然这个前提是你要把WebServiceConnector 组件先放到库里,否则类就无法引用了。

//======================================= ;

stop ();

// 引用WebService类;
import mx.services.WebService;

// 定义WebService的路径;
var ws_url: String  

 http: // localhost: 8500 / klstudio / myservice.cfc?wsdl;

// 定义WebService对象;
var ws:WebService 

  new  WebService(ws_url);

// 调用WebService方法;
var callObject 

 ws.getString( " kinglong " );

// 设置返回结果对象;
callObject.onResult 

  Function (() function (result){
trace( " result: " + result);
}

// 如果调用错误返回信息(这个是可选的);
callObject.onFault 

  Function (() function (fault){
trace( " fault: " + fault.faultstring);
}
注意:如果返回结果是一个数据集的话,那每个字段名都要用大写,不管你的服务端是否大写!

================================================================   服务端方法定义(我这里仍以Coldfusion Component为例,其他版本请参考上面提供的连接)

================================================================

< !

文件名为myservice.cfc --->

< cfcomponent displayname

" 我的服务 "

 
< !

定义了getString方法,需将access设为remote,否则WebService无法调用此方法 --->    < cffunction name

" getString "  access

" remote "  returntype

" string "

 
< cfargument name

" name "  type

" string "  required

" true "

 
< cfset myResult 

 arguments.name  &   " ,欢迎你! "

 
< cfreturn myResult

 
</ cffunction

 

</ cfcomponent

 
调用的时候,只要在cfc路径后面加 " ?wsdl " 就可以了,方便吧! :)
四、XMLSocket
这是LoadVars(XML)、Flash Remoting、Webservice、XMLSocket四种方法整理的最后一篇,也让大家久等了(没想到前几篇的文章在网上挺受欢迎的,其中还有一人给我发邮件,相看我这个最后一篇,哈哈,还是挺欣慰的。对转载我要声明一下,首先这几篇文章欢迎转载的,但要说明文章的作者,以及文章的原址吧,我发现有些网站转载,连作者都不写了或者写的就不对。这一点会影响我以后写文章的心情的,特此说明一下!)。现在接下来转入正题了!
XMLSocket主要用于与服务端进行即时通信,目前的应用领域主要是Flash文本聊天和Flash在线游戏等方面。
XMLSocket的优点:
1 、能和服务端即时通信;
2 、Flash Player  5 .0以上的版本内置类,不需另装组件或插件;
3 、因为XMLSocket就是相当于一个Socket客户端,所以一般的中间件都支持的(如java,.Net等)
XMLSocket的缺点:
1 、XMLSocket只能传字符串或xml格式的文本,数据类型单一;
2 、XMLSocket服务端自行开发的话,需要对Socket技术比较了解才行,好在网上有现成的服务端软件(商业的XMLSocket Server 有Unity、Fortress;开源的XMLSocket Server 有Oregano Multiuser Server);
3 、还有就是XMLSocket的80端口与flash安全策略问题。(网上有一个解决方法,不知是否可行,请自行验证)

//======================================= ;

//  Flash客户端(以Flash文本聊天为例);

//======================================= ;
var paramObj: Object  

  new   Object ();

// 命令分隔符;
paramObj.CommandDelimiters 

  " -@@##@@- " ;

// 用户列表分隔符;
paramObj.PeopleDelimiters 

  " -@#@- " ;

// 建立XMLSocket对象;
var socket:XMLSocket 

  new  XMLSocket();

// 连接状态事件;
socket.onConnect 

  Function (() function (success) {
trace( " socket.onConnect: " + success);

if  (!success) {
trace( " 服务器连接失败,请检查网络状态! " );
}
};

// 关闭事件;
socket.onClose 

  Function (() function () {
trace( " 服务端已关闭! " );
logoutChat();
};

// 数据通信事件;
socket.onData 

  Function (() function (src) {

// trace( " socket.onData: " + src);
doCommand(getCmdArrayByMsg( trim (src)));
};

// 用户登录;

Function loginChat() function  loginChat():Void {

// 连接Socket服务端;
socket.connect(“localhost”, “ 8888 ”);
sendSocket( " INFO " + paramObj.CommandDelimiters + msg);
}

// 用户注销;

Function logoutChat() function  logoutChat(b: Boolean ):Void {
sendSocket( " QUIT " );
}

// 显示聊天信息;

Function showChat() function  showChat(msg: String ):Void {
trace(“聊天信息:” + msg);
}

// 发送聊天信息;

Function sendChat() function  sendChat(msg: String ):Void{
sendSocket( " MSG " + paramObj.CommandDelimiters + msg + paramObj.CommandDelimiters + msg);
}

// 向服务端发送信息;

Function sendSocket() function  sendSocket(msg: String ):Void {
socket.send(msg + "

" );
}

// 处理服务端返回信息;

Function getCmdArrayByMsg() function  getCmdArrayByMsg(msg: String ):Array { if  (msg.charCodeAt( 0 ) 

  13   &&  msg.charCodeAt( 1 ) 

  10 ) {msg 

 msg.substr( 2 );} return  msg.split(paramObj.CommandDelimiters);} Function doCommand()  

代码交流 2021