艾睿会员有特权,登陆后广告自动屏障。现在就花5秒钟免费
注册!更有好礼相送!
Red5 Flash交互服务器学习笔记(1)
最近公司的一个项目要求做flash联机方面的东西,flash方面外包给了其他的团队,而我们负责后台服务器的开发,在和flash方面的程序员商量了许久之后选择了red5服务器作为我们的交互服务器,本来可以使用socket进行开发的,但考虑到各个方面的因素,尤其是传输格式方面,因为选择了amf格式,所以选择socket开发会很麻烦,所以索性使用同为java语言开发的red5服务器了。
在此记录下自己学习Red5的方方面面,也同样为各位奋战在flash交互战线的同仁们探探路。
好了,转入正题。
关于配置和安装,以及第一次创建自己的程序方面,我推荐大家看一下D5Power的
《【D5教程】如何由WIN安装版的RED5建立应用程序》这篇教程,上面已经很详细的讲解了如何使用red5提供的模板来建立自己的应用程序,在此不做赘述。我学习的方法是在此基础上进行修改和添加一些自己想要实现的功能,以便在此过程中了解red5的方方面面,这要比单纯的看api文档痛快多了,尤其是看到自己的应用程序能够很好的运行是很有成就感的一件事情。
D5Power的
《【D5教程】如何由WIN安装版的RED5建立应用程序》这篇教程在告诉大家如何建立自己的服务端程序的同时也告诉了大家如何使用客户端调用服务端的方法。使用过FMS做服务端的人一定知道,FMS提供的方法中不仅可以使客户端调用服务端的方法,也同样可以使服务端调用客户端的方法。那么Red5可以吗?答案是肯定的。下面的程序将告诉大家Red5服务端调用客户端事件的方法。
服务端代码:
package org.d5.first;
import java.util.*;
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.service.IServiceCapableConnection;
public class Application extends ApplicationAdapter {
//属性
private IScope appScope; //服务端的域定义
private String username; //用户名
//方法
//此应用开始运行的使用触发的方法
public boolean appStart(IScope app) {
appScope = app; //将应用的域值赋值给定义的域
return true;
}
//客户端连接的时候触发的方法(告知客户端已登录服务器)
public boolean appConnect(IConnection conn,Object[] params) {
username=(String)params[0]; //将客户端连接时传过来的参数赋值给用户名变量
IServiceCapableConnection sc=(IServiceCapableConnection)conn; //将sc强制转换为IServiceCapableConnection类型
sc.invoke("login",new Object[]{username}); //调用客户端的login方法,并将username传递过去
return true;
}
//客户端关闭连接的时候触发的方法
public void appDisconnect(IConnection conn) {
}
//被客户端调用的方法
public String login() {
return "Welcome to Red5 Servers!";
}
}
客户端代码:
文档类:testRed5.as
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.NetStatusEvent;
import flash.net.NetConnection;
import flash.net.Responder;
import flash.text.TextField;
import fl.controls.Button;
/**
* ... Red5服务器测试 ...
* @author Jerry
*/
public class testRed5 extends Sprite {
//属性
private var nc:NetConnection;
private var IP:String;
private var svrPath:String;
private var username:String;
//构造函数
public function testRed5() {
_init();
}
private function _init() {
IP = "localhost";
svrPath = "rtmp://" + IP + "/myChat";
username = "cosmos53076";
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, _statusHandler);
nc.connect(svrPath, username);
nc.client = this;
close_btn.addEventListener(MouseEvent.CLICK, _onCloseClick);
}
private function _onCloseClick(evt:MouseEvent) {
nc.close();
}
private function _statusHandler(evt:NetStatusEvent) {
if (evt.info.code == "NetConnection.Connect.Success") {
trace_txt.text += "连接成功!\n";
_login();
}
else {
trace_txt.text += "连接失败!\n";
}
}
private function _login() {
nc.call("login",new Responder(_onGet,_onError));
}
private function _onGet(obj) {
trace_txt.text += obj;
}
private function _onError(obj:Object) {
trace_txt.text += obj;
}
public function login(_name) {
var msg = _name+",您登录了Red5服务器!";
trace_txt.text += msg+"\n";
}
}
}
想必各位接触过FMS的人一定会发现,其实Red5和FMS有些大同小异,实际上如果你没有接触过FMS,我的建议是,先去了解FMS,然后再回过来学习Red5,这样会让你的学习效率提高不少。个人拙见而已。