AS3 连接 Red5 示例

来源:互联网 发布:java订餐系统源码 编辑:程序博客网 时间:2024/05/16 23:01

示例:

客户端(Flex)于服务端(Red5)建立连接

客户端
  
      import flash.net.NetConnection;
  
      import flash.net.ObjectEncoding;
  
      import flash.events.NetStatusEvent;
  
      
  
      private var nc:NetConnection;
  
      //.
  
      //建立连接按钮点击后响应方法
  
      private function onConnectClicked(evt:Event):void {
  
          // new netconnection
 
          nc = new NetConnection( );
 
          // set encoding to old amf

          nc.objectEncoding = ObjectEncoding.AMF0;
 
          // netstatus event listening

          nc.addEventListener( NetStatusEvent.NET_STATUS , netStatus );

          // connect to red5

          // 调用方法:nc.connect(rtmp://域名或IP/服务名, 参数1, 参数2, ...);
 
          // 可以没有参数:nc.connect(rtmp://域名或IP/服务名);

          nc.connect( "rtmp://xxx.xxx.xxx.xxx/xxx", 参数1, 参数2);

      }
      
      //处理连接事件
      private function netStatus ( event:NetStatusEvent ):void {
          //trace( event.info.code );
      
          if ( event.info.code == "NetConnection.Connect.Rejected" ) {

              //服务被拒绝, 服务端主动调用 rejectClient() 方法

          } else if (event.info.code == "NetConnection.Connect.Success") {

              //建立连接成功
          } else if (event.info.code == "NetConnection.Connect.Failed") {
              //建立连接失败
          } else if (event.info.code == "NetConnection.Connect.Closed") {
              //连接关闭
          }
      }

服务器端
 
      import org.redserver.api.IConnection;
  
  
      //连接建立时Red5服务端自动调用的方法
  
      public boolean appConnect( IConnection conn , Object[] params ) {
  
          //客户端传过来的参数的获得方法
  
          String s1 = (String)params[0]; //参数1
  
          String s2 = (String)params[1]; //参数2
  
          //...
  
          // 其他代码
 
          return true;
      }


客户端(Flex)调用服务端(Red5)的函数并获得返回

客户端

         import flash.net.Responder;
         //.
  
      //定义接收返回结果的Responder
  
      var response:Responder = new Responder(callResult);
  
      //调用方法:nc.call("方法名", response, 参数1, 参数2, ...),参数的数量要与服务端的一致
  
      nc.call("Login", responder, 参数1, 参数2);
  
      //.  
  
      private function callResult(resultObj:Object):void {
  
          //trace("服务端返回结果为:" + resultObj);
        }

如果不需要获得返回,代码如下

       //调用方法:nc.call("方法名", response, 参数1, 参数2, ...),参数的数量要与服务端的一致
  
      nc.call("Login", null, 参数1, 参数2);

服务器端

  
      public void Login(String xxx, String xxx) {
  
          //代码
  
          return xxx; //返回的结果,存放在客户端的resultObj中
  
      }

服务端(Red5)调用客户端(Flex)的函数并获得返回

客户端

  
      import flash.net.NetConnection;
  
      import flash.net.ObjectEncoding;
  
      import flash.events.NetStatusEvent;
          
      private var nc:NetConnection;
  
      //.
  
      private function onConnectClicked(evt:Event):void {
  
          // new netconnection
  
          nc = new NetConnection( );
 
          // set encoding to old amf
 
          nc.objectEncoding = ObjectEncoding.AMF0;
          // netstatus event listening

          nc.addEventListener( NetStatusEvent.NET_STATUS , netStatus );

          // connect to red5

          // 调用方法:nc.connect(rtmp://域名或IP/服务名, 参数1, 参数2, ...);

          // 可以没有参数:nc.connect(rtmp://域名或IP/服务名);

          nc.connect( "rtmp://xxx.xxx.xxx.xxx/xxx", 参数1, 参数2);
      
          // *** 下面这行代码很重要,就是这行代码将客户端注册为可以接收服务端的调用 ***
          nc.client = this;

      }
      //接下来,可以加上服务端要调用的方法,必须是 public

      public function receiveMsg(msg:String):void {

          //代码
      }

服务器端
  
      import org.redserver.api.IConnection;
  
      import org.redserver.api.service.IServiceCapableConnection;
  
        //呼叫客户端函数,conn为对应客户端的连接,msg为参数
  
      //如果是多个参数应为:new Object[]{参数1, 参数2, ...},数量要和客户端的函数的参数一致
  
      callClient(conn, "receiveMsg", new Object[]{msg});
  
      //...
  
      //client为对应客户端的连接,method_name为函数名,obj为传递的参数
  
      private boolean callClient(
 
      IConnection client, String method_name, Object[] obj) {

          if (client instanceof IServiceCapableConnection) {

              IServiceCapableConnection sc = (IServiceCapableConnection) client;
              sc.invoke(method_name, obj);
          } else {

              return false;

          }

          return true;

      }

如果想要获得返回,必须提供一个继承IPendingServiceCallback接口的类

  
      Import org.redserver.api.service.IPendingService;
  
      Import org.redserver.api.IPendingServiceCallback;
  
      Class MyCallback implements IPendingServiceCallback{
  
          Public void resultReceived(IPendingServiceCall call){
  
              //...
  
          }
  
      }
  
      //...
 
      sc.invoke("receiveMsg", new Object[]{msg}, new MyCallback());

原创粉丝点击