现在的位置: 首页 > 综合 > 正文

(转)抛弃LCDS和FMS,在tomcat下开发Red5应用(第五篇)-客户端和服务器端方法调用的参数传递

2013年03月02日 ⁄ 综合 ⁄ 共 6524字 ⁄ 字号 评论关闭

在上一篇演示了客户端和服务器端方法调用,其实已经一并演示了参数传递的过程,但都是基本数据类型(ps:AS3的String,int,Number,Boolean,Array,Object对应到red5这边是String,int,double,boolean,java.utils.List,java.utils.Map,参考【red5学习2—参数传递】AS3与Red5之间的参数传递
),实际应用中传递的复杂数据类型应该更多,那么我们对上一篇的代码进行略微的修改,从服务器端发送一个自定义的java对象到客户端(参考中的两个例子实际上已经讲述的很清楚了):

1.添加一个自定义类User.java:

Java代码 复制代码
  1. package red5.example.red5server;   
  2.   
  3. public class User {   
  4.     private String userId;   
  5.     private String userName;   
  6.     private String sex;   
  7.        
  8.     public String getSex() {   
  9.         return sex;   
  10.     }   
  11.     public void setSex(String sex) {   
  12.         this.sex = sex;   
  13.     }   
  14.     public String getUserId() {   
  15.         return userId;   
  16.     }   
  17.     public void setUserId(String userId) {   
  18.         this.userId = userId;   
  19.     }   
  20.     public String getUserName() {   
  21.         return userName;   
  22.     }   
  23.     public void setUserName(String userName) {   
  24.         this.userName = userName;   
  25.     }   
  26. }  

2.修改上一篇的Application.java:

Java代码 复制代码
  1. package red5.example.red5server;      
  2.      
  3. import org.red5.server.adapter.ApplicationAdapter;      
  4. import org.red5.server.api.IConnection;      
  5. import org.red5.server.api.Red5;      
  6. import org.red5.server.api.service.IServiceCapableConnection;      
  7.      
  8. public class Application extends ApplicationAdapter {      
  9.      
  10.     private String userName;      
  11.           
  12.     //客户端调用的方法      
  13.     public String callFromClient(String userName) {      
  14.         this.userName = userName;      
  15.         callClient();      
  16.         return "Hello:"+userName;      
  17.     }      
  18.           
  19.     //服务器端调用客户端的方法      
  20.     public void callClient() {      
  21.         IConnection conn=Red5.getConnectionLocal();      
  22.         if (conn instanceof IServiceCapableConnection) {      
  23.             IServiceCapableConnection sc = (IServiceCapableConnection) conn;    
  24.             User user = new User();   
  25.             user.setUserId("userId");   
  26.             user.setUserName("userName");   
  27.             user.setSex("女");   
  28.             sc.invoke("callFromServer"new Object[]{user});      
  29.         }      
  30.     }      
  31. }    

3.同样,稍微修改客户端代码:

Xml代码 复制代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">  
  3.     <mx:Script>  
  4.         <![CDATA[  
  5.             import flash.net.*;  
  6.             import flash.events.*;     
  7.             import flash.utils.*;     
  8.             import mx.controls.*;   
  9.               
  10.             private var nc:NetConnection;  
  11.               
  12.             public function init():void {  
  13.                 nc = new NetConnection();                    
  14.                 nc.addEventListener(NetStatusEvent.NET_STATUS, netStatus);     
  15.                 nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, netSecurityError);     
  16.                 nc.connect("rtmp://localhost/red5Server");     
  17.                 nc.client = this;   
  18.             }  
  19.               
  20.             private function netStatus(event:NetStatusEvent):void {     
  21.                 var connStatus:String = event.info.code;  
  22.                 //Alert.show(connStatus);   
  23.                 if(connStatus == "NetConnection.Connect.Success") {    
  24.                     nc.call("callFromClient",new Responder(callServerMethodResult,callServerMethodFault),Math.random().toString());  
  25.                 }  
  26.             }     
  27.              
  28.             private function netSecurityError(event:SecurityErrorEvent):void {     
  29.                 Alert.show("netSecurityError: " + event);     
  30.             }  
  31.               
  32.             public function callServerMethodResult(re:String):void {  
  33.                 Alert.show("客户端调用服务器端方法成功,返回结果:"+re);  
  34.             }  
  35.               
  36.             public function callServerMethodFault(fo:Object):void {  
  37.                 Alert.show("客户端调用服务器端方法失败:"+fo.toString());  
  38.             }  
  39.               
  40.             public function callFromServer(re:Object):void {  
  41.                 Alert.show("服务器端调用客户端方法,传递的参数为一个对象:/nuserId:"+re.userId+"/nuserName:"+re.userName+"/nsex:"+re.sex);  
  42.             }  
  43.         ]]>  
  44.     </mx:Script>  
  45. </mx:Application>  

 

运行客户端,可以看到从服务器端传递过来的实例已经能被客户端所识别了。

 

本例子没有像上面两个参考中那样详细,是因为我认为复杂数据类型的传递在RemoteObject中使用更好,而NetConnection上进行服务器端和客户端方法相互调用更适合一些简单的数据传递(可能是原来用FMS的时候基于NetConnection进行参数传递有些难度造成的,呵呵,毕竟FMS端是AS2的语法)。

 

在下一篇中将介绍如何在Red5中使用RemoteObject,因为很多原来基于LCDS的应用大部分数据操作都是用RemoteObject来实现的,想平滑过渡到Red5上,尽量不要修改Flex端的代码最好。

抱歉!评论已关闭.