08.14
以前在ActionScript 2.0中,Macromedia有提供專門給FlashRemoting用的套件,但是在ActionScript 3.0出來滿一年多以來,並未像之前一樣提供NetService.as用,那代表ActionScript 3.0從此跟FlashRemoting絕緣了嗎?那可必一定,其實就算不用透過NetServices也有解決的辦法,那就是NetConnection這個類別。
其實這個早該就要講了,但是事情實在太多了,說以今天想起來來作一個簡單的示範,下次我們再來試試看其他種Server程式語言要如何透過FlashRemoting來與ActionScript 3.0結合在一起。
只要有使用過 Flash Media Server 的人對 NetConnection 一定不陌生,尤其是被我教過 Flash Media Server 的學生更是記憶猶新,沒辦法,每個東西都要先從 NetConnection 開始實作起,所以這次我們建立一個 helloworld.cfc 簡單的讓它傳回 Hello AS3 給 ActionScript 3.0 就可以了,至於其他應用就交給大家自己去實做囉,請先建立一個 helloworld.cfc 檔放置在 webroot/comp/helloworld.cfc 並實作個 sayHello 的 method 程式範例如下:
<cfcomponent>
<cffunction name="sayHello" access="remote" returntype="string">
<cfreturn "Hello AS3">
</cffunction>
</cfcomponent>
從程式碼中應該不難了解這支程式的用途,再來實作一個 ActionScript 3.0 的主程式,只要簡單的呼叫並接收回傳的資料就可以了,用法與呼叫 SSAS 的 Remote Method 是完全一樣的,只是在使用 Flash Media Server 時是使用 RTMP 這種通訊協定,而 Flash Remoting 則是使用 HTTP ,其程式碼如下
package{
import flash.display.Sprite;
import flash.net.NetConnection;
import flash.net.Responder;
public class RemotingDemo extends Sprite{
private var nc:NetConnection;
public function RemotingDemo(){
nc = new NetConnection();
nc.connect("http://localhost:8500/flashservices/gateway");
var responder:Responder = new Responder(resultFunc,faultFunc)
nc.call("comp.helloworld.sayHello",responder,null);
}
private function resultFunc(data:String):void{
trace("由ColdFusion傳回:"+data);
}
private function faultFunc(info:Object):void{
for(var i:String in info){
trace(i+":"+info[i]);
}
}
}
}
首先透過 NetConnection 跟 ColdFusion 的 Flash Remoting Gateway 取得連繫,再使用 NetConnection.call 來呼叫服務,並將回傳的處理者交給 Responder 來做指定,恭喜妳,如果成功的話應該可以得到成功的結果,如下圖:

當然成功能處理,失敗也要能處理才行,所以我們故意在 helloworld.cfc 中使用了一個未被定義的變數 error ,如下圖將會傳會錯誤的原因,並交由 faultFunc 處理函數來處理。

雖然這只是個簡單的示範,但是應該可以清楚的看出它是如何運作的,等到我先來寫完答應要幫學生解答的問題後,再來繼續示範跟其他種不同類型的 Server 程式語言來溝通。
相關文章:
文章內容由宋志峰[ANISTAR]撰寫,引用分享請以鏈結形式註明出處與原始作者。


Dear adain:
不是的,在ActionScript 3.0中只要是複雜資料型態都是顯示[Object Object],而一個複雜的資料型態中可以儲存大量的資料內容。
老師阿 ~ 您的例子中resultFunc(data:String):void{ trace(”由ColdFusion傳回:”+data); },那個data代表只有一個結果媽 ? 假設當我送出query查詢的結果有好幾筆待回傳,在as2中可以加上RecordSet (re.result)的方式並利用getItemAt(0),getItemAt(1)…方式抓取好幾筆資料,但是,as3的部分,他告訴我"由ColdFusion傳回:[object Object]",那不就是只能接收一筆資料 ? 是這樣媽 ?
Dear 笨蛋:
你用到NetConnection應該是走OpenAMF,有個小技巧是要將AMF編碼成1.0的版本,才能順利接上,請再試試看。
老師您好 幾點問題想請教:
我想要用FLEX的NetConnection類別來連接我一個JAVA的伺服器
目前JAVA的部分就是開幾個PORT等待連接並接收檔案傳送
問題是我FLEX這裡試了很久都連不上伺服器 我是這樣寫的:
NetConnection.connect("http://127.0.0.1:port/");
RUN起來伺服器沒回應FLEX也說沒連到線 因為要用到NetStream的類別
所以一定要用NetConnection的吧?
但是我用Socket類別去連就可以連上 懇請老師指點一下連接JAVA伺服器有
哪些要注意的地方呢 萬分感激!
(為什麼我在這寫的標籤範例會消失啊,我都有放空格啊)
他說他看的到OBJECT可是抓不到欄位的質
例如 myEmp 是CFQUERY的名字
Lname 是其中一個欄位名
在CFC裡尾巴我是這樣寫的
然後傳過去以後她沒辦法用AS3抓
[object name].myEmp.Lname
就算抓到了,也只能抓一個RECORD
可不可以教教這個劣徒 該如何處理讓她可以抓的到QUERY裡的每一個欄位包括所有的RECORD
謝謝~
Dear 方揚:
傳會到ActionScript 3.0的時候會以Object來呈現,所以直接用Object的方法操作就好。
Anistar老師
我是你班上其中一的劣徒,把你教的都忘光光了,呵呵
我遇到一個REMOTING的問題
我在CHARLES的公司裡寫CFC,與一位寫AS3.0的搭檔。我在CFC裡回傳的資料形式是STRUCT,然後我就把QUERY塞到STRUCT裡。
例:
前寫:
因為CFC要回傳多個QUERY的結果,所以我採用了STRUCT的方式回傳。
我QUERY的結果是複數的例如像員工資料一樣的資料
但是我同事不會處理我傳過去的質(我用CFML測我的CFC是OK的)
他不是要把傳過去的質放到DATAGRID
他是要直接處理我QUERY裡的欄位的資料,可否教我一下~??
謝謝~
Dear 木蘭從軍:
感謝你的祝賀,趁著這次颱風來襲,剛好課程停課,來花點時間介紹一下這本新書的內容好了。
恭喜老爺,賀喜老爺! 新書終於上櫃了。很“紅” 呦!
預祝您"一炮而紅"!
昨晚上課,正好也復習到CFC,很好的對照, 印像鮮明。謝啦!!