源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Flash与后台数据交换方法整理

  • 时间:2021-11-14 02:11 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Flash与后台数据交换方法整理
一.LoadVars篇   我之所以把XML也放在这里说,是因为XML和LoadVars数据交互的方式大体相同,就是传递时的数据内容有点不一样而已!    我现在列出在开发过程最常用的"用户密码验证"实例,加以说明!
[url=http://livedocs.macromedia.com/flashremoting/mx/Using_Flash_Remoting_MX/UseASData4.htm#1173664]Converting from application server data types to ActionScript[/url]);     2.传递数据量比较大;     3.运行效率是现有几个当中最高的;     4.对各种后台的支持也比较好;     5.其还有调试模块(NetConnection Debugger) [img]http://www.knifesky.com/attachments/month_200603/19_114231_07ycfr_debugger.jpg[/img] 其缺点:     1.需要flash端装[url=http://www.macromedia.com/software/flashremoting/downloads/components/]Flash Remoting MX Components[/url](这个是免费提供的);     2.需要后台服务端装相应版本的Flash Remoting模块才可以使用,MM提供的模块有j2ee和.net两个版本是要收费的,好在网上还有两个开源的([url=http://www.openamf.org/]OpenAMF[/url],[url=http://amfphp.org/]AMFPHP[/url]);     3.好像Remoting对虚拟主机的支持不太好(可以去google搜索一下,有没有解决方法).
[url=http://livedocs.macromedia.com/flashremoting/]Flash Remoting LiveDocs[/url]),MM网站上的[url=http://www.macromedia.com/cfusion/search/index.cfm?loc=en_us&term=remoting]Remoting相关的资料[/url] 三、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方便外,其他的实现都挺复杂的!
[u]复制代码[/u] 代码如下:
//=======================================; // 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.getSting("kinglong"); //设置返回结果对象; callObject.onResult = function(result){      trace("result:"+result); } //如果调用错误返回信息(这个是可选的); callObject.onFault = function(fault){     trace("fault:"+fault.faultstring); }
注意:如果返回结果是一个数据集的话,那每个字段名都要用大写,不管你的服务端是否大写!
[u]复制代码[/u] 代码如下:
================================================================   服务端方法定义(我这里仍以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 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安全策略问题。(网上有一个解决方法,不知是否可行,请自行验证)
[u]复制代码[/u] 代码如下:
//=======================================;  // 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+"\r"); } //处理服务端返回信息; 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向服务端发送的命令的最后一定要加上“\r”,否则服务端无法收到消息(我的服务端是用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()); } } } } } 
[u]复制代码[/u] 代码如下:
//=======================================;  // 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()+"\0");  //this.ps.flush();  }  public void run() {  while (true) {  String line = null;  try {  line = this.br.readLine();  } catch (IOException e) {  // TODO 自动生成 catch 块  //this.logger.log("错误-" + e.toString());  ChatServer.disconnect(this);  ChatServer.notifyRoom();  return;  }  if (line == null) {  //this.logger.log("信息-[" + this.clientName + this.clientIp + "]用户离开!");  ChatServer.disconnect(this);  ChatServer.notifyRoom();  if(this.clientName != null){  ChatServer.sendClients(new StringBuffer("MSG"+ChatServer.CommandDelimiters+"系统信息>[" + this.clientName + "]用户离开!"));  }  return;  }  //this.logger.log("信息-"+line);  String[] cmd_arr = line.split(ChatServer.CommandDelimiters);  String keyword = cmd_arr[0];  keyword = keyword.substring(1);  if(keyword.equals("MSG")){  StringBuffer msg = new StringBuffer("MSG"+ChatServer.CommandDelimiters);  msg.append(this.clientName+">");  msg.append(cmd_arr[1]);  ChatServer.sendClients(msg,this.clientName,cmd_arr[2]);  }else if(keyword.equals("QUIT")){  //this.logger.log("信息-[" + this.clientName + this.clientIp + "]用户离开!");  ChatServer.disconnect(this);  ChatServer.notifyRoom();  ChatServer.sendClients(new StringBuffer("MSG"+ChatServer.CommandDelimiters+"系统信息>[" + this.clientName + "]用户离开!"));  this.stop();  return;  }  }  }  }  //注意,服务端向客户端发送的信息,必需以”\0”,空字符结尾,否则客户端也无法接收到信息! 
五、FlashCom(FMS) FlashCom(FMS)主要用于与服务端进行流媒体通信,目前应用领域就是Flash流媒体播放,Flash在线直播,Flash视频音频聊天,Flash视频会议,Flash在线游戏等。 FlashCom的运行环境(FMS的运行环境): 1、Windows操作系统:Windows 2000 Server或者Windows NT 4.0 Server(sp6); 2、Linux操作系统:Red Hat Linux 7.3 或者 8.0; 3、服务器的CPU是Pentium III 500 MHz或者更高(推荐值是双个Pentium 4 CPU); 4、服务器的内存是256M RAM 或者更高(推荐值是512M)。 FlashCom(FMS)的优点: 1、能够实现即时视频音频通信(当然它也支持文本通信的); 2、能够流媒体同步播放(也叫在线直播); 3、能够通过Flash Player(6.0以上版本)录制视频音频,无需其他客户端; 4、能够实现客户端实现之间的控制(如会议主持人权限)。 FlashCom(FMS)的缺点: 1、FlashCom(FMS)服务端软件是MM公司的产品,需要花银子去买的(一笔不小的投入),好在现在有一个正在完善中的开源项目——RED5; 2、由于是流媒体服务端软件,所以对服务器的带宽,内存,以及CPU也是很高的要求的(上面已经作说明了); 3、同时在线视频通信的人数不能太多。  程序代码 //=======================================; // Flash客户端(以简单的在线录制视频为例) //=======================================; stop(); var nc:NetConnection = new NetConnection(); var ns:NetStream; var cam:Camera = Camera.get(); var mic:Microphone = Microphone.get(); //预览本地摄像头视频; video_box.attachVideo(cam); //初始化NetStream; function initNetStream():Void { ns = new NetStream(nc); //设置2秒的缓冲时间; ns.setBufferTime(2); //使用NetStream加载视频和音频对象; ns.attachVideo(cam); ns.attachAudio(mic); //NetStream状态信息; ns.onStatus = function(info:Object) { trace("ns.onStatus:"+info.code); }; } //录制视频音频; function recordStream(){ ns.publish("kinglong","record"); } //停止录制; function stopStream(){ ns.close(); } //删除视频音频文件; function deleteStream(){ nc.call("clearStream",null,"kinglong"); } //NetConnection状态信息; nc.onStatus = function(info:Object) { trace("nc.onStatus:"+info.code); switch (info.code) { case "NetConnection.Connect.Success" : initNetStream(); break; } }; //连接FlashCom服务器 nc.connect("rtmp:/"+"recordstream");  程序代码 //=======================================; // FlashCom(FMS)服务端代码 //将下列代码存成main.asc文件(此文件名固定),在FlashCom的applications目录下建立一个recordstream目录(对应着客户端的”recodstream”),并将main.asc放在这个目录中。 //=======================================; application.onAppStart = function(){ } application.onAppStop = function(){ } application.onConnect = function(client){ application.acceptConnection(client); } application.onDisconnect = function(client){ } //=======================================; //获取flv文件时间长度; function getStreamLength(name) { return Stream.length(name);; } //=======================================; //删除flv文件; function clearStream(name) { trace("clearStream("+name+");"); var stream = Stream.get(name); return stream.clear(); } //=======================================; //设置Client.prototype; //=======================================; Client.prototype.getStreamLength = getStreamLength; Client.prototype.clearStream = clearStream; 补上FMS官方中文网站相关资料地址: http://www.macromedia.com/cn/software/flashmediaserver/productinfo/pricing/  
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部