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
}
}