falsh与服务器交互方式

一.LoadVars篇
  我之所以把XML也放在这里说,是因为XML和LoadVars数据交互的方式大体相同,就是传递时的数据内容有点不一样而已
! 
  我现在列出在开发过程最常用的
"用户密码验证"实例,加以说明!
//=======================================================; 
//
 Flash代码; 
//
=======================================================;
//
定义LoadVars对象;
var data_lv = new LoadVars(); 
//提交的用户名变量和参数值;
data_lv.username = "kinglong"
//提交的密码变量和参数值;
data_lv.password = "king"
//提交后返回结果;
data_lv.onLoad = 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(name){
    
//调用Remoting的getString方法;
    myService.getString(name);
  }
 
  
//定义返回结果的函数;
  function getString_Result(result){
    
//result就为返回的结果;
    trace(result);
  }

  
//定义返回状态的函数,此为可选的;
  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(result){
     trace(
"result:"+result);
}

//如果调用错误返回信息(这个是可选的);
callObject.onFault = 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(success) {

trace(
"socket.onConnect:"+success);

if (!success) {

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

}


}
;

//关闭事件;

socket.onClose 
= function() {

trace(
"服务端已关闭!");

logoutChat();

}
;

//数据通信事件;

socket.onData 
= function(src) {

//trace("socket.onData:"+src);

doCommand(getCmdArrayByMsg(trim(src)));

}
;

//用户登录;

function loginChat():Void {

//连接Socket服务端;

socket.connect(“localhost”, “
8888”);

sendSocket(
"INFO"+paramObj.CommandDelimiters+msg);

}


//用户注销;

function logoutChat(b:Boolean):Void {

sendSocket(
"QUIT");

}


//显示聊天信息;

function showChat(msg:String):Void {

trace(“聊天信息:”
+msg);

}


//发送聊天信息;

function sendChat(msg:String):Void{

sendSocket(
"MSG"+paramObj.CommandDelimiters+msg+paramObj.CommandDelimiters+msg);

}


//向服务端发送信息;

function sendSocket(msg:String):Void {

socket.send(msg
+" ");

}




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

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(arr:Array):Void {

switch (arr[0]) {

case "MSG" :

showChat(arr[
1]);

break;

case "TAKEN" :

trace(
"你的登录名已经有了,请重新换一个登录名!");

break;

case "PEOPLE" :

doPeople(arr[
1]);

break;

}


}


//显示在线用户列表;

function doPeople(msg:String):Void {

var people_arr:Array = msg.split(paramObj.PeopleDelimiters);

trace(people_arr);

}





//上面与XMLSocket有关的主要代码,显示方面自己添加相关组件就行了!

//有一个注意点,在flash向服务端发送的命令的最后一定要加上“ ”,否则服务端无法收到消息(我的服务端是用Java开发的)


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

// 服务端代码(我用java开发的,其他版本自行研究);

// ChatServer.java

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

package com.klstudio.socket.chat;



import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Vector;



//import com.klstudio.util.Logger;



/**

* @author kinglong



* TODO 要更改此生成的类型注释的模板,请转至窗口-首选项- Java -代码样式-代码模板

*/


