版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、RED5將所有的應(yīng)用程序都放在RED5根目錄下的”webapps“目錄。你需要為所創(chuàng)建的程序在webapps目錄下添加相應(yīng)的目錄。在你的應(yīng)用程序目錄里應(yīng)該有一個(gè)名為”WEB-INF“的目錄,用來(lái)存放你的程序的配置文件。在”doc/templates/myapp“目錄有一個(gè)模板,可以用來(lái)幫你完成建立程序的初始工作。RED5啟動(dòng)的時(shí)候,在”webapps”目錄的程序文件都是搜索”WEB-INF”的目錄下的配置文件來(lái)完成配置的。最主要的配置文件是”web.xml”。這個(gè)文件里包含了以下參數(shù):globalScope:指定全局作用范圍1. <context-param> 2. <par
2、am-name>globalScope</param-name> 3. <param-value>default</param-value> 4. </context-param> contextConfigLocation:指定配置handler的文件的位置。這些配置文件描述了客戶端加入/離開(kāi)的動(dòng)作觸發(fā)后調(diào)用的處理方法,作用范圍。在描述的時(shí)候可以使用通配符來(lái)描述多個(gè)文件:1. <context-param> 2. <param-name>contextConfigLocation</param-name>
3、; 3. <param-value>/WEB-INF/red5-*.xml</param-value> 4. </context-param> locatorFactorySelector:程序的根上下文,通常是”red5.xml”1. <context-param> 2. <param-name>locatorFactorySelector</param-name> 3. <param-value>red5.xml</param-value> 4. </context-param> p
4、arentContextKey:父級(jí)上下文,通常是”default.context”1. <context-param> 2. <param-name>parentContextKey</param-name> 3. <param-value>default.context</param-value> 4. </context-param> log4jConfigLocation:日志配置文件的位置1. <context-param> 2. <param-name>log4jConfigLocati
5、on</param-name> 3. <param-value>/WEB-INF/perties</param-value> 4. </context-param> webAppRootKey:程序的全局唯一名1. <context-param> 2. <param-name>webAppRootKey</param-name> 3. <param-value>/myapp</param-value> 4. </context-param> 對(duì)于每一個(gè)Han
6、dler配置文件最少需要有三個(gè)beanContext:用來(lái)影射路徑到某個(gè)作用范圍、搜索服務(wù)和Handler,它有一個(gè)保留的名字”web.context”。 其默認(rèn)的類為org.red5.server.Context1. <bean id=“web.context“ class=“org.red5.server.Context“ 2. autowire=“byType“ /> 對(duì)于沒(méi)有一個(gè)應(yīng)用程序只應(yīng)該有一個(gè)Context,但是同一個(gè)Context可以被多個(gè)作用范圍共享Scope:每一個(gè)應(yīng)用程序最少有一個(gè)作用范圍,用來(lái)將handler連接到context和服務(wù)器。作用范圍可以建立一棵
7、樹(shù),每一個(gè)客戶端連接到樹(shù)上的一個(gè)節(jié)點(diǎn),而共享對(duì)象存在于作用范圍里??梢园炎饔梅秶醋魇橇奶焓一蛘叱绦?qū)嵗DJ(rèn)的作用范圍通常是web.scope,不過(guò)這名字是可以任意取的。對(duì)于bean有以下屬性:server:與全局服務(wù)器”red5.server”相關(guān)。parent:指定當(dāng)前作用范圍的父范圍,通常是”global.scope”context:當(dāng)前作用范圍的服務(wù)器上下文,一般指定為”web.context”handler:對(duì)應(yīng)當(dāng)前作用范圍的handlercontextPath:用來(lái)連接到當(dāng)前作用范圍的路徑virtualHosts:一個(gè)主機(jī)名或IP的列表,用來(lái)描述虛擬主機(jī)的位置,列表項(xiàng)目之間用逗號(hào)
8、分隔開(kāi)。1. <bean id=“web.scope“ class=“org.red5.server.WebScope“ 2. init-method=“register“> 3. <property name=“server“ ref=“red5.server“ /> 4. <property name=“parent“ ref=“global.scope“ /> 5. <property name=“context“ ref=“web.context“ /> 6. <property name=“handler“ ref=“web.ha
9、ndler“ /> 7. <property name=“contextPath“ value=“/myapp“ /> 8. <property name=“virtualHosts“ value=“l(fā)ocalhost, “ /> 9. </bean> 為了應(yīng)用程序配置方便的需要,可以將”contextPath“和”virtualHosts“放到另外一個(gè)單獨(dú)的屬性文件里邊,而在這里使用變量來(lái)表示,為此需要添加一個(gè)特別的bean來(lái)指定屬性文件的位置。1. <bean id=“placeholderConfig“ class=“or
10、g.springframework.beans.factory.config.PropertyPlaceholderConfigurer“> 2. <property name=“l(fā)ocation“ value=“/WEB-INF/perties“ /> 3. </bean> 假設(shè)在屬性文件perties里有如下的數(shù)據(jù):1. webapp.contextPath=/myapp 2. webapp.virtualHosts=localhost, 則上邊的bean的”contextPath“和”vir
11、tualHosts“屬性即可使用變量來(lái)指定值1. <property name=“contextPath“ value=“ /> 2. <property name=“virtualHosts“ value=“ /> 對(duì)于”contextPath“可以視為是一個(gè)根作用范圍。你可以在配置好的”contextPath“路徑后邊隨意添加其他的路徑,而連接到這些路徑的客戶端將動(dòng)態(tài)創(chuàng)建另外的作用范圍,這些作用范圍使用的是同樣的handler,但擁有自己的屬性、共享對(duì)象和活動(dòng)流。handler:每一個(gè)上下文需要一個(gè)handler來(lái)響應(yīng)用戶連接、離開(kāi)作用范圍時(shí)的動(dòng)作,handler實(shí)
12、現(xiàn)了很多方法,用戶可以調(diào)用以達(dá)到特定的目的。這個(gè) handler必須實(shí)現(xiàn)”org.red5.server.api.IScopeHandler“接口,當(dāng)然針對(duì)共享對(duì)象和流的訪問(wèn)還應(yīng)該實(shí)現(xiàn)其他的接口。在”org.red5.server.adapter.ApplicationAdapter“可以找到一個(gè)能夠用作基類的例子,同時(shí)還應(yīng)該多多參照文檔以得到更多細(xì)節(jié)。某個(gè)作用范圍的handler可以如下指定:1. <bean id=“web.handler“ 2. class=“the.path.to.my.Application“ 3. singleton=“true“ /> 其中”id“屬性
13、是上邊定義的作用范圍里指定的。如果你不需要任何服務(wù)端的邏輯處理,可以使用Red5默認(rèn)提供的handler1. <bean id=“web.handler“ 2. class=“org.red5.server.adapter.ApplicationAdapter“ 3. singleton=“true“ /> handler的例子1. package the.path.to.my; 2. import org.red5.server.adapter.ApplicationAdapter; 3. public class Application extends ApplicationA
14、dapter 4. public Double add(Double a, Double b) 5. return a + b; 6. 7. 這里假設(shè)使用上邊的配置,則在客戶端調(diào)用的時(shí)候使用以下方式1. nc = new NetConnection(); 2. nc.connect(“rtmp:/localhost/myapp“); 3. nc.onResult = function(obj) 4. trace(“The result is “ + obj); 5. 6. nc.call(“add“, nc, 1, 2); 返回因該有輸出:The result is 3/基于red5的在線視頻
15、錄制實(shí)例和詳細(xì)注釋最近在學(xué)校做畢業(yè)設(shè)計(jì)頂著壓力,昨天晚上研究了一個(gè)晚上red5和as3發(fā)現(xiàn)還是蠻有意思的red5和fms都是個(gè)不錯(cuò)的東西,發(fā)現(xiàn)在壓力下學(xué)東西學(xué)起來(lái)特別快哈/預(yù)定義聲明import mx.utils.Delegate;/創(chuàng)建一個(gè)基本的網(wǎng)絡(luò)連接對(duì)象var nc:NetConnection = new NetConnection();/連接到本地的Red5服務(wù)器nc.connect("rtmp:/localhost/online");/將已和red5服務(wù)器建立連接的nc傳遞給NetStreamvar ns:NetStream = new NetStream(nc)
16、;/從攝像頭和麥克風(fēng)取得信息var cam:Camera = Camera.get();var mic:Microphone = Microphone.get();/初始化攝像頭和麥克風(fēng),調(diào)用函數(shù)setupCameraMic();/保存上次錄制的內(nèi)容,并進(jìn)行清空var lastVideoName:String = ""/監(jiān)聽(tīng)開(kāi)始錄制和停止錄制兩個(gè)按鍵的點(diǎn)擊動(dòng)作并進(jìn)行相應(yīng)的處理playButton.addEventListener("click", Delegate.create(this, playClick);stopButton.addEventLi
17、stener("click", Delegate.create(this, stopClick);/定義開(kāi)始錄制的playclick函數(shù)function playClick():Void/此flv文件是保存在 webapps/oflaDemo/streams/文件夾/將攝像頭和麥克風(fēng)賦給nsns.attachVideo(cam);ns.attachAudio(mic);/將攝像頭信息賦給視頻顯示窗口,這樣我們可以即時(shí)看到信息videoContainer.attachVideo(cam);/ 此處是定義存儲(chǔ)名字的,用隨機(jī)數(shù)目獲得一個(gè)唯一的文件名lastVideoName =
18、"red5RecordDemo_" + random(getTimer();ns.publish(lastVideoName, "record");/鎖定開(kāi)始按鍵使其失效playButton.enabled = false;/鎖定停止按鍵使其生效stopButton.enabled = true;function stopClick():Void/關(guān)閉ns與red5的連接ns.close();/并清空視頻顯示窗口videoContainer.attachVideo(null);videoContainer.clear();/鎖定開(kāi)始按鍵使其生效playB
19、utton.enabled = true;/鎖定停止按鍵使其失效stopButton.enabled = false;/播放已經(jīng)錄制的視頻playLastVideo();function playLastVideo():Void/ 傳遞錄制的視頻信息給視屏顯示窗口videoContainer.attachVideo(ns);/回訪已經(jīng)上次錄制的視頻片段ns.play(lastVideoName);function setupCameraMic():Void/啟動(dòng)攝像頭cam = Camera.get();/設(shè)置尺寸cam.setMode(320, 240, 30);/設(shè)置錄制質(zhì)量cam.set
20、Quality(0,70);/啟動(dòng)麥克風(fēng)mic = Microphone.get();mic.setRate(44);/公司今天需要裝一臺(tái)RED5的服務(wù)器用來(lái)開(kāi)發(fā)程序。發(fā)現(xiàn)RED5的0.6已經(jīng)正式放出,以前我寫過(guò)一篇關(guān)于用SVN進(jìn)行抽取,然后建立RED5項(xiàng)目的文 章。而對(duì)于一般的開(kāi)發(fā)者來(lái)說(shuō),不需要去修改RED5本身的程序,只需要建立自己的應(yīng)用程序就可以了?,F(xiàn)在把建立過(guò)程記錄下來(lái),希望對(duì)各位有所幫助。本文適 合第一次接觸RED5(WIN平臺(tái)下),而不知道如何開(kāi)始建立自己的應(yīng)用程序的用戶。流程:1.下載最新版本的RED5 /red52.安裝RED5,注意
21、在安裝RED5前要先安裝好JRE,安裝RED5的時(shí)候會(huì)要求指定JRE的目錄的。3.到RED5的安裝目錄,找到doc/templates目錄,該目錄中存放了一個(gè)標(biāo)準(zhǔn)的RED5應(yīng)用程序模版myapp,將其復(fù)制到RED5安裝目錄 中的webapps目錄下,并改名為你喜歡的文件夾名,比如你要開(kāi)發(fā)一個(gè)聊天的程序,那么可以把myapp改為myChat,這個(gè)名字就是以后你要連接的 服務(wù)名了。4.在WEB-INF中新建一個(gè)文件夾src用來(lái)存放程序的源代碼,新建一個(gè)classes文件夾用來(lái)存放編譯后的文件。5.打開(kāi)Eclipse,將工作區(qū)指定為RED5安裝目錄下webapps,然后新建一個(gè)項(xiàng)目,項(xiàng)目名為myCh
22、at.這個(gè)時(shí)候你應(yīng)該發(fā)現(xiàn)剛才 myChat中的文件都被加載進(jìn)來(lái)了,我們首先把src目錄指定為源代碼目錄,右鍵選擇src,在彈出的菜單中選擇Build Path->Use as Source Folder,即將其指定為代碼文件夾。接下來(lái)要指定項(xiàng)目的目標(biāo)目錄,在項(xiàng)目名上右鍵選擇Properties,選擇Java Bulid Path,在選擇Source標(biāo)簽,在下面的Browse中選擇Classes目錄,將其指定為目標(biāo)目錄。然后選擇Libraries,點(diǎn)擊Add External JARs,將RED5安裝目錄下的red5.jar包含進(jìn)來(lái)。6.這個(gè)時(shí)候,在Eclipse的左邊應(yīng)該多了WEB-IN
23、F/src這樣一個(gè)東東,我們將要在這里開(kāi)始寫入我們的第一個(gè)項(xiàng)目代碼。右鍵選擇它,在彈出的 菜單中選擇New->Package,新建一個(gè)包,舉例,包名可以為org.d5.first,然后再在生成的org.d5.first這個(gè)包上繼 續(xù)右鍵選擇New->File,輸入文件名Application.java。并在建好的文件中輸入以下代碼:package org.d5.first;import org.red5.server.adapter.ApplicationAdapter;public class Application extends ApplicationAdapter publ
24、ic String login()return "Welcome to Chat Servers"7.進(jìn)行配置。編輯WEB-INF下的red5-web.xml,找到bean id=”web.handler”一句,將class=”XXX”中的XXX位置修改為org.d5.first.Application,這樣本程序?qū)?以剛才寫的Application來(lái)運(yùn)行。刪除后面的bean id=”server.handler整句,因?yàn)槲覀儠簳r(shí)用不到這個(gè)東東。編輯web.xml,找到webAppRootKey,將其下面的 param-value標(biāo)簽中的值修改為/myChat。編輯red5
25、-perties,將第一句修改為 webapp.contextPath=/myChat8.編譯項(xiàng)目9.重新啟動(dòng)RED5服務(wù)器10.在FLASH中新建一個(gè)文件,輸入以下代碼:import .NetConnection;import .Responder;var responder:Responder = new Responder(chat);var nc:NetConnection = new NetConnection();nc.connect("rtmp:/localhost/mytest");nc.addEventListener(NetStatusEv
26、ent.NET_STATUS,statusHandler);function chat(obj:Object):void trace(obj);function statusHandler(event:NetStatusEvent):void trace(.code); switch (.code) case "NetConne
27、ction.Connect.Success": trace("The connection was made successfully"); break; case "NetConnection.Connect.Rejected":
28、0; trace ("sorry, the connection was rejected"); break; case "NetConnection.Connect.Failed": &
29、#160; trace("Failed to connect to server."); break; nc.call("login",responder);運(yùn)行程序,顯示結(jié)果為Welcome to Chat Servers。第一個(gè)RED5應(yīng)用程序誕生了,呵呵:)/忙了好幾天,最近也算把Red5服務(wù)器服務(wù)端基本搞 定了。 為了熟悉服務(wù)端代碼,以及了解API,我仿照著FMS的模式做了一個(gè)多人聊天室。基
30、本實(shí)現(xiàn)了視頻、群聊、私聊幾個(gè)基本功能。看到網(wǎng)上似乎還沒(méi)有人放出這類 的源代碼,我索性就先當(dāng)回螃蟹吧! 我們先來(lái)看代 碼: 服務(wù)端: Application.java package org.jerry.videochat; import java.util.*; import org.red5.server.adapter.ApplicationAdapter; import org.red5.server.api.IConnection; import org.red5.server.api.IScope;
31、60;import org.red5.server.api.service.IServiceCapableConnection; import org.red5.server.api.so.ISharedObject; public class Application extends ApplicationAdapter / 屬性 private IScope appScope; private String username; private ISharedObject listSO; private ISharedOb
32、ject msgSO; private Map<String, IConnection> onLineClient = new HashMap<String, IConnection>(); / 方法 / 此應(yīng)用開(kāi)始運(yùn)行時(shí)觸發(fā)的方法 public boolean appStart(IScope app) if (!super.appStart(app) return false; appScope = app; return true; / 客戶端連接的
33、時(shí)候觸發(fā)的方法 public boolean appConnect(IConnection conn, Object params) username = (String) params0; / 登入時(shí)將連接ID和連接信息形成對(duì)應(yīng)關(guān)系并存入在線列表 String link_id = conn.getClient().getId(); onLineClient.put(username, conn); / 為用戶列表共享對(duì)象添加屬性 / 創(chuàng)建用戶列表共享對(duì)象 listSO = getSharedObject(app
34、Scope, "listSO", false); / 創(chuàng)建用戶聊天內(nèi)容共享對(duì)象 msgSO = getSharedObject(appScope, "msgSO", false); listSO.setAttribute(link_id, username); return true; / 廣播消息 public void broadcastUserMsg(String msg) / 公聊 / 刷新共享對(duì)象屬性 msgSO.setAttribute(&
35、quot;msg", msg); / 私聊信息 public void msgFromPrivate(String msg, String from, String to) IServiceCapableConnection fc = (IServiceCapableConnection) onLineClient .get(from); IServiceCapableConnection tc = (IServiceCapableConnection) onLineClient .get(to);
36、fc.invoke("showMsgByPrivate", new Object msg ); tc.invoke("showMsgByPrivate", new Object msg ); / 用戶斷開(kāi)連接的時(shí)候觸發(fā) public void appDisconnect(IConnection conn) String dis_link_id = conn.getClient().getId(); String user = (String) listSO.getAttribute(dis_
37、link_id); / 根據(jù)ID刪除對(duì)應(yīng)在線紀(jì)錄 onLineClient.remove(user); / 刪除用戶列表共享對(duì)象的對(duì)應(yīng)屬性 listSO.removeAttribute(dis_link_id); 客戶端代碼: videoChat.as package import fl.controls.Button; import fl.controls.List; import fl.controls.TextArea; import fl.c
38、ontrols.TextInput; import fl.data.DataProvider; import fl.managers.StyleManager; import flash.display.Sprite; import flash.events.AsyncErrorEvent; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.events
39、.NetStatusEvent; import flash.events.SecurityErrorEvent; import flash.events.SyncEvent; import flash.media.Camera; import flash.media.Microphone; import flash.media.Video; import .NetConnection; import .NetStream; import .SharedObject; import flash.text.T
40、extField; import flash.text.TextFormat; import flash.ui.Keyboard; /* * . Red5 視頻聊天 . * author Jerry */ public class videoChat extends Sprite /屬性 private var IP:String; private var redPath:String; private var nc:NetConnection; private var n
41、s:NetStream; private var ns2:NetStream; private var cam:Camera; private var mic:Microphone; private var listSO:SharedObject; private var msgSO:SharedObject; private var userArr:Array; private var sendMsg:String; private var now:Date; private var userIDObj
42、:Object; /構(gòu)造函數(shù) public function videoChat() _init(); /初始化 _setComponentStyle(); /設(shè)置組件樣式 _startConnect(); /開(kāi)始連接服務(wù)器 /初始化 private function _init() IP = "0"
43、160;redPath = "rtmp:/" + IP + "/videoChat" nc = new NetConnection(); from.text = "guest" + int(Math.random() * 1000); to.text = "所有人" now = new Date(); /設(shè)置組件樣式 private function _setComponentStyle() var myTF:TextFormat
44、= new TextFormat(); myTF.size = 12; myTF.font = "雅黑宋體" StyleManager.setStyle("textFormat", myTF); /開(kāi)始連接 private function _startConnect() nc.addEventListener(NetStatusEvent.NET_STATUS, _statusHandler); nc.addEventListener(SecurityErrorEven
45、t.SECURITY_ERROR, _securityHandler); nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, _asyncHandler); nc.connect(redPath, from.text); nc.client = this; /狀態(tài)監(jiān)聽(tīng) private function _statusHandler(evt:NetStatusEvent) if (.code = "NetConnection.Connect.Succe
46、ss") chatCon.text += "連接成功!n" _scrollToEnd(); _publishVideo(); /發(fā)布自己的視頻 _setListSO(); /創(chuàng)建用戶列表共享對(duì)象 _setMsgSO(); /創(chuàng)建發(fā)言信息共享對(duì)象 sendBtn.addEventListener(MouseEvent.CLICK, _sen
47、dBtnByClick); /單擊發(fā)送信息 stage.addEventListener(KeyboardEvent.KEY_DOWN, _sendBtnByKey); /回車發(fā)送信息 if (.code = "NetConnection.Connect.Failed") chatCon.text += "連接失敗!n" _scrollToEnd(); if (.code =
48、"NetConnection.Connect.Closed") chatCon.text += "連接關(guān)閉!n" _scrollToEnd(); /安全性監(jiān)聽(tīng) private function _securityHandler(evt:SecurityError) chatCon.text += "安全性錯(cuò)誤!n" _scrollToEnd(); /異步錯(cuò)誤 private function _asyncHandle
49、r(evt:AsyncErrorEvent) chatCon.text += "異步錯(cuò)誤!n" _scrollToEnd(); /發(fā)布自己的視頻 private function _publishVideo() ns = new NetStream(nc); cam = Camera.getCamera(); mic = Microphone.getMicrophone(); liveVideo.attachCamera(cam); ns.client = this;&
50、#160;ns.addEventListener(NetStatusEvent.NET_STATUS, _statusHandler); ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, _asyncHandler); ns.attachCamera(cam); ns.attachAudio(mic); ns.publish(from.text, "live"); whoseVideo.text = from.text + "的視頻"
51、/創(chuàng)建用戶列表共享對(duì)象 private function _setListSO() listSO = SharedObject.getRemote("listSO", nc.uri, false); listSO.connect(nc); listSO.addEventListener(SyncEvent.SYNC, _listSOSyncHandler); /創(chuàng)建發(fā)言信息共享對(duì)象 private function _setMsgSO() msgSO = SharedObject.getR
52、emote("msgSO", nc.uri, false); msgSO.addEventListener(SyncEvent.SYNC, _msgSOSyncHandler); msgSO.connect(nc); /用戶列表共享對(duì)象被更新之后事件 private function _listSOSyncHandler(evt:SyncEvent) _showUserList(); /更新用戶列表 /用戶列表添加鼠標(biāo)事件 userList.a
53、ddEventListener(MouseEvent.CLICK, _updateChatTo); userList.addEventListener(MouseEvent.DOUBLE_CLICK, _updateVideoShow); /發(fā)言信息共享對(duì)象被更新之后事件 private function _msgSOSyncHandler(evt:SyncEvent) /更新聊天內(nèi)容 for (var i in msgSO.data) chatCon.htmlText += msgSO.datai;
54、60; /更新用戶列表 private function _showUserList() userArr = new Array(); /用戶數(shù)組更新 for (var tmp in listSO.data) userArr.push(listSO.datatmp); /添加DataProvider var tmpDP:DataProvider = new DataProvider(); for (var i = 0; i < userArr.length; i+ ) t
55、mpDP.addItem( label:userArri ); /名稱排序 tmpDP.sortOn("label"); /在用戶列表頂端加一個(gè)“所有人” tmpDP.addItemAt( label:"所有人" , 0); /將數(shù)組添加到列表中顯示出來(lái) userList.dataProvider = tmpDP; /更新聊天對(duì)象 private function _updateChatTo(evt:MouseEvent) to.text
56、= userList.selectedItem.label; /更新視頻顯示和視頻文本顯示 private function _updateVideoShow(evt:MouseEvent) ns2 = new NetStream(nc); if (from.text = to.text) /顯示我的視頻 ns2.close(); liveVideo.clear(); whoseVideo.text = "我的視頻" liveVideo.attachCamera(cam
57、); else /顯示其他人的視頻 whoseVideo.text = to.text + "的視頻" ns2.client = this; ns2.addEventListener(NetStatusEvent.NET_STATUS, _statusHandler); ns2.addEventListener(AsyncErrorEvent.ASYNC_ERROR, _asyncHandler); liveVideo.attachNetStream(ns2); ns2.play(
58、to.text); /單擊發(fā)送信息 private function _sendBtnByClick(evt:MouseEvent) _sendMsg(); /回車發(fā)送信息 private function _sendBtnByKey(evt:KeyboardEvent) if (evt.keyCode = Keyboard.ENTER) _sendMsg(); /發(fā)送信息處理方法 private function _sendMsg() &
59、#160;sendMsg="<font color='#ff0000'>" + from.text + "</font>" + " 對(duì) " + "<font color='#ff0000'>" + to.text + "</font>" + " 說(shuō) " + "(" + "<font color='#0000ff'>" + now.
60、getHours() + ":" + (now.getMinutes() < 10?"0" + now.getMinutes():now.getMinutes() + ":" + (now.getSeconds() < 10?"0" + now.getSeconds():now.getSeconds() + "</font>" + ")" + ":" +"t" + msgInput.text + "n&
61、quot; if (from.text = to.text) /禁止對(duì)自己發(fā)言 chatCon.text += "對(duì)不起,您不能對(duì)自己發(fā)言!" _scrollToEnd(); else if(msgInput.text="") /發(fā)言不能為空 chatCon.text += "請(qǐng)?jiān)谙旅娴奈谋究蛑休斎氚l(fā)言內(nèi)容!" _scrollToEnd(); else if (to.text = "所有人")
62、60;/調(diào)用服務(wù)端廣播方法 nc.call("broadcastUserMsg", null, sendMsg); msgInput.text = "" else /私聊 nc.call("msgFromPrivate", null, sendMsg, from.text, to.text); msgInput.text = "" /將滾動(dòng)條滾動(dòng)到最底端 private function _scro
63、llToEnd() chatCon.verticalScrollPosition = chatCon.maxVerticalScrollPosition; /私聊方法(被服務(wù)端調(diào)用) public function showMsgByPrivate(_msg:String) chatCon.htmlText += _msg; _scrollToEnd(); /最近要做一個(gè)流媒體服務(wù)器,在網(wǎng)上逗留了好久決定選擇red5。但是網(wǎng)上中文資料很少視頻資料更是不敢奢望,只有啃一些英文文檔了, 廢
64、話少說(shuō)直奔主題>>> 我用到的軟件有: 1. JdkvforWindows; 2. setup-Red5-0.7.0.exe(這個(gè)從官網(wǎng)下載http:
65、//red5/070final速度比較慢); 3. eclipse(英文版-下載原名是eclipse-jee-galileo-SR1-win32.zip) 4.&
66、#160;Flash8-chs.exe(這個(gè)很好下,到就可找到)操作流程:第一步> 安裝jdk: 我的jdk安裝目錄是C:Javajdk1.6.0_05安裝時(shí)手動(dòng)改的,jre的目錄是默認(rèn)的C:Program FilesJavajre1.6.0_05。第二步> 配置jdk的環(huán)境變量:
67、環(huán)境變量的配置,網(wǎng)上到處都有,我在這里就不啰嗦了只是把配置的參數(shù)貼這里:JAVA_HOME >>“C:Javajdk1.6.0_05”; CLASSPATH>>“.;%JAVA_HOME%lib;%JAVA_HOME%libtools.jar;%JAVA_HOME%libdt.jar;”; Path>&g
68、t;“;%JAVA_HOME%bin;%JAVA_HOME%jrebin;”;第三步> 安裝red5: red5的安裝其實(shí)很簡(jiǎn)單,一直默認(rèn)就好了,C:Program FilesRed5;第四步> 解壓eclipse: 把eclipse解壓到任意的目錄都沒(méi)關(guān)系;第五步> 配置red5:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度建筑防水工程防水材料研發(fā)與市場(chǎng)調(diào)研合同
- 金華浙江金華市交通工程管理中心招聘編外人員筆試歷年參考題庫(kù)附帶答案詳解
- 遼寧2025年渤海大學(xué)招聘高層次人才92人筆試歷年參考題庫(kù)附帶答案詳解
- 湖南2025年湖南省生態(tài)環(huán)境廳直屬事業(yè)單位招聘44人筆試歷年參考題庫(kù)附帶答案詳解
- DB2103-T 008-2023 消防技術(shù)服務(wù)機(jī)構(gòu)從業(yè)規(guī)范
- 沈陽(yáng)2025年遼寧沈陽(yáng)遼中區(qū)四家事業(yè)單位面向區(qū)內(nèi)事業(yè)單位遴選18人筆試歷年參考題庫(kù)附帶答案詳解
- 常州2025年江蘇常州工學(xué)院高層次人才招聘60人(長(zhǎng)期)筆試歷年參考題庫(kù)附帶答案詳解
- 2025年中國(guó)兩側(cè)擋渣器市場(chǎng)調(diào)查研究報(bào)告
- 2025年語(yǔ)音電路項(xiàng)目可行性研究報(bào)告
- 2025年耐高溫硅橡膠項(xiàng)目可行性研究報(bào)告
- 2025年電力鐵塔市場(chǎng)分析現(xiàn)狀
- GB 12158-2024防止靜電事故通用要求
- 《教育強(qiáng)國(guó)建設(shè)規(guī)劃綱要(2024-2035年)》全文
- 山東省濱州市2024-2025學(xué)年高二上學(xué)期期末地理試題( 含答案)
- 體育老師籃球說(shuō)課
- 化學(xué)-江蘇省蘇州市2024-2025學(xué)年2025屆高三第一學(xué)期學(xué)業(yè)期末質(zhì)量陽(yáng)光指標(biāo)調(diào)研卷試題和答案
- 蛋雞生產(chǎn)飼養(yǎng)養(yǎng)殖培訓(xùn)課件
- 運(yùn)用PDCA降低住院患者跌倒-墜床發(fā)生率
- 海底撈員工手冊(cè)
- 2024CSCO小細(xì)胞肺癌診療指南解讀
- 立春氣象與生活影響模板
評(píng)論
0/150
提交評(píng)論