Flash Media Server

什么是Flash Media Server ?

Flash大家庭里的一员,这个东东以前叫Flash Communication Server,传说中的FCS就是这个,现在改叫FMS了...
不见不知道哦,一见真可怕,adobe还有这么cool的东东,自从见了她,让我做些小东东的兴趣全没了,一心想研究这个

这东东能做什么?

视频录制啊,flash聊天室啊,在线视频会议啊啊, 网络游戏?

不管怎样先安个试试吧

先到这里下载免费的开发者版本吧
http://www.macromedia.com/software/flashmediaserver/
然后安装,安装时记得用户名和密码不要瞎填自己要记住,如果你已经瞎填了那就到 安装目录下/conf/fms.ini 里找吧

极度鹤补充:
注1:安装时要输入注册码, 不管直接下一步就是免费的开发者版本啦
注2:安装 Flash Media Server 3.0 并将默认端口指定为 80<这样可以保证最多人可以看到你的视频,因为80端口一般不会被封>
如果机器上安装 IIS 或者 Apache,记得先关闭或者改成其他端口.
Flash Media Server 3  

偶装到了c盘,找到目录
C:/Program Files/Macromedia/Flash Media Server 2



先要打开服务器哦

你在本机装的fms,本机就是服务器了哦!记得现在你的机器既是客户端又是服务端哦
开始===程序===Macromedia===Flash Media Server 2
有两个start****,都要打开,关时候两个都要关,如果你怕麻烦直接找tool文件夹里的批处理文件StartServerService.bat吧,双击他,他会帮你搞定地,想关就找StopServerService.bat。~

applications文件夹

你 可以在里边建一个文件夹例如叫 FirstApp,这就建了一个Application,以后所有此项目服务器端的flv文件啊,共享文件啊都会在这里边,有时服务器端需要写程序的时候 里边会有个main.asc 文件,这个就是服务器端程序,服务器端程序目前只支持as1写,是在服务器上执行的,你也可以用trace调试,怎么trace管理服务器时候你会看到, 你可能会建若干个app,在一台服务器上同时运行,比如录象的app,聊天室的app。。。这些所有的app都通过fms自带的 fms2_console.swf管理,现在就去看看如何管理服务器吧!

管理服务器~

服务器打开后就要管理了哦,点开fms2_console.swf,别看他只是个swf,后台管理就靠他了,输入你安装时候的密码和用户,服务器地址写 localhost 就好看到了吧,熟悉熟悉他吧



以后我们写程序最常用的就是这个View Applications ,每当有客户端连接服务器时,左边就会列出连接的是哪个app,有多少连接 下图为连接applications文件夹下的bs文件夹(bs文件夹,因为每个文件夹对应一个app,就是bs app),连接数为1,458是实例名(实例名默认为 _definst_ ,每个文件夹可以有若干实例,互相不影响,这个特性可以用来做聊天是的房间,以后再说)



选中某个app后,或者客户端有连接,会看到当前打开的app的状态,这个

attachments/200708/29_150053_4.jpg



Live Log 服务器端的trace就这里看了 ,右边依次是客户端情况 , 共享对象,流,执行的情况(占内存,cpu等),后边两个小按钮,调试时候常用哦,reload和unload!
每当服务器端main.asc修改后一定记得reload或者unload一下,否则不会生效,unload会把窗口关闭,有客户端连的时候还会自动打开
总有人告诉我,他的fms经常会出现诡异现象,比如连接不上,代码已经删了还会执行,一生气连文件夹都删了,还会执行,怀疑是自己的rp有问题。。
那不是rp问题,记住出现问题就reload !实在不行就去tools文件夹点StopServerService.bat

conf文件夹

还有重要的是conf文件夹了,里边是一些服务器端的配置文件,以后可能会用,先不用动。。。。

自此,安装部分结束,go on...