public class ChatServer 
{

//private Logger logger;

private static Vector clients 
= new Vector();

private static ServerSocket server 
= null;

private static Socket socket 
= null;

public static String CommandDelimiters 
= "-@@##@@-";

public static String PeopleDelimiters 
= "-@#@-";



public ChatServer() 
{

}




public static 
void notifyRoom() {

StringBuffer people 
= new StringBuffer("PEOPLE"+CommandDelimiters+"所有的人");

for (int i = 0; i < clients.size(); i++{

Client client 
= (Client) clients.elementAt(i);

people.append(PeopleDelimiters
+client.getClientName());

}


sendClients(people);

}


public staticboolean checkName(Client newClient)
{

for(int i=0;i<clients.size();i++){

Client client 
= (Client) clients.elementAt(i);

if(client != newClient && client.getClientName().equals(newClient.getClientName())){

return false;

}


}


return true;

}


public static 
void closeAll(){

while(clients.size()>0){

Client client 
= (Client) clients.firstElement();

try {

client.getClientSocket().close();

}
 catch (IOException e) {

// TODO 自动生成 catch 块

//Logger logger = new Logger(System.out);

//logger.log("错误-" + e.toString());

}
 finally {

clients.removeElement(client);

}


}


}


public static synchronized 
void disconnect(Client client) {

client.send(
new StringBuffer("QUIT"));

try {

client.getClientSocket().close();

}
 catch (IOException e) {

// TODO 自动生成 catch 块

//Logger logger = new Logger(System.out);

//logger.log("错误-" + e.toString());

}
 finally{

clients.removeElement(client);

}




}




public static synchronized 
void sendClients(StringBuffer sb) {

for(int i=0;i<clients.size();i++){

Client client 
= (Client) clients.elementAt(i);

client.send(sb);

}


}




public static synchronized 
void sendClients(StringBuffer sb,String ownerName,String toName) {

for(int i=0;i<clients.size();i++){

Client client 
= (Client) clients.elementAt(i);

if(toName.equals(client.getClientName()) || toName.equals("所有的人"|| ownerName.equals(client.getClientName())){

client.send(sb);

}


}


}




public static synchronized 
void sendClients(Client ownerClient) {

for(int i=0;i<clients.size();i++){

Client client 
= (Client) clients.elementAt(i);

if(client.getClientName().equals(ownerClient.getClientName())){

client.send(
new StringBuffer("MSG"+CommandDelimiters+"系统信息>欢迎你进入!"));

}
else{

client.send(
new StringBuffer("MSG"+CommandDelimiters+"系统信息>["+ownerClient.getClientName()+"]用户进入!"));

}


}


}


public static 
void main(String[] args) {

int port = 8888

if(args.length>0){

port 
= Integer.parseInt(args[0]);

}


//Logger logger = new Logger(System.out);

//logger.log("信息-ChatServer["+port+"]服务正在启动...");

try {

server 
= new ServerSocket(port);

}
 catch (IOException e) {

// TODO 自动生成 catch 块

//logger.log("错误-"+e.toString());

}


while(true){

if(clients.size()<5){

try {

socket 
= server.accept();

if(socket != null){

//logger.log("信息-"+socket.toString()+"连接");

}


}
 catch (IOException e) {

// TODO 自动生成 catch 块

//logger.log("错误-"+e.toString());

}


int i=0;

do{

Client client 
= new Client(socket);

if(client.getClientName() != null){

clients.addElement(client);

if(checkName(client)){

//logger.log("信息-"+"目前有["+clients.size()+"]个用户已连接");

sendClients(client);

client.start();

notifyRoom();

}
else{

client.send(
new StringBuffer("TAKEN"));

disconnect(client);

}


i
++;

}


break;

}
while(i<clients.size());



}
else{

try {

Thread.sleep(
200);

}
 catch (InterruptedException e) {

// TODO 自动生成 catch 块

//logger.log("错误-"+e.toString());

}


}


}


}


}

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

// Client.java

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

/*

* 创建日期2005-10-10

*

* TODO 要更改此生成的文件的模板,请转至

* 窗口-首选项- Java -代码样式-代码模板

*/


package com.klstudio.socket.chat;



import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.Socket;

//import com.klstudio.util.Logger;



/**

* @author kinglong



* TODO 要更改此生成的类型注释的模板,请转至窗口-首选项- Java -代码样式-代码模板

*/


public class Client extends Thread 
{

private Socket clientSocket;

private String clientName;

private String clientIp;

private BufferedReader br;

private PrintStream ps;

//private Logger logger;

private ChatServer server;



public Client(Socket socket) 
{

//this.logger = new Logger(System.out);

this.clientSocket = socket;

try {

this.br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));

this.ps = new PrintStream(socket.getOutputStream(),true,"utf-8");

String info 
= this.br.readLine();



if(info!=null){

String[] info_arr 
= info.split(ChatServer.CommandDelimiters);

if(info_arr.length>1){

this.clientName = info_arr[1];

}


this.clientIp = socket.getRemoteSocketAddress().toString();

}
else{

socket.close();

}


}
 catch (IOException e) {

// TODO 自动生成 catch 块

//this.logger.log("错误-" + e.toString());

}


}




/**

* @return 返回 ip。

*/


public String getClientIp() 
{

return clientIp;

}


/**

* @return 返回 name。

*/


public String getClientName() 
{

return clientName;

}




/**

* @return 返回 socket。

*/


public Socket getClientSocket() 
{

return clientSocket;

}


public 
void send(StringBuffer msg){

this.ps.println(msg.toString()+"
 
阅读更多
上一篇滤镜
下一篇ListView排序
想对作者说点什么? 我来说一句

漂亮的falsh 漂亮的falsh

2010年05月21日 666KB 下载

FALSH相册FALSH相册

2009年12月20日 746KB 下载

falsh

 

goodyatou goodyatou

2009-08-25 15:27:00

阅读数:141

falsh类的使用和falsh控件的操作

2009年01月16日 363KB 下载

falsh 动画

2013年11月26日 265KB 下载

生日快乐 FALSH

2010年12月24日 3.02MB 下载

falsh插件

2012年11月06日 3.59MB 下载

falsh源代码

2013年02月27日 3KB 下载

falsh player

2013年01月07日 976KB 下载

falsh builder

2015年05月20日 36.49MB 下载

没有更多推荐了,返回首页

关闭
关闭