请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 56707|回复: 44

flash与后台通信(ASP)的几种方法  关闭 [复制链接]

handmade 楼主

手工感情

荣誉管理

帖子
4143
体力
6029
威望
66
发表于 2003-8-5 00:17:00 |显示全部楼层
一、使用loadVariables
一个例子简单的描述了如何通过GET方法向服务器端的ASP发送请求:
  1. _root. pushAction = function(URL,) {
  2.         this.loadVariables(URL, "GET");
  3. }
  4. var ask = true;
  5. var pushURL = ”http://localhost/test/return.asp?ask=”+ ask;
  6. pushAction (pushURL);
  7. _root.onEnterFrame = fuction(){
  8.                trace(_root.output);
  9. }
复制代码

这里首先定义了一个名为pushAction的函数,在loadVariables函数中使用了GET参数。然后定义了一个名为ask的布尔型变量,用来向服务器传递变量。最后使用pushAction函数向服务器上的一个名为return的ASP页面发送GET请求。如果需要对这样的请求作出处理,在ASP中,URL行的分析结果存在于Request对象中,比如下例:
return.asp
  1. <%@ Language="JScript" %>
  2. <%
  3. //声明并定义接受请求的变量
  4. var str_getask= Request.QueryString("ask");
  5. //声明并定义返回信息变量
  6. var str_Msg = "Sorry! Your request tread awry.";
  7. //如果接受到的变量为true,则返回成功消息
  8. if (str_getask == "true"){
  9.   str_Msg = "OK! Your request succeed!";
  10. }
  11. Response.write("output=" + str_Msg);
  12. %>
复制代码

这样,一个名字为output,值为str_Msg的变量就发送回Flash Player中,可以在flash中以output的名字引用这个变量。当然我们必须注意服务器在处理这个过程中是需要时间的,因此最后那个onEnterFrame用来测试是否有变量返回.
4 Elements Blogs
黑色的风略过我的翅膀,我却无法落下来梳理你的羽毛

Blueidea Web Team
Team Member
西部数码顶级域名注册商39元抢注!
handmade 楼主

手工感情

荣誉管理

帖子
4143
体力
6029
威望
66
发表于 2003-8-5 00:18:00 |显示全部楼层
二、使用LoadVars
loadVariables提供了一种简单的方法让我们可以从服务器端的ASP或者PHP页面载入变量,除了使用GET方法,它还可以使用POST方法将客户端提交的数据传递给服务器。然而在处理大量客户端与服务器端交互的信息时,使用过多的loadVariables语句会让整个程序的维护性和可读性变得复杂。在Flash MX的Action中,新增加了一个LoadVars的对象,并将它和XML,XMLSocket对象一起归纳于Client/Server对象之下。LoadVars 对象是 loadVariables 动作的替代方法,它能够提供一种更好的结构向服务器发送和返回信息。一个典型的LoadVars对象使用的例子如下:
  1. //构造一个新的LoadVars对象
  2. myload = new LoadVars();
  3. //设定myload的动作,以便服务器验证
  4. myload.action = "post";
  5. //验证和服务器连接的函数
  6. myload.onLoad = function(success) {
  7. //如果和服务器成功连接则…
  8.         if (success) {
  9. //如果验证动作成功则…
  10.                 if (this.conn == "1") {
  11.          //将返回对象中的output变量赋值给场景中var为output的Dynamic Text框
  12.                         _root.output = this.output;
  13.                 }
  14.         } else {
  15.         //如果和服务器连接不成功则返回失败消息,需要检查路径是否正确
  16.                 _root.output = "Can't connect to Server";
  17.         }
  18. };
  19. //Dynamic Text的初始值为一个等待消息
  20. _root.output = "Waiting for response...";
  21. //将myload下的变量发送到服务器端,并将服务器返回的数据结果放在myload对象中
  22. myload.sendAndLoad("http://localhost/test/return.asp", myload, "post");
  23. //myload.sendAndLoad("http://localhost:8001/test/return.php",myload, "post");
复制代码