安装FMS3 Linux版[linux]
之前在red hat linux 9上安装需要很多c的库依赖。看了adobe的官网fms3 适用于red hat 4 (也就是AS4版)但是不太想用redhat了,于是用了免费的CentOS
对应的版本应该是centos4.2以上(AS4 update2)于是去下了个centOS4.6
找了几处镜像以下链接是速度最快的(我用的是上海有线通)
http://centos.candishosting.com. ... .6-i386-bin1of4.iso
http://centos.candishosting.com. ... .6-i386-bin2of4.iso
http://centos.candishosting.com. ... .6-i386-bin3of4.iso
http://centos.candishosting.com. ... .6-i386-bin3of4.iso

注意* 第四张盘可以不用下,安装系统只要前三张盘


centOS的安装我就不说了,我选择的是custom安装,牢记要选上开发工具选项,fms3的依赖包里有c++的类库依赖

正式开始了


先创建个用户和用户组给fms用


[root@seven ~]# groupadd fms
[root@seven ~]# useradd -g fms fms


将安装包放在随便哪个目录里解压(我放在 /share 里)

[root@seven ~]# cd /share
[root@seven share]# tar -xzf FlashMediaServer3.tar.gz

...
一阵解压后切到FMS3目录下

[root@seven share]# cd /FMS_3_0_0_r1157
[root@seven FMS_3_0_0_r1157]# ./installFMS -platformWarnOnly

官方文档上写的只有 ./installFMS 这个行不通的装过2的人都知道

安装过程和2差不多在 2008 年 一月 里有安装2的过程可以参考


装好以后切到程序目录
[root@seven FMS_3_0_0_r1157]# cd /opt/adobe/fms
[root@seven fms] ./fmsmgr server fms start

用top察看进程
看到以下四个说明安装已成功了

fmscore
fmsedge
fmsmaster
fmsadmin

如果有什么问题比如跑不起服务试试看以下这些方法


1.有可能是其中一个依赖包没有

ldd fmsadmin
linux-gate.so.1 => (0×00cea000)
libpthread.so.0 => /lib/libpthread.so.0 (0×00721000)
libasneu.so.1 => /usr/lib/libasneu.so.1 (0×00b68000)
librt.so.1 => /lib/librt.so.1 (0×0074f000)
libdl.so.2 => /lib/libdl.so.2 (0×0071b000)
libstdc .so.6 => /usr/lib/libstdc .so.6 (0×04735000)
libm.so.6 => /lib/libm.so.6 (0×006f2000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0×00dcb000)
libc.so.6 => /lib/libc.so.6 (0×005b0000)
/lib/ld-linux.so.2 (0×0058e000)


起初我在装的时候
libasneu.so.1 => 为空
所以

#cp /opt/adobe/fms/libasneu.so.1 /lib/libasneu.so.1

然后

#./fmsmgr adminserver start


2.如果4个进程都跑起来了但是fms_adminConsole.swf还是连不上

那么试试看将你的防火墙关闭先

开启: service iptables start
关闭: service iptables stop

永久性的 --

开启: chkconfig iptables on
关闭: chkconfig iptables off

这样安全么?测试的时候可以,放到外面当然不行了

编辑防火墙配置

vi /etc/sysconfig/iptables

找到-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

在其上+上

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 1111 -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 1935 -j ACCEPT

然后/etc/rc.d/init.d/iptables restart

就ok了

有一种协议叫rtmp
客户端和服务器端通信是使用协议rtmp的
现在在服务器端applications文件夹(当然偶的客户端和服务器端是一台机器了)里建个test1文件夹,你的地址就为
rtmp:/test1 或者 rtmp://localhost/test1

注意两个地址中的 /"/ /"符号
打开flash
与服务器通信首先要建个NetConnection()
var nc = new NetConnection();

连接
nc.connect(/"rtmp://localhost/test1/");
怎么知道连没连上呢?顺利连接服务器后会触发一个onStatus事件
nc.onStatus = function(info) {
//trace(info)
//trace(info.code)
for (i in info) {
  trace(i+/": /"+info);
}
};

完整代码:
var nc = new NetConnection();
nc.onStatus = function(info) {
trace(info.code);
if (info.code == /"NetConnection.Connect.Success/") {
  trace(/"接通/");
}
};
nc.connect(/"rtmp://localhost/test1/");

