Flex與.NET互操作(十一):FluorineFx.Net的及時通訊應用(Remote Procedure Call)(二)

來源:互聯網
上載者:User

NET的伺服器端同樣也可以非常方便的呼叫用戶端,調用用戶端的方法(比如實現系統廣播)。

一、用戶端的RPC(用戶端調用伺服器端

要想實現Client Access Server端的方法,首先得對ActionScript中的NetConnection比較熟悉,該類提供了一個樣本方法call()專們用來做RPC訪問,該方法的定義如下:

public function call(command:String, responder:Responder, arguments):void

比如說我們在開發一個及時應用的時候,所有的用戶端都需要同步伺服器的系統時間,這個時候我們就可以在伺服器端提供一個返回當前系統時間的方法給用戶端調用。如下:

//返回當前系統時間
public string GetServerTime()
{
return DateTime.Now.ToString();
}

有了這個方法用戶端就可以通過NetConnection的call()方法實行遠程調用了,並通過Responder來處理調用的結果,如果所調用的伺服器端方法沒有傳回值,則在調用的時候可以不使用Responder。如下完整的Flex執行個體代碼:

<?xml version="1.0" encoding="utf-8"?>
<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 = "串連狀態:" + event.info.code;
if(event.info.code == "NetConnection.Connect.Success")
{
trace("串連伺服器成功");
}
}

/* 調用伺服器端方法 */
private function onGetServerTime(event:MouseEvent):void
{
nc.call("GetServerTime",responder);
}

/* 處理調用伺服器端方法成功時返回的結果 */
private function onResult(result:String):void
{
this.txtResult.text = "方法GetServerTime返回結果" + result;
}

/* 處理調用伺服器端方法時候時返回的結果 */
private function onError(event:Event):void
{
trace("調用伺服器端方法出錯");
}
]]>
</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="調用服務端方法" click="onGetServerTime(event)"/>
<mx:Label x="30" y="153" id="txtResult" width="296"/>
</mx:Application>

FluorineFx.Net的RPC就這麼簡單,用戶端調用伺服器端的方法,直接通過當前串連的call()方法調用,使用Responder來處理調用的結果。

二、伺服器端的RPC(伺服器端調用用戶端)

用戶端和伺服器端的調用是可以雙向的,伺服器端也同樣可以調用用戶端的方法。無論是用戶端還是伺服器端,相互調用始終都是離不開當前的連線物件。如上面用戶端是通過當前串連的call()方法實現的調用伺服器端方法,那麼伺服器端調用用戶端的方法同樣如此,也是通過當前連線物件來處理。

FluorineFx中用於串連的介面是IConnection,只要用戶端成功的串連上了伺服器端,那麼在伺服器端就會儲存所有串連到伺服器端的連線物件的各種屬性。實現調用用戶端方法的則是IServiceCapableConnection介面,IServiceCapableConnection介面的定義如下所示:

如果要想實現伺服器端調用用戶端的方法,則必須使用此介面來完成,需要將當前串連的介面IConnection強制轉化為

IServiceCapableConnection介面,然後調用其invoke()方法來完成伺服器端對用戶端方法的調用。

/// <summary>
/// 調用用戶端的方法
/// </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擷取到當前用戶端的連線物件,然後將其轉化為IServiceCapableConnection介面對象,調用其Invoke()方法便可實現調用用戶端的方法。

這裡需要注意一點就是,提供給伺服器端調用的用戶端方法必須是公用方法(public修飾的方法),否則伺服器端會報"Not found method:方法名"的異常。如下代碼塊:

/**
* 接收伺服器端的調用方法
* */
public function RecServerMessage(message:Object):void
{
Alert.show(message.toString());
}

FluorineFx.Net所提供的上面這兩種功能是非常實用的,特別是在開發及時應用的時候,用戶端RPC可以方便是實現將用戶端是資料請求到伺服器端進行處理,比如開發網路遊戲中,遊戲用戶端的不同資料隨時都在改變,那麼我們就可以使用用戶端RPC來實現這一需求。伺服器端RPC 同樣可以應用於此,遊戲中的資料變化了通過用戶端RPC請求到伺服器端,伺服器端進行相與的業務計算和處理之後將用戶端需要的資料通過伺服器端RPC返回到當前請求的用戶端。

或許有的朋友會想或是問到,如果我要開發一個聊天室,要實現系統廣播訊息是不是可以使用這種方式來實現。答案是肯定的,系統要廣播訊息,可以從伺服器端擷取到所有串連到伺服器端的用戶端,然後迴圈的調用用戶端的方法來實現系統廣播訊息。關於如何?系統廣播這裡我就不作介紹,因為 FluorineFx.Net為我們提供了更好的方式來實現系統廣播。有興趣的朋友請關注我的後續文章,在下一篇文章裡我將詳細介紹這方面的知識點。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.