在场景中以一个var名为output的Dynamic Text框来接受来自服务器的消息。使用LoadVars,我们可以利用sendAndLoad方法将一个LoadVars的实体下的所有变量发送出去,并将服务器返回的数据结果存储到一个目标对象中,其中conn,output都是从服务器发送回来的,我们还利用了其onLoad事件函数来检验其是否将信息发送到了服务器页面,再利用从服务器传回来的数据(this.conn)来验证信息是否正确。服务器页面的代码如下:
ASP return.asp:
  1. <%@ Language="JScript" %>
  2. <%
  3. var str_Msg;
  4. var action;
  5. var conn;
  6. action = Request.Form("action");
  7. if (action == "post"){
  8.     str_Msg = "OK! return a Msg to you!";
  9.     conn = 1;
  10. }
  11. Response.write("conn=" + conn + "&output=" + str_Msg);
  12. %>
复制代码

PHP return.php:
  1. <?php
  2. $action = $HTTP_POST_VARS["action"];
  3. if ($action == "post") {
  4.     $str_Msg = "OK! return a Msg to you!";
  5.     $conn = 1;
  6. }
  7. echo "conn=" . $conn . "&output=" . $str_Msg;
  8. ?>
复制代码

如果本例执行成功,则会在Flash Player中出现成功画面,如图所示。如果失败,则返回失败消息(一般都是路径出错)


4 Elements Blogs
黑色的风略过我的翅膀,我却无法落下来梳理你的羽毛

Blueidea Web Team
Team Member
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

handmade 楼主

手工感情

荣誉管理

帖子
4143
体力
6029
威望
66
发表于 2003-8-5 00:20:00 |显示全部楼层
三、使用xml
Flash中的XML对象也有方法可以将XML数据向服务器发送。即send和sendAndLoad。send方法向某个 URL 传递 XML 对象,返回的信息都被发送到另外一个浏览器窗口;sendAndLoad 方法向某个 URL 发送一个 XML 对象。返回的信息都放在一个XML对象中。
在某种程度上, XML的send方法和sendAndLoad方法类似于loadVars对象的send方法和sendAndLoad方法。
以login系统为例。首先将Flash中需要传送的信息(用户名和密码)转换成一个 XML 对象,然后将数据作为 XML 文档发送到服务器端脚本。在服务器端我们还是从数据库中提取相应的数据,在服务器端脚本中对这两种信息验证。最后将验证成功的信息也以XML格式传送回Flash。图1显示了这种结构:


首先,看看数据库的结构,很简单,用Access做一个名为login.mdb(存储到同swf,asp文件同同一目录下)的数据库文件,然后新建一个名为admin的表,第一个字段名称是”id”,数据类型是自动编号;第二个字段名称是username,数据类型是文本。字段大小改为16;第三个字段名称为password,数据类型是文本,字段大小也改为16。表结构如图2所示:


接着,我们用Flash做一个登录界面。为了使得这个界面在其他地方也能用到,可以将所有的元件都集中到一个名为login的MC里面。这个MC的基本结构如下:
bg层:用来放置登录界面的背景。第二帧加关键帧;
Title层:用来放置标题MC,MC名字为title,因为只是一个标题,就不列出这个MC的结构了。第二帧加关键帧;
Inputbg层:input文本的背景。
InputTXT层:两个input文本,第一个的var为name,第二个的var为pass,类型为Password,我们要向服务器发送的变量就从这里获得;
Pushbt层:一个确定按钮(名字为pushbt),用来发送一个XML变量,其action如下:
Action for pushbt:
  1. on (release, keyPress "<Enter>") {
  2. //新建一个xml对象,节点明为LOGIN。在属性
  3.         //中存放用户名和密码
  4.         loginXML = new XML();
  5.         loginElement = loginXML.createElement("LOGIN");
  6.         loginElement.attributes.name = this.name;
  7.         loginElement.attributes.pass = this.pass;
  8.         loginXML.appendChild(loginElement);
  9.         //新建一个xml对象,用来存放从服务器返回的信息
  10.         loginReplyXML = new XML();
  11.         loginXML.sendAndLoad("http://localhost/chklogin.asp", loginReplyXML);
  12.         Msg = "正在等待服务器验证";
  13.         gotoAndStop(2);
  14. }
复制代码

这一层有两帧,第一帧的action为stop();第二帧上的action为
Action for frame2
  1. stop();
  2. function onLoginReply() {
  3.         //提取从服务器返回的数据并判断信息是否正确
  4.         var reply = this.firstChild;
  5.         if (reply.nodeName == "LOGINREPLY" && reply.attributes.login == "1") {
  6.                 Msg = reply.attributes.msg;
  7.         }
  8. }
  9. //返回服务器信息
  10. loginReplyXML.onLoad = onLoginReply;
复制代码

这个MC最后将如图3所示:

↑ login MC的第一帧

↑ login MC的第二帧

这样,如果你输入的name为admin,pass为admin的话,按下确定按钮,服务器的chklogin.asp页面就会接受到以下XML:
<LOGIN pass ="admin" name ="admin" />
在服务器响应并验证了信息之后,需要发送回来以下形式的XML:
<LOGINREPLY login=”1” Msg=someMessage />

最后看看asp怎么写。
chklogin.asp:
  1. <%@ Language="JScript"%>
  2. <%
  3. //创建一个新的DomDocument对象,存入客户端传送过来的XML请求
  4. var xmlReceive = new ActiveXObject("Msxml2.DomDocument");
  5. xmlReceive.loadXML(Request.Form());
  6. var reElement = xmlReceive.documentElement;
  7. //提取用户名和密码信息
  8. password = reElement.attributes[0].nodeValue;
  9. username = reElement.attributes[1].nodeValue;
  10. //创建并打开一个新连接。
  11. var conn = new ActiveXObject("ADODB.CONNECTION");
  12. strconn = "DBQ="+Server.MapPath("login.mdb")+";DefaultDir=;Driver={Microsoft Access Driver (*.mdb)};";
  13. conn.Open(strconn);
  14. //新建并打开一个查询
  15. var rs = new ActiveXObject("ADODB.RECORDSET");
  16. sql = "select * from admin where id=1";
  17. rs.open(sql,conn,1,1);
  18. //开始验证
  19. if (!(rs.BOF && rs.EOF)){
  20.     if (password == rs("password") && username == rs("username")){
  21.         Msg = "恭喜你," + username + "你已经成功登陆!";
  22.             }else if(username != rs("username")){
  23.             Msg = "对不起,您填写的用户名不正确,请返回重新填写";
  24.         }else if(password != rs("password")){
  25.         Msg = "对不起,您填写的密码不正确,请返回重新填写";      
  26.         }
  27. }else{
  28. Msg = "登陆没有成功,看上去服务器出了点问题。"
  29. }
  30. //创建一个新的DomDocument对象,向客户端发送
  31. var xmlRepley = new ActiveXObject("Msxml2.DomDocument");
  32. xmlRepley.loadXML("<LOGINREPLY login='1' msg='"+Msg+"' />");
  33. Response.Write(xmlRepley.xml);
  34. %>
复制代码

我们知道,Flash中xml.sendAndLoad方法是以HTTP的POST方法发送到服务器页面的,因此这个XML数据存在于Request对象中。在DOM中可以直接象在第5行中使用的方法那样以loadXML的方法加载。
虽然可以使用DOM的其他方法来创建xmlRepley 这个XML文档(例如createNode),但是那样对初学者来说是很难控制的。因此简单的以字串的形式加载到xmlRepley中更为直观。如果你有了一定的经验后,需要利用ADO从数据库中提取数据并封装为XML文档,那么就会发现使用createNode方法会有效率一些。
4 Elements Blogs
黑色的风略过我的翅膀,我却无法落下来梳理你的羽毛

Blueidea Web Team
Team Member

使用道具 举报

qhwa 

水蓝色青蛙

荣誉管理 手机认证 

帖子
4509
体力
19737
威望
78
居住地
浙江省 杭州市
发表于 2003-8-5 01:10:00 |显示全部楼层
在同等服务器条件下, 这三种的效率对比怎么样? 呵呵,我没有空间测试
blog: Flashlight (q.pnq.cc)

使用道具 举报

handmade 楼主

手工感情

荣誉管理

帖子
4143
体力
6029
威望
66
发表于 2003-8-5 01:51:00 |显示全部楼层
从理论上说,第三种应该是最慢的。但是从团队协作方面看,使用xml还是有莫大的好处的。这样,flash程序员就可以不用关注后台是如何计算,数据是以什么样的变量名传递进来的。只需要知道xml的结构就可以进行开发了。
4 Elements Blogs
黑色的风略过我的翅膀,我却无法落下来梳理你的羽毛

Blueidea Web Team
Team Member

使用道具 举报

jinni 

荣誉管理 手机认证 

帖子
10075
体力
13013
威望
166
发表于 2003-8-5 15:33:00 |显示全部楼层
难得看到这么完整的flash与后台交互的文章
其实像第二部分那样稍加改动就是一篇flash与ASP,PHP,CF交互的超完整的教程了
微博
莫把无知当武器

使用道具 举报

帖子
296
体力
429
威望
0
发表于 2003-8-5 21:03:00 |显示全部楼层
精辟!


rm -rf /

使用道具 举报

帖子
29
体力
97
威望
0
发表于 2003-8-6 13:12:00 |显示全部楼层

使用道具 举报

自在幻想

荣誉管理 手机认证 

帖子
601
体力
2005
威望
59
发表于 2003-8-6 15:49:00 |显示全部楼层
使用fscommand调用html中的form也算是一种方法,而且有时为了安全性考虑需要限制asp请求的referer的时候,必须要用这种方式才能达到,前三种都不行
英领科技 引领潮流

使用道具 举报

帖子
81
体力
297
威望
0
发表于 2003-8-6 18:05:00 |显示全部楼层
我使用第三种方法测试时如果返回的是中文,则显示的是乱码,英文正常.

使用道具 举报

帖子
531
体力
1853
威望
0
发表于 2003-8-7 08:26:00 |显示全部楼层
手工老大,ASP俺也习惯用JavaScript写的。
My Hello Snoopy
China Blogs
.NET and Flash develop

使用道具 举报

handmade 楼主

手工感情

荣誉管理

帖子
4143
体力
6029
威望
66
发表于 2003-8-8 07:20:00 |显示全部楼层
写这个没有考虑国际化,因此在第三例子中as中首行加一句
System.useCodePage = true;
4 Elements Blogs
黑色的风略过我的翅膀,我却无法落下来梳理你的羽毛

Blueidea Web Team
Team Member

使用道具 举报

netbug 
帖子
13
体力
42
威望
0
发表于 2003-8-8 12:09:00 |显示全部楼层
babybug在上个帖子中说
我使用第三种方法测试时如果返回的是中文,则显示的是乱码,英文正常.


要显示中文,需使用utf-8编码

使用道具 举报

Yeson 
帖子
28
体力
244
威望
0
居住地
广东省 深圳市
发表于 2003-8-8 18:05:00 |显示全部楼层
我个人用的较多,还是Flash和Xml的结合...
但不知那一种好一点.

使用道具 举报

帖子
10
体力
42
威望
0
发表于 2003-8-9 09:28:00 |显示全部楼层
有个原文件看看就好了

使用道具 举报

LeXRus 

没壳的小龟

荣誉管理 手机认证 

帖子
5379
体力
20999
威望
61
发表于 2003-8-9 16:13:00 |显示全部楼层
flash我没学过..不知道是不是还可以用xmlhttp呢?

使用道具 举报

qhwa 

水蓝色青蛙

荣誉管理 手机认证 

帖子
4509
体力
19737
威望
78
居住地
浙江省 杭州市
发表于 2003-8-9 16:19:00 |显示全部楼层
乌龟爬到这里干什么?
xmlhttp怎么用? 快讲讲,搬个凳子听...
blog: Flashlight (q.pnq.cc)

使用道具 举报

cxd 

涂图

钻石会员

帖子
1294
体力
7152
威望
0
居住地
海南省 海口市
发表于 2003-8-10 20:23:00 |显示全部楼层
那个好点呢
[Ctrl+Z映像设计工作室] 摄影、平面、网站、动画、画册、PPT制作、培训

使用道具 举报

handmade 楼主

手工感情

荣誉管理

帖子
4143
体力
6029
威望
66
发表于 2003-8-11 03:27:00 |显示全部楼层
LeXRus在上个帖子中说
flash我没学过..不知道是不是还可以用xmlhttp呢?

没有试过……如果要用到DOM的Serverxmlhttp对象恐怕要多加一层asp页面了。因为flash的XML对象中的send,load和DOM的Serverxmlhttp机制,功能不一样。
其实还可以用socket的,只是服务器端编写socket我始终没有怎么研究。
4 Elements Blogs
黑色的风略过我的翅膀,我却无法落下来梳理你的羽毛

Blueidea Web Team
Team Member

使用道具 举报

帖子
509
体力
2488
威望
20
居住地
云南省 昆明市
发表于 2003-8-12 09:46:00 |显示全部楼层
请教一个问题:loadVariables("test.asp", "", "POST")也可以与ASP通信,那么它的变量是怎么传递的呢?
比如说吧,当前祯的按钮事件:
on (release) {
   loadVariables("test.asp", "", "POST");
}
是否向ASP文件传递的变量就是当前祯中的所有变量的值,而不需要管具体发送哪几个?

使用道具 举报

帖子
509
体力
2488
威望
20
居住地
云南省 昆明市
发表于 2003-8-12 10:04:00 |显示全部楼层
这个通信真是问题多多啊:在FALSH中定义了一个文本框用来接受用户输入,ASP中接受变量值是request.form还是request.QueryString呢?
在FLASH查看文本框的动作出现Unknow Error ID #1086,不知道是什么原因?

使用道具 举报

handmade 楼主

手工感情

荣誉管理

帖子
4143
体力
6029
威望
66
发表于 2003-8-12 21:25:00 |显示全部楼层
第一个问题:是的。传递当前帧下所有的变量
第二个问题:如果是post方法,应该是在request.form之中。最好trim一下。
4 Elements Blogs
黑色的风略过我的翅膀,我却无法落下来梳理你的羽毛

Blueidea Web Team
Team Member

使用道具 举报

coln 
帖子
12
体力
121
威望
0
发表于 2003-8-13 10:59:00 |显示全部楼层
很好的教程,但是我发现在中文的返回信息乱码,这是什么回事呀?是asp返回给flash的那些提示信息乱码,不知大家有没有遇到这种情况?

使用道具 举报

handmade 楼主

手工感情

荣誉管理

帖子
4143
体力
6029
威望
66
发表于 2003-8-13 12:02:00 |显示全部楼层
仔细看一下回帖,已经给出答案了……
4 Elements Blogs
黑色的风略过我的翅膀,我却无法落下来梳理你的羽毛

Blueidea Web Team
Team Member

使用道具 举报

coln 
帖子
12
体力
121
威望
0
发表于 2003-8-13 13:34:00 |显示全部楼层
我用了另外一种方法,将flash的输出改成是flash 5就可以了!这样还可以向下兼容呢!
不过你的方法在另一些方面可能好一些!

使用道具 举报

帖子
351
体力
2407
威望
0
发表于 2003-8-14 16:18:00 |显示全部楼层
不错,就是不能提交到远程asp
(我只试了第二种办法)

使用道具 举报

帖子
2
体力
12
威望
0
发表于 2003-8-15 16:11:00 |显示全部楼层
我用PHP返回给flash中文信息,可显示的是乱码,
如何让PHP返回unicode(或utf-8)编码的文本?
若是一个记事本文件,我们可以通过“另存为”来改变其编码,可是PHP怎么做到?

使用道具 举报

帖子
237
体力
1544
威望
0
发表于 2003-10-9 12:37:00 |显示全部楼层
如何作出flash+asp的循环列表~~?
UED

使用道具 举报

洒向人间的快乐

高级会员

帖子
130
体力
884
威望
0
发表于 2003-10-25 11:05:00 |显示全部楼层
不好意思,请问一下老大,前两种做出来了,第三种的第二帧的那个等待验证的。txt,是怎么出来的啊?我怎么做不出来啊!?
Msg = "正在等待服务器验证";
就是这句,他是用那个txt提取出来的啊?上面不就说明一个name一个pass吗?
谢谢!
该思考的时候就不要珍惜脑细胞

使用道具 举报

帖子
49
体力
102
威望
0
发表于 2003-10-25 16:45:00 |显示全部楼层
好东西!好教程!我珍藏!!

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-13 10:16 , Processed in 0.218376 second(s), 8 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部