[AS 3]Flashとバックグラウンドデータ交換の4つの方法の整理
63561 ワード
Flash Player 9の普及に伴い、AS 3のプログラミングも多くなってきたので、今回はAS 3のバックグラウンドとのデータ交換方法をいくつか再整理します.1.URLLoader(URLStream)2.FlashRemoting3.XMLSocket(Socket) 4.FMS/FCS
一、URLLoader(URLStream)篇URLStreamとURLLoader中のURLLoaderDataFormat.BINARYは似ていて、それはダウンロードURLに対する低級なアクセス方式を提供して、私はここで二度と繰り返しません.興味があるのは、FlashヘルプのURLStreamクラスを見ることができます.Flashエンド
1 view plaincopy to clipboardprint?
2 /**
3 * @author Kinglong
4 * @link http://www.klstudio.com
5 * @mail [email protected]
6 * @version 0.1
7 */
8
9 package project.test {
10
11
12 import flash.display.*;
13 import flash.events.*;
14 import flash.net.*;
15
16 public class TestURLLoader extends Sprite {
17 private var _loader:URLLoader;
18 public function TestURLLoader() {
19 // URLLoader ;
20 _loader = new URLLoader();
21 // ( 、 、URL );
22 _loader.dataFormat = URLLoaderDataFormat.VARIABLES;
23
24 //
25 configureListeners(_loader);
26
27 // ;
28 var params:URLVariables = new URLVariables();
29 params.username = "kinglong";
30 params.password = "king";
31
32 // Request ;
33 var request:URLRequest = new URLRequest("http://www.klstudio.com/none.jsp");
34 // ;
35 request.data = params;
36 // (POST,GET);
37 request.method = URLRequestMethod.POST;
38
39 try {
40 loader.load(request);
41 } catch (error:Error) {
42 trace(error);
43 }
44
45
46 }
47 private function configureListeners(dispatcher:IEventDispatcher):void {
48 // ;
49 dispatcher.addEventListener(Event.COMPLETE, loaderHandler);
50 // ;
51 dispatcher.addEventListener(Event.OPEN, loaderHandler);
52 // ;
53 dispatcher.addEventListener(ProgressEvent.PROGRESS, loaderHandler);
54 // ;
55 dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loaderHandler);
56 //Http ;
57 dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, loaderHandler);
58 // ;
59 dispatcher.addEventListener(IOErrorEvent.IO_ERROR, loaderHandler);
60 }
61
62 private function loaderHandler(event:*):void {
63 switch(event.type) {
64 case Event.COMPLETE:
65 trace(_loader.data.result);
66 break;
67 case Event.OPEN:
68 trace("open: " + event);
69 break;
70 case ProgressEvent.PROGRESS:
71 trace("progress: " + event);
72 break;
73 case SecurityErrorEvent.SECURITY_ERROR:
74 trace("securityError: " + event);
75 break;
76 case HTTPStatusEvent.HTTP_STATUS:
77 trace("httpStatus: " + event);
78 break;
79 case IOErrorEvent.IO_ERROR:
80 trace("ioError: " + event);
81 break;
82
83 }
84 }
85
86 }
87 }
88 /**
89 * @author Kinglong
90 * @link http://www.klstudio.com
91 * @mail [email protected]
92 * @version 0.1
93 */
94
95 package project.test {
96
97
98 import flash.display.*;
99 import flash.events.*;
100 import flash.net.*;
101
102 public class TestURLLoader extends Sprite {
103 private var _loader:URLLoader;
104 public function TestURLLoader() {
105 // URLLoader ;
106 _loader = new URLLoader();
107 // ( 、 、URL );
108 _loader.dataFormat = URLLoaderDataFormat.VARIABLES;
109
110 //
111 configureListeners(_loader);
112
113 // ;
114 var params:URLVariables = new URLVariables();
115 params.username = "kinglong";
116 params.password = "king";
117
118 // Request ;
119 var request:URLRequest = new URLRequest("http://www.klstudio.com/none.jsp");
120 // ;
121 request.data = params;
122 // (POST,GET);
123 request.method = URLRequestMethod.POST;
124
125 try {
126 loader.load(request);
127 } catch (error:Error) {
128 trace(error);
129 }
130
131
132 }
133 private function configureListeners(dispatcher:IEventDispatcher):void {
134 // ;
135 dispatcher.addEventListener(Event.COMPLETE, loaderHandler);
136 // ;
137 dispatcher.addEventListener(Event.OPEN, loaderHandler);
138 // ;
139 dispatcher.addEventListener(ProgressEvent.PROGRESS, loaderHandler);
140 // ;
141 dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loaderHandler);
142 //Http ;
143 dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, loaderHandler);
144 // ;
145 dispatcher.addEventListener(IOErrorEvent.IO_ERROR, loaderHandler);
146 }
147
148 private function loaderHandler(event:*):void {
149 switch(event.type) {
150 case Event.COMPLETE:
151 trace(_loader.data.result);
152 break;
153 case Event.OPEN:
154 trace("open: " + event);
155 break;
156 case ProgressEvent.PROGRESS:
157 trace("progress: " + event);
158 break;
159 case SecurityErrorEvent.SECURITY_ERROR:
160 trace("securityError: " + event);
161 break;
162 case HTTPStatusEvent.HTTP_STATUS:
163 trace("httpStatus: " + event);
164 break;
165 case IOErrorEvent.IO_ERROR:
166 trace("ioError: " + event);
167 break;
168
169 }
170 }
171
172 }
173 }
サービス側(jsp)
view plaincopy to clipboardprint?
<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>
<%
String username = request.getParameter("username");
String password = request.getParameter("password");
boolean result = false;
// ...;
out.println("result="+result+"&_");
%>
<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>
<%
String username = request.getParameter("username");
String password = request.getParameter("password");
boolean result = false;
// ...;
out.println("result="+result+"&_");
%>
利点:1、flashコードは実現が簡単で、便利です.2、サービス側の受信ページは1つのフォームからのデータを受信するのと同じように処理し、専門的な技術を必要とせず、すべてのサービス側のプログラムを実現することができる. 3、文字列変数を送信してもよいし、ファイルストリーム([AS 3]URLLoader+URLRequest+JPGEncoderでBitmapDataピクチャデータ保存を実現)を送信してもよい.4、AMF 3と組み合わせてより豊富なデータ型を受信することができる([AS 3]AMF 3+JAVAの呼び出し例).欠点:1、伝達する変数は多すぎるべきではありません.2、変数伝達の値は長すぎるべきではない.注意:受信データ型がURLLoaderDataFormat.VARIABLESに設定されている場合、最初の文字は&で始まることはできません.最後の部分は&終わりにしたほうがいいです.
二、FlashRemoting編はAS版FlashRemotingに比べて、クライアントコードが簡単になり、伝達されたデータが豊富になった.
RemotingService
view plaincopy to clipboardprint?
/**
* @author Kinglong
* @link http://www.klstudio.com
* @mail [email protected]
* @version 0.1
*/
package com.klstudio.remoting{
import flash.net.NetConnection;
import flash.net.ObjectEncoding;
public class RemotingService extends NetConnection{
function RemotingService(url:String,amf:uint=ObjectEncoding.AMF0){
this.objectEncoding = amf;
this.connect(url);
}
}
}
/**
* @author Kinglong
* @link http://www.klstudio.com
* @mail [email protected]
* @version 0.1
*/
package com.klstudio.remoting{
import flash.net.NetConnection;
import flash.net.ObjectEncoding;
public class RemotingService extends NetConnection{
function RemotingService(url:String,amf:uint=ObjectEncoding.AMF0){
this.objectEncoding = amf;
this.connect(url);
}
}
}
TestFlashRemoting
view plaincopy to clipboardprint?
/**
* @author Kinglong
* @link http://www.klstudio.com
* @mail [email protected]
* @version 0.1
*/
package project.test {
import flash.display.*;
import flash.events.*;
import flash.net.*;
import com.klstudio.remoting.RemotingService;
public class TestFlashRemoting extends Sprite {
private var _service:RemotingService;
public function TestFlashRemoting() {
//
_service = new RemotingService("http://localhost:8500/flashservices/gateway");
// FlashRemoting
/*
* RemotingService.call([ ],[ ],[ ]...);
*/
_service.call("myservice.getString",new Responder(onResult, onFault),"kinglong");
}
// ;
private function onResult(result:Object):void {
trace("result:"+result);
}
//
private function onFault(fault:Object):void {
trace("fault:"+fault.details);
}
}
}
/**
* @author Kinglong
* @link http://www.klstudio.com
* @mail [email protected]
* @version 0.1
*/
package project.test {
import flash.display.*;
import flash.events.*;
import flash.net.*;
import com.klstudio.remoting.RemotingService;
public class TestFlashRemoting extends Sprite {
private var _service:RemotingService;
public function TestFlashRemoting() {
//
_service = new RemotingService("http://localhost:8500/flashservices/gateway");
// FlashRemoting
/*
* RemotingService.call([ ],[ ],[ ]...);
*/
_service.call("myservice.getString",new Responder(onResult, onFault),"kinglong");
}
// ;
private function onResult(result:Object):void {
trace("result:"+result);
}
//
private function onFault(fault:Object):void {
trace("fault:"+fault.details);
}
}
}
Coldfusion Component
view plaincopy to clipboardprint?
<!--- 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>
<!--- 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>
利点:1.転送データ型が豊富です.2.AMF 0、AMF 3の2種類のデータパッケージタイプをサポートすることができ、AMF 3はFlash Player 9以上でサポートすることができ、AMF 3があれば、バイナリファイルストリームデータを直接転送することができる.3.伝送効率が比較的高い.4.様々なバックグラウンドへのサポートも良い.FDS(LCDS)-AdobeがメインプッシュするFlashRemotingサービス側で、機能が強く(もちろんAMF 0、AMF 3フォーマット、java、netプラットフォームもサポート)、品質も悪くないが、残念ながらこれは銀が必要だ.Blazeds-はAdobeのもう一つのオープンソースのFlashRemotingプロジェクトであり、Javaプラットフォームベース、AMF 0、AMF 3フォーマットAmfphpをサポートする-PHPベースのRPCツールであり、FlashRemotingにおけるAMF 0とAMF 3の2つのフォーマット、オープンソースプロジェクトをサポートする.Openmf-JavaベースのFlashRemotingオープンソースプロジェクトで、現在はAMF 0形式のみサポートされています.GDS(Granite Data Services)-AMF 3をサポートするJavaプラットフォームベースのFlashRemotingプロジェクトでもあります.WebORB-.net、java、php、rubyなどの開発プラットフォームをサポートするFlashRemotingプロジェクトで、AMF 0とAMF 3もサポートされています.FluorineFx-.net開発プラットフォームをサポートするFlashRemotingオープンソースプロジェクト、AMF 0、AMF 3、RTMP、RTMPT.
欠点:1.バックグラウンドサービス側に対応するバージョンのFlash Remotingモジュールが必要です.2.仮想ホストを使用する場合は構成が面倒です. 三、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がWebServicesを生成するのに便利であるほか、他の実装は複雑です!
//=======================================;
// 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の4つの方法でまとめた最終編ですが、お待たせいたしました前の文章がネット上でとても人気があるとは思いませんでした.その中の一人が私にメールを送ってくれました.私のこの最后の文章を见て、ははは、やはりとても喜んでいます.転载に対して私は声明します.まず、このいくつかの文章は転载を歓迎しますが、文章の作者を说明して、文章の元の住所を说明しましょう.私はいくつかのウェブサイトの転载を発见して、作者さえ书かないか书かないでください.そうです.この点は私がこれから文章を書く気持ちに影響しますので、ここで説明します!).これから本題に移ります!XMLSocketは主にサービス側とのインスタント通信に使われ、現在の応用分野は主にFlashテキストチャットやFlashオンラインゲームなどです. XMLSocketの利点: 1、サービス側と即時に通信できる; 2、Flash Player 5.0以上のバージョンにはクラスが内蔵されており、コンポーネントやプラグインを別途インストールする必要はありません. 3、XMLSocketはSocketクライアントに相当するので、一般的なミドルウェアはjava、.Netなどをサポートしています. XMLSocketの欠点: 1、XMLSocketは文字列またはxml形式のテキストしか伝送できず、データ型は単一である. 2、XMLSocketサービス側が自ら開発する場合、Socket技術を比較して理解する必要がある.幸い、ネット上には既成のサービス側ソフトウェア(商業のXMLSocketサーバーにはUnity、Fortressがあり、オープンソースのXMLSocketサーバーにはOregano Multiuserサーバーがある)がある. 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+"\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());
}
}
}
}
}
//=======================================;
// 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;
}
}
}
}