Flex与.NET互操作(十一):FluorineFx.Net的及时通信应用(Remote Procedure Call)(二)

NET的服务器端同样也可以非常方便的呼叫客户端,调用客户端的方法(比如实现系统广播)。

一、客户端的RPC(客户端调用服务器端

要想实现客户端访问服务器端的方法,首先得对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为我们提供了更好的方式来实现系统广播。有兴趣的朋友请关注我的后续文章,在下一篇文章里我将详细介绍这方面的知识点。

(0)

相关推荐

  • Flex与.NET互操作(十二):FluorineFx.Net的及时通信应用(Remote Shared Objects)(三)

    FluorineFx所提供的远程共享对象(Remote Shared Objects)和FMS的共享对象的功能是一样,对于熟悉FMS开发的朋友来说,学习FluorineFx的远程共享对象是非常简单的. 共享对象可以在服务器端创建,也可以在客户端创建.在客户端创建共享对象的方法和使用FMS开发是一样的,创建一个 NetConnection对象,通过该对象的connect()方法连接到服务器,然后通过SharedObject.getRemote()方法就可以在客户端创建一个远程共享对象.如下实例代码

  • Flex与.NET互操作(十一):FluorineFx.Net的及时通信应用(Remote Procedure Call)(二)

    NET的服务器端同样也可以非常方便的呼叫客户端,调用客户端的方法(比如实现系统广播). 一.客户端的RPC(客户端调用服务器端) 要想实现客户端访问服务器端的方法,首先得对ActionScript中的NetConnection比较熟悉,该类提供了一个示例方法call()专们用来做RPC访问,该方法的定义如下: public function call(command:String, responder:Responder,  arguments):void 比如说我们在开发一个及时应用的时候,所

  • Flex与.NET互操作 了解FluorineFx的环境配置(远程对象、网关、通道、目的地)

    在本系列文章的前面几篇文章中所介绍的访问Webservice的方法,也就是一种远程对象方法,只不过他是基于WEB服务(WebServie)的远程访问,不是基于远程对象(Remoting Object)的的远程访问.要想直接实现基于对象的远程访问是比较麻烦的,然后FluorineFx则专门为我们提供了该功能,通过 FluorineFx的核心库来开发远程对象(Remoting Object)服务,具体是怎么实现的呢? FluorineFx要求为远程对象提供[RemotingService]标记来提供

  • Flex和.NET协同开发利器FluorineFx Flex与.NET互操作

    通过这些方式来完成与服务端的通信是非常方便和简单的,但有他的缺点就是通信数据量较小,如要传输大量的数据或是实现不同对象的序列化传输,它们则满足不了我们的需求,需要寻找另外一种通信协议,另一种高效的传输协议来代替SOAP协议传输的方案,那便是AMF(ActionScript Message Format)协议. 开源项目FluorineFx就是专门针对.NET平台与Flex通信提供的AMF协议通信网关,我们可以通过FluorineFx很方便的完成与.NET的通信. FluorineFx官方提供了安

  • Flex与.NET互操作(十三):FluorineFx.Net实现视频录制与视频回放

    通过它我们可以非常方便的实现在线视频录制.视频直播.视频聊天以及视频会议等类似应用程序的开发. 在<FMS3系列(四):在线视频录制.视频回放 >这篇文章里我写了通过FMS来实现在线视频录制和视频回放的功能,客户端的开发和这篇文章是相同的,不同的是本文将使用Flex来开发. 首先我们来看看使用FluorineFx服务端是如何开发的,建立ApplicationAdapter是必然的,这里我们为本文中的示例程序建立的ApplicationAdapter为VideoApplication,并为其添加

  • Flex与.NET互操作(十):FluorineFx.Net的及时通信应用(ApplicationAdapter)(一)

    应用程序适配器对象也就相当于是一个Flash媒体服务器应用程序的对象. 使用FluorineFx.Net开发及时通信应用,我们可以通过ASP.NET网站来宿主,一个ASP.NET网站可以承载多个实时通讯应用程序.这些应用程序都存储ASP.NET网站的根目录下指定文件夹的根目录中.如下图示: 在开发FluorineFx的及时通信应用的时候,按照FluorineFx的目录结构配置ASP.NET的站点目录是非常简单的,只需要在ASP.NET站点下面建立一个名为apps的目录,那么FluorineFx就

  • Flex与.NET互操作(八) 使用FluorineFx网关实现远程访问

    于此,本文将使用FluorineFx网关来提供数据服务等多项功能来介绍通过FluorineFx实现远程访问的相关知识点. FluorineFx提供的远程访问包括有很多方面的知道点,本文只介绍其中的三个知识点:访问远程对象返回对象,返回DataTable,返回DataSet对象.FluorineFx安装包里自带有相关的示例程序,要学习更多可直接参考这些示例程序. 在实现访问前我们同样来做一些准备工作,建立好远程对象,如下: 1 namespace Fluorine.ServiceLibrary 2

  • FluorineFx.NET的认证(Authentication )与授权(Authorization)Flex与.NET互操作 九

    应用程序可根据用户信息授予和拒绝执行.FluorineFx.NET的认证和授权使用.Net Framework基于角色的安全性的支持. 比如说我们需要自定义一个认证与授权的方案,指定那些远程服务上的那些方法将要被认证或授权以及授权用户角色组等,我们就需要自定义一个 LoginCommand并实现ILoginCommand接口或者继承于 FluorineFx.Security.GenericLoginCommand(此类实现了ILoginCommand接口)基类.接口定义如下: 1 namespa

  • Flex与.NET互操作 使用HttpService、URLReqeust和URLLoader加载/传输数据

    ActionScript 3.0中提供的数据加载请求类主要是HTTPService,URLLoader和URLRequest,可以通过他们协同来完成数据加载和请求.下面我么便来看看这三个类是怎么来完成数据加载工作. 在本地IIS服务器上有如下定义的XML文件: 1 <?xml version="1.0" encoding="utf-8" ?> 2 <Root> 3   <Book> 4     <Id>1</Id

  • Flex与.NET互操作 使用FileReference+HttpHandler实现文件上传/下载

    在Flex的应用开发中,同ASP.NET,JSP,PHP等应用一样,都会有上传/下载文件的应用需求,Flex的SDK也为我们提供了专门的类 FileRefUdderence实现文件上传/下载.Flex只是作为一个客户端,要实现上传或下载必须得为其提供一个服务端来接受上传或下载的请求,本文以ASP.NET中的HttpHandler作为文件上传的服务端来完成上传功能. OK,我们从Flex客户端开始,看看客户端是通过什么方式想服务端发起请求.Flex客户端要完成文件上传下载都是通过FileRefUd

随机推荐