FMS3系列(二):创建可交互的FMS连接--I can say:Hello World
?????在做FMS開發(fā)中,flash客戶端與FMS服務(wù)器通信交互數(shù)據(jù)等是常見的,比如flash客戶端需要一播放一個視頻,需要獲得FMS發(fā)向flash端的一條消息等。那么我們要怎么才能實(shí)現(xiàn)flash客戶端與FMS服務(wù)器建立可交互的連接、通信呢?
?????本文將以flash客戶端于FMS服務(wù)器通信為核心,以經(jīng)典的"Hello World"示例詳細(xì)介紹flash客戶端于FMS服務(wù)器通信的實(shí)現(xiàn)。要實(shí)現(xiàn)兩端通信,在客戶端和服務(wù)器端都需要編碼,一邊發(fā)起通信請求和接收通信響應(yīng)信息(flash客戶端),一端則提供接收請求進(jìn)行業(yè)務(wù)處理等(FMS服務(wù)器端)。
?????首先從flash客戶端入手,本文的實(shí)例非常簡單,要實(shí)現(xiàn)的功能就是flash客戶端向FMS服務(wù)器端發(fā)起請求,調(diào)用FMS服務(wù)器上的一個方法,然后將FMS服務(wù)器上的方法返回值輸出到控制臺。
?????flash端的開發(fā)可以有兩種方式實(shí)現(xiàn):Flash和Flex。本文會將這兩種方式的實(shí)現(xiàn)都給出實(shí)例。首先看看Flash里的實(shí)現(xiàn)。
?????啟動Flash CS開發(fā)環(huán)境,新建立ActionScript 3.0的Flash文件,如下圖:
??????????????
?????然后在上面新建立的ActionScript 3.0的Flash文件上,按F9進(jìn)入動作面板(輸入程序代碼的地方,當(dāng)然也可以將代碼封裝到單獨(dú)的類文件里),如下圖:???? ????????
????? 上圖中已經(jīng)將通過Flash開發(fā)連接到FMS服務(wù)器的代碼全部貼出,代碼很簡單。NetConnection這個類在 Flash Player 和 Flash Media Server 應(yīng)用程序之間或者 Flash Player 和運(yùn)行 Flash Remoting 的應(yīng)用程序服務(wù)器之間創(chuàng)建雙向連接。
通過NetConnection建立于FMS服務(wù)器的連接,然后使用NetConnection類的公共方法connect()通過RTMP協(xié)議連接到指定的FMS服務(wù)器上指定的應(yīng)用,如上圖示為連接的FMS服務(wù)器上名為的“HelloWorld”的這個應(yīng)用。如果對NetConnection還不熟悉的朋友請先閱讀下我的這系列文章的第一篇:《FMS3系列(一):第一個FMS程序,連接到FMS服務(wù)器(Flash/Flex兩種實(shí)現(xiàn)) 》,隨后通過調(diào)用call()方法調(diào)用FMS服務(wù)器上的方法,這里通過調(diào)用服務(wù)器上提供的sayHelloWorld()方法。
?????Responder 類提供了一個對象,該對象在 NetConnection.call() 中使用以處理來自與特定操作成功或失敗相關(guān)的服務(wù)器的返回值。詳細(xì)見構(gòu)造Responder對象的時候構(gòu)造方法的參數(shù),一個方法處理操作成功的邏輯,一個方法處理操作失敗的邏輯。
?????OK,完成了上面的flash客戶端的開發(fā)現(xiàn)在就只差FMS服務(wù)器端的開發(fā)了,FMS服務(wù)器理需要有一個通信文件來負(fù)責(zé)于flash客戶端的連接交互,通常情況下就是建立一個main.asc的通信文件。本文中的通信文件的程序代碼非常簡單,就是接受客戶端的連接,然后提供一個客戶端調(diào)用的方法。完整代碼入下:
2?{
3?????client.sayHelloWorld=function(str)
4?????{
5?????????return?"I?can?say:Hello?"+?str;
6?????}
7???????this.acceptConnection(client);
8?}
?
?????通過上面的客戶端和FMS服務(wù)器的開發(fā),現(xiàn)在這樣可以按Ctrl+Enter測試了,看看我們的flash小程序是否能夠成功的連接到FMS服務(wù)器上指定的HelloWorld,并成功調(diào)用服務(wù)器端指定的方法呢?打開FMS管理控制臺可以看到如下截圖效果。OK,我們的小程序已經(jīng)成功的連接到了FMS服務(wù)器上指定的應(yīng)用(HelloWorld):
??????????
?????下面是測試輸出結(jié)果截圖:
??????????
上面的實(shí)現(xiàn)是直接將代碼寫在Flash中,我們也可以將代碼提取出來形成ActionScript文件(類),只要該類文件繼承于顯示對象,通過Flash CS3的新特性設(shè)置舞臺文檔類就可以調(diào)用了,下面是提取為ActionScript類的編程實(shí)現(xiàn):
?1?package?2?{
?3?????import?flash.net.*;
?4?????import?flash.events.*;
?5?????import?flash.display.*;
?6?????
?7?????public?class?ClientCallServer?extends?Sprite
?8?????{
?9?????????private?var?nc:NetConnection;
10?????????private?var?rs:Responder;
11?????????public?function?ClientCallServer():void
12?????????{
13?????????????nc=new?NetConnection();
14?????????????rs=new?Responder(onSuccess,onFailed);
15?????????????nc.connect("rtmp://localhost/HelloWorld");
16?????????????nc.client=this;
17?????????????nc.call("sayHelloWorld",rs,"World");
18?????????}
19?????????
20?????????private?function?onSuccess(rs:Object):void
21?????????{
22?????????????trace(rs.toString());
23?????????}
24?????????
25?????????private?function?onFailed(rs:Object):void
26?????????{
27?????????????trace(rs.description());
28?????????}
29?????}
30?}
?
或許有的朋友已經(jīng)習(xí)慣了使用Flex開發(fā),喜歡用拖拽控件的方式來完成一些常用的功能,其實(shí)在Flex下開發(fā)和Flash差別不是很大,其實(shí)在編碼層次上是沒什么區(qū)別的,不同的只是界面的呈現(xiàn)方式不一樣。
?1?private?var?nc:NetConnection;?2?private?var?fmsServer:String="rtmp://localhost/HelloWorld";
?3?private?var?rs:Responder;
?4?
?5?private?function?initApp():void
?6?{
?7?????nc?=?new?NetConnection();
?8?????nc.connect(fmsServer);
?9?????nc.client=this;
10?}
在Flex下開發(fā),建立好mxml后可以直接在其內(nèi)部的<mx:Script>組件里編寫ActionScript代碼,如上定義了連接FMS服務(wù)器的NetConnection類的實(shí)例等。還定義了一個在Flex應(yīng)用初始化的使用調(diào)用的方法initApp(),用來 完成flash客戶端與FMS服務(wù)器的連接。
1?private?function?onClick():void2?{
3?????rs?=?new?Responder(onSuccess,onFailed);
4?????nc.call("sayHelloWorld",rs,"World");
5?????nc.addEventListener(NetStatusEvent.NET_STATUS,onStatus);
6?????nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onAsyncHandler);
7?}
同F(xiàn)lash中開發(fā)一樣,給Responder指定了成功和失敗后的處理函數(shù),詳細(xì)如下:
?*?通信成功并返回結(jié)果時被調(diào)度
?*/
private?function?onSuccess(result:Object):void
{
????Alert.show(result.toString(),"調(diào)用結(jié)果");
}
/**?*?通信失敗并返回結(jié)果時被調(diào)度
?*/
private?function?onFailed(result:Object):void
{
????Alert.show(result.description);
????Alert.show(result.code);
}
?
如上就完成了Flex中調(diào)用FMS服務(wù)器并調(diào)用FMS上所提供的方法,服務(wù)器端的程序和前面 Flash中的一樣。到此我們只需要調(diào)用onClick()方法就可以測試了,通過一個按鈕組件來調(diào)用,如下:
<mx:Button?x="91"?y="219"?label="Call"?click="onClick()"/>完整的Flex代碼
?1<?xml?version="1.0"?encoding="utf-8"?>
?2<mx:Application?xmlns:mx="http://www.adobe.com/2006/mxml"?layout="absolute"?fontSize="12"?
?3????creationComplete="initApp()">
?4????<mx:Script>
?5????????<![CDATA[
?6????????????import?mx.controls.Alert;
?7????????????private?var?nc:NetConnection;
?8????????????private?var?fmsServer:String="rtmp://localhost/HelloWorld";
?9????????????private?var?rs:Responder;
10????????????
11????????????private?function?initApp():void
12????????????{
13????????????????nc?=?new?NetConnection();
14????????????????nc.connect(fmsServer);
15????????????????nc.client=this;
16????????????}
17????????????
18????????????private?function?onClick():void
19????????????{
20????????????????rs?=?new?Responder(onSuccess,onFailed);
21????????????????nc.call("sayHelloWorld",rs,"World");
22????????????????nc.addEventListener(NetStatusEvent.NET_STATUS,onStatus);
23????????????????nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onAsyncHandler);
24????????????}
25????????????
26????????????private?function?onStatus(evt:NetStatusEvent):void
27????????????{
28????????????????Alert.show(evt.info.code);
29????????????}
30????????????
31????????????public?function?onAsyncHandler(evt:AsyncErrorEvent):void
32????????????{
33????????????????
34????????????}
35????????????
36????????????/**//**
37?????????????*?通信成功并返回結(jié)果時被調(diào)度
38?????????????*/
39????????????private?function?onSuccess(result:Object):void
40????????????{
41????????????????Alert.show(result.toString(),"調(diào)用結(jié)果");
42????????????}
43????????????
44????????????/**//**
45?????????????*?通信失敗并返回結(jié)果時被調(diào)度
46?????????????*/
47????????????private?function?onFailed(result:Object):void
48????????????{
49????????????????Alert.show(result.description);
50????????????????Alert.show(result.code);
51????????????}
52????????????
53????????????private?function?onBWDone(rs:Object):void
54????????????{}
55????????]]>
56????????
57????</mx:Script>
58????<mx:Button?x="91"?y="219"?label="Call"?click="onClick()"/>
59</mx:Application>
60
61
?
在平時的開發(fā)當(dāng)中,要與FMS服務(wù)器創(chuàng)建可交互的連接有很多種方式,本文只是簡單的介紹了最基本的一種調(diào)用,希望本文對想學(xué)FMS開發(fā)的朋友有所幫助。
?
版權(quán)說明? 本文屬原創(chuàng)文章,歡迎轉(zhuǎn)載,其版權(quán)歸作者和博客園共有。??
? 作??????者:Beniao
?文章出處:http://beniao.cnblogs.com/? 或? http://www.cnblogs.com/
推薦文章:http://www.cnblogs.com/aierong/archive/2009/01/15/fms3_main.html
轉(zhuǎn)載于:https://www.cnblogs.com/beniao/archive/2009/03/11/1400077.html
總結(jié)
以上是生活随笔為你收集整理的FMS3系列(二):创建可交互的FMS连接--I can say:Hello World的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何生成WebPart的部署文件(wsp
- 下一篇: 【转】Scott_ASP.NET MVC