Flex與.NET互操作(十一):FluorineFx.Net的及時通信應用(Remote Procedure Call)(二)
一、客戶端的RPC(客戶端調(diào)用服務器端)
要想實現(xiàn)客戶端訪問服務器端的方法,首先得對ActionScript中的NetConnection比較熟悉,該類提供了一個示例方法call()專們用來做RPC訪問,該方法的定義如下:

比如說我們在開發(fā)一個及時應用的時候,所有的客戶端都需要同步服務器的系統(tǒng)時間,這個時候我們就可以在服務器端提供一個返回當前系統(tǒng)時間的方法給客戶端調(diào)用。如下:
public string GetServerTime()
{
return DateTime.Now.ToString();
}
有了這個方法客戶端就可以通過NetConnection的call()方法實行遠程調(diào)用了,并通過Responder來處理調(diào)用的結果,如果所調(diào)用的服務器端方法沒有返回值,則在調(diào)用的時候可以不使用Responder。如下完整的Flex實例代碼:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
private var nc:NetConnection;
private var responder:Responder = new Responder(onResult,onError);
private function connectionServer(event:MouseEvent):void
{
nc = new NetConnection();
nc.connect("rtmp://localhost:1617/RPCDemo","abc","123");
nc.addEventListener(NetStatusEvent.NET_STATUS,onStatusHandler);
nc.client = this;
}
private function onStatusHandler(event:NetStatusEvent):void
{
this.connStatus.text = "連接狀態(tài):" + event.info.code;
if(event.info.code == "NetConnection.Connect.Success")
{
trace("連接服務器成功");
}
}
/* 調(diào)用服務器端方法 */
private function onGetServerTime(event:MouseEvent):void
{
nc.call("GetServerTime",responder);
}
/* 處理調(diào)用服務器端方法成功時返回的結果 */
private function onResult(result:String):void
{
this.txtResult.text = "方法GetServerTime返回結果" + result;
}
/* 處理調(diào)用服務器端方法時候時返回的結果 */
private function onError(event:Event):void
{
trace("調(diào)用服務器端方法出錯");
}
]]>
</mx:Script>
<mx:Button x="30" y="43" label="連接服務器" click="connectionServer(event)"/>
<mx:Label x="30" y="75" width="296" id="connStatus"/>
<mx:Button x="30" y="112" label="調(diào)用服務端方法" click="onGetServerTime(event)"/>
<mx:Label x="30" y="153" id="txtResult" width="296"/>
</mx:Application>
FluorineFx.Net的RPC就這么簡單,客戶端調(diào)用服務器端的方法,直接通過當前連接的call()方法調(diào)用,使用Responder來處理調(diào)用的結果。
二、服務器端的RPC(服務器端調(diào)用客戶端)
客戶端和服務器端的調(diào)用是可以雙向的,服務器端也同樣可以調(diào)用客戶端的方法。無論是客戶端還是服務器端,相互調(diào)用始終都是離不開當前的連接對象。如上面客戶端是通過當前連接的call()方法實現(xiàn)的調(diào)用服務器端方法,那么服務器端調(diào)用客戶端的方法同樣如此,也是通過當前連接對象來處理。
FluorineFx中用于連接的接口是IConnection,只要客戶端成功的連接上了服務器端,那么在服務器端就會保存所有連接到服務器端的連接對象的各種屬性。實現(xiàn)調(diào)用客戶端方法的則是IServiceCapableConnection接口,IServiceCapableConnection接口的定義如下所示:
如果要想實現(xiàn)服務器端調(diào)用客戶端的方法,則必須使用此接口來完成,需要將當前連接的接口IConnection強制轉(zhuǎn)化為
IServiceCapableConnection接口,然后調(diào)用其invoke()方法來完成服務器端對客戶端方法的調(diào)用。
/// <summary>
/// 調(diào)用客戶端的方法
/// </summary>
/// <param name="connection"></param>
public void InvokeClient()
{
IServiceCapableConnection conn = FluorineContext.Current.Connection as IServiceCapableConnection;
if (connection != null)
{
object[] args = new object[] { GetServerTime() };
conn.Invoke("RecServerMessage", args);
}
}
在服務器端可以通過FluorineContext.Current.Connection獲取到當前客戶端的連接對象,然后將其轉(zhuǎn)化為IServiceCapableConnection接口對象,調(diào)用其Invoke()方法便可實現(xiàn)調(diào)用客戶端的方法。
這里需要注意一點就是,提供給服務器端調(diào)用的客戶端方法必須是公共方法(public修飾的方法),否則服務器端會報"Not found method:方法名"的異常。如下代碼塊:
* 接收服務器端的調(diào)用方法
* */
public function RecServerMessage(message:Object):void
{
Alert.show(message.toString());
}
FluorineFx.Net所提供的上面這兩種功能是非常實用的,特別是在開發(fā)及時應用的時候,客戶端RPC可以方便是實現(xiàn)將客戶端是數(shù)據(jù)請求到服務器端進行處理,比如開發(fā)網(wǎng)絡游戲中,游戲客戶端的不同數(shù)據(jù)隨時都在改變,那么我們就可以使用客戶端RPC來實現(xiàn)這一需求。服務器端RPC 同樣可以應用于此,游戲中的數(shù)據(jù)變化了通過客戶端RPC請求到服務器端,服務器端進行相與的業(yè)務計算和處理之后將客戶端需要的數(shù)據(jù)通過服務器端RPC返回到當前請求的客戶端。
或許有的朋友會想或是問到,如果我要開發(fā)一個聊天室,要實現(xiàn)系統(tǒng)廣播消息是不是可以使用這種方式來實現(xiàn)。答案是肯定的,系統(tǒng)要廣播消息,可以從服務器端獲取到所有連接到服務器端的客戶端,然后循環(huán)的調(diào)用客戶端的方法來實現(xiàn)系統(tǒng)廣播消息。關于如何實現(xiàn)系統(tǒng)廣播這里我就不作介紹,因為 FluorineFx.Net為我們提供了更好的方式來實現(xiàn)系統(tǒng)廣播。有興趣的朋友請關注我的后續(xù)文章,在下一篇文章里我將詳細介紹這方面的知識點。
相關文章
基于Socket的網(wǎng)絡連接 Flex與.NET互操作(一)
Flash/Flex也支持基于Socket的網(wǎng)絡連接 ,服務器端可以是C++,VB,C#,Java等任一語言開發(fā)。監(jiān)聽一個網(wǎng)絡端口便可以接收到Flash/Flex開發(fā)的客戶端的連接。2009-06-06