第十章
圖3-26
在編輯界麵,按快捷鍵F9或者打開菜單窗口,選擇“動作”選項,將打開編輯該Flash的ActionScript腳本的編輯器,如圖3-27所示。
圖3-27
ActionScript的代價結構體係和Java比較類似,所以我們需要先引用NetConnection對象所在的命名空間。
import flash.net.NetConnection;
import flash.events.NetStatusEvent;
然後,我們創建一個NetConnection類型的對象nc。
var nc:NetConnection = new NetConnection();
給nc對象綁定一個事件句柄,用來跟蹤連接狀態。
nc.addEventListener( NetStatusEvent.NET_STATUS , netStatus );
接下來,完成句柄對應的函數netStatus。
function netStatus( event:NetStatusEvent ):void
{
trace( event.info.code );
}
在這個函數裏我們隻是利用trace 方法輸出了連接狀態攜帶的信息。
最後,開始連接Red5服務承載的示範應用。
nc.connect( "rtmp://192.168.1.3/firstapp");
完成後,完整的代碼如下:
import flash.net.NetConnection;
import flash.events.NetStatusEvent;
function netStatus( event:NetStatusEvent ):void
{
trace( event.info.code );
}
var nc:NetConnection = new NetConnection();
nc.addEventListener( NetStatusEvent.NET_STATUS , netStatus );
nc.connect( "rtmp://192.168.1.3/firstapp");
從Flash CS5裏編譯運行此Flash(組合鍵Ctrl + Enter),顯示連接成功,如圖3-28所示。
圖3-28
3.5 管理連接狀態
仔細觀察上文的代碼,我們發現判斷連接是否成功或者連接上發生事件的狀態依賴的是一個類型為NetStatusEvent的對象的屬性info裏的code值。我們在運行的時候成功地連接到了Red5,它返回的字符串是“NetConnection.Connect.Success”,因此,當我們需要寫一段相對比較健壯的連接狀態管理的代碼時,可能會按照如下的方式進行編寫:
function netStatus( event:NetStatusEvent ):void
{
switch( event.info.code )
{
case "NetConnection.Connect.Success":
//連接成功後完成的事情
break;
case "NetConnection.Connect.Failed":
//連接失敗時作出的提示
break;
…
default:
//默認情況下的應對
}
}
這樣寫固然可行,但會有以下幾個問題:
? 容易因為拚寫錯誤導致switch case分支失效。
? 在不同的ActionScript文件裏進行判斷時,都需要複製粘貼具體狀態的字符串,比如“NetConnection.Connect.Success”。
因此,在詳細了解了NetStatus可能返回的狀態值之後,我們可以將信息狀態、信息等級和信息描述封裝在一起變成一個統一的類,將連接狀態“強類型化”,代碼如下:
import flash.events.NetStatusEvent;
public class NetStatusInfo{
public static function get NETSTREAM_BUFFER_EMPTY():InfoObject {
return new InfoObject("NetStream.Buffer.Empty","status","Data is not being received quickly enough to fill the buffer. Data flow will be interrupted until the buffer refills, at which time a NetStream.Buffer.Full message will be sent and the stream will begin playing again.");
}
public static function get NETSTREAM_BUFFER_FULL():InfoObject {
return new InfoObject("NetStream.Buffer.Full","status","The buffer is full and the stream will begin playing.");
}
public static function get NETSTREAM_BUFFER_FLUSH():InfoObject {
return new InfoObject("NetStream.Buffer.Flush","status","Data has finished streaming, and the remaining buffer will be emptied.");
}
public static function get NETSTREAM_FAILED():InfoObject {
return new InfoObject("NetStream.Failed","error","Flash Media Server only. An error has occurred for a reason other than those listed in other event codes.");
}
public static function get NETSTREAM_PUBLISH_START():InfoObject {
return new InfoObject("NetStream.Publish.Start","status","Publish was successful.");
}
public static function get NETSTREAM_PUBLISH_BADNAME():InfoObject {
return new InfoObject("NetStream.Publish.BadName","error","Attempt to publish a stream which is already being published by someone else.");
}
public static function get NETSTREAM_PUBLISH_IDLE():InfoObject {
return new InfoObject("NetStream.Publish.Idle","status","The publisher of the stream is idle and not transmitting data.");
}
public static function get NETSTREAM_UNPUBLISH_SUCCESS():InfoObject {
return new InfoObject("NetStream.Unpublish.Success","status","The unpublish operation was successfuul.");
}
public static function get NETSTREAM_PLAY_START():InfoObject {
return new InfoObject("NetStream.Play.Start","status","Playback has started.");
}
public static function get NETSTREAM_PLAY_STOP():InfoObject {
return new InfoObject("NetStream.Play.Stop","status","Playback has stopped.");
}
public static function get NETSTREAM_PLAY_FAILED():InfoObject {
return new InfoObject("NetStream.Play.Failed","error","An error has occurred in playback for a reason other than those listed elsewhere in this table, such as the subscriber not having read access.");
}
public static function get NETSTREAM_PLAY_STREAMNOTFOUND():InfoObject {