注意:默认情况下服务器是允许你连接的,但只是默认,如果服务器拒绝你连接的话,上述代码就不好用了。怎么回事?我们看看连接的过程吧
连接过程
每当客户端试图连接服务器,一个NetConnection.connect(),服务器将会调用application.onConnect 来鉴定是不是允许客户端连接,onConnect()方法返回null 或不返回则将进入未决状态,直到onConnect方法中返回true或执行acceptConnection(client)则允许,返回false或执行rejectConnection(client)则拒绝

服务器文件是以.asc形式存在的,可以在test1文件夹里建一个main.asc
application.onConnect=function(client){
//this.rejectConnection(client);
//this.acceptConnection(client)
//return true
return false
}

这样就拒绝连接了

  共享的概念就是让每个链接到服务器的swf都能实时的得到共享的数据。
一个人更改了这些数据,其他人都会看得到。例如聊天室里的发言。

共享对象

共享对象,说英文大概你比较熟ha~ SharedObject, 恩flash中有两种sharedObject,local sharedobject (LSO) 和 remote sharedobject (RSO),也就是本地共享和远程共享,偶们讨论远程的,不过之前你最好先去了解了解本地的,对你有好处...
RSO在服务器端是以文件形式存储的,扩展名是.fso,为什么不是.rso?....我也想问呢- -b
代码
初始化RSO需要先与服务器建立一个连接,我们先与服务器建立一个连接

//初始化远程共享要利用nc通道
var myNC = new NetConnection();
myNC.onStatus = function(info) {
if (info.code == /"NetConnection.Connect.Success/") {
  //成功则利用此nc初始化rso
  initRSO(this);
}
};

跟上一节代码一样,只是连接成功后多了一个initRSO()函数,看不懂的回去上一节看看
http://www.nshen.net/blog/article.asp?id=394

下边是initRSO了,跟连接结构差不多
function initRSO(NC) {
//在服务器上建立myRSO.fso文件,第2个参数指定nc通道,第3个指定文件在服务器上持久保留
my_rso = SharedObject.getRemote(/"myRSO/", NC.uri, true);
my_rso.onSync = function(list) {
  //list 是一个对象数组 ,类似这种[{name:/"x/",code:/"success/"},{name:/"y/",code:/"success/"}]
//初始成功
};
my_rso.connect(NC); //连接
}

了解了吧,下边看一个完整的例子
画一个mc起名叫mc,在第一帧上写代码,

//初始化远程共享要利用nc通道
var myNC = new NetConnection();
myNC.onStatus = function(info) {
if (info.code == /"NetConnection.Connect.Success/") {
  //成功则利用此nc初始化rso
  initRSO(this);
}
};
myNC.connect(/"rtmp://localhost/test1/");
function initRSO(NC) {
my_rso = SharedObject.getRemote(/"myRSO/", NC.uri, true);
my_rso.onSync = function() {
  mc._x=this.data.x
  mc._y=this.data.y
};
my_rso.connect(NC);
}
onMouseDown = function () {
my_rso.data.x = _root._xmouse
my_rso.data.y = _root._ymouse
};

然后发布设置中设置只允许网络,发布看看现在你可以开多个播放器窗口,点其中一个,看看其他的窗口变不变,点此下载
(http://www.nshen.net/blog/attachments/200601/11_145320_test3.fla)
连接流程完。

再写一个,不知道这样能不能做网游~

mync = new NetConnection();
mync.onStatus = function(info) {
if (info.code == /"NetConnection.Connect.Success/") {
  initRSO();
}
if (info.code == /"NetConnection.Connect.Closed/") {
  trace(/"关闭/");
}
};
function initRSO() {
my_RSO = SharedObject.getRemote(/"myRSO/", mync.uri, true);
trace(my_RSO);
my_RSO.onSync = function() {
  mc._x = this.data.hero.x;
};
my_RSO.connect(mync);
}
mync.connect(/"rtmp:/my_app/test1/");
//mync.connect(/"rtmp://localhost:443/my_app/aaa/")
mc.onEnterFrame = function() {
my_RSO.data.hero.x = this._x;
if (Key.isDown(Key.LEFT)) {
  this._x -= 5;
}
if (Key.isDown(Key.RIGHT)) {
  this._x += 5;
}
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值