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( );

          nc.addEventListener( NetStatusEvent.NET_STATUS , netStatus );

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

      }

       

      //处理连接事件

      private function netStatus ( event:NetStatusEvent ):void {

          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") {

              //连接关闭

          }

      }

1. 客户端(Flex)与server端(Red5)建立连接
《客户端》
    
《server端》
    
 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;

      }

 
2. 客户端(Flex)呼叫server端(Red5)的函数并获得return值
《客户端》
        
import flash.net.Responder;

         //定义接收返回结果的Responder

         var response:Responder = new Responder(callResult);

         //呼叫方法:nc.call("方法名", response, 参数1, 参数2, ...),参数的数量要与server端的一致

         nc.call("Login", responder, 参数1, 参数2);

         private function callResult(resultObj:Object):void {

             //trace("server端返回结果為:" + resultObj);

        }

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

       //呼叫方法:nc.call("方法名", response, 参数1, 参数2, ...),参数的数量要与server端的一致

         nc.call("Login", null, 参数1, 参数2);

《server端》

      public void Login(String xxx, String xxx) {

             //代码   

          return xxx; //返回的结果,存放在客户端的resultObj中

         }

3. server端(Red5)呼叫客户端(Flex)的函数并获得return值
《客户端》
      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 );
          nc.connect( "rtmp://xxx.xxx.xxx.xxx/xxx");
          nc.client = this;
      }
      //接下来,可以加上服务端要调用的方法,必须是 public
      public function receiveMsg(msg:String):void {
          //代码
      }
《server端》
      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());
 
flex和java及red5参数可直接传递对象,如java端有如下这样一个类
package test

public class User{
    private String username;
    private String password;
//略去getter/setter

}

flex端应该这样写:
package x.x.x{
   [RmoteClass(alias="test.User")]
    public class User{
       //对应的属性
     private var _username :String;
       private var _password :String;

       //略去getter/setter
}
}

你可能感兴趣的:(server,function,String,object,Flex,import)