red5视频聊天源码

忙了好几天,最近也算把Red5服务器服务端基本搞定了。
<wbr><wbr><wbr> 为了熟悉服务端代码,以及了解API,我仿照着FMS的模式做了一个多人聊天室。基本实现了视频、群聊、私聊几个基本功能。看到网上似乎还没有人放出这类的源代码,我索性就先当回螃蟹吧!<br>   我们先来看代码:<br>   <span style="color:red">服务端:</span><br>   Application.java<br>   </wbr></wbr></wbr>

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;
import org.red5.server.api.service.IServiceCapableConnectio<wbr>n;<br> import org.red5.server.api.so.ISharedObject;<br><br> public class Application extends ApplicationAdapter {<br> // 属性<br> private IScope appScope;<br><br> private String username;<br><br> private ISharedObject listSO;<br><br> private ISharedObject msgSO;<br><br> private Map&lt;String, IConnection&gt; onLineClient = new HashMap&lt;String, IConnection&gt;();<br><br> // 方法<br> // 此应用开始运行时触发的方法<br> public boolean appStart(IScope app) {<br><wbr><wbr> if (!super.appStart(app)) {<br><wbr><wbr><wbr> return false;<br><wbr><wbr> }<br><wbr><wbr> appScope = app;<br><wbr><wbr> return true;<br> }<br><br> // 客户端连接的时候触发的方法<br> public boolean appConnect(IConnection conn, Object[] params) {<br><wbr><wbr> username = (String) params[0];<br><wbr><wbr> // 登入时将连接ID和连接信息形成对应关系并存入在线列表<br><wbr><wbr> String link_id = conn.getClient().getId();<br><wbr><wbr> onLineClient.put(username, conn);<br><wbr><wbr> // 为用户列表共享对象添加属性<br><wbr><wbr> // 创建用户列表共享对象<br><wbr><wbr> listSO = getSharedObject(appScope, "listSO", false);<br><wbr><wbr> // 创建用户聊天内容共享对象<br><wbr><wbr> msgSO = getSharedObject(appScope, "msgSO", false);<br><wbr><wbr> listSO.setAttribute(link_id, username);<br><wbr><wbr> return true;<br> }<br><br> // 广播消息<br> public void broadcastUserMsg(String msg) {<br><wbr><wbr> // 公聊<br><wbr><wbr> // 刷新共享对象属性<br><wbr><wbr> msgSO.setAttribute("msg", msg);<br> }<br><br> // 私聊信息<br> public void msgFromPrivate(String msg, String from, String to) {<br><wbr><wbr> IServiceCapableConnectio<wbr>n fc = (IServiceCapableConnectio<wbr>n) onLineClient<br><wbr><wbr><wbr><wbr> .get(from);<br><wbr><wbr> IServiceCapableConnectio<wbr>n tc = (IServiceCapableConnectio<wbr>n) onLineClient<br><wbr><wbr><wbr><wbr> .get(to);<br><wbr><wbr> fc.invoke("showMsgByPrivate", new Object[] { msg });<br><wbr><wbr> tc.invoke("showMsgByPrivate", new Object[] { msg });<br> }<br><br> // 用户断开连接的时候触发<br> public void appDisconnect(IConnection conn) {<br><wbr><wbr> String dis_link_id = conn.getClient().getId();<br><wbr><wbr> String user = (String) listSO.getAttribute(dis_link_id);<br><wbr><wbr> // 根据ID删除对应在线纪录<br><wbr><wbr> onLineClient.remove(user);<br><wbr><wbr> // 删除用户列表共享对象的对应属性<br><wbr><wbr> listSO.removeAttribute(dis_link_id);<br> }<br> }<br><br>   <span style="color:red">客户端代码:</span><br><br>   videoChat.as<br><br> package<br> {<br> import fl.controls.Button;<br> import fl.controls.List;<br> import fl.controls.TextArea;<br> import fl.controls.TextInput;<br> import fl.data.DataProvider;<br> import fl.managers.StyleManager;<br> import flash.display.Sprite;<br> import flash.events.AsyncErrorEvent;<br> import flash.events.Event;<br> import flash.events.KeyboardEvent;<br> import flash.events.MouseEvent;<br> import flash.events.NetStatusEvent;<br> import flash.events.SecurityErrorEvent;<br> import flash.events.SyncEvent;<br> import flash.media.Camera;<br> import flash.media.Microphone;<br> import flash.media.Video;<br> import flash.net.NetConnection;<br> import flash.net.NetStream;<br> import flash.net.SharedObject;<br> import flash.text.TextField;<br> import flash.text.TextFormat;<br> import flash.ui.Keyboard;<br><br><br> public class videoChat extends Sprite {<br><wbr><wbr> //属性<br><wbr><wbr> private var IP:String;<br><wbr><wbr> private var redPath:String;<br><wbr><wbr> private var nc:NetConnection;<br><wbr><wbr> private var ns:NetStream;<br><wbr><wbr> private var ns2:NetStream;<br><wbr><wbr> private var cam:Camera;<br><wbr><wbr> private var mic:Microphone;<br><wbr><wbr> private var listSO:SharedObject;<br><wbr><wbr> private var msgSO:SharedObject;<br><wbr><wbr> private var userArr:Array;<br><wbr><wbr> private var sendMsg:String;<br><wbr><wbr> private var now:Date;<br><wbr><wbr> private var userIDObj:Object;<br><wbr><br><wbr><wbr> //构造函数<br><wbr><wbr> public function videoChat() {<br><wbr><wbr><wbr> _init();<wbr><wbr><wbr><wbr><wbr><wbr> //初始化<br><wbr><wbr><wbr> _setComponentStyle();<wbr><wbr><wbr> //设置组件样式<br><wbr><wbr><wbr> _startConnect();<wbr><wbr><wbr><wbr> //开始连接服务器<br><wbr><wbr> }<br><wbr><br><wbr><wbr> //初始化<br><wbr><wbr> private function _init() {<br><wbr><wbr><wbr> IP = "192.168.0.10";<br><wbr><wbr><wbr> redPath = "rtmp://" + IP + "/videoChat";<br><wbr><wbr><wbr> nc = new NetConnection();<br><wbr><wbr><wbr> from.text = "guest" + int(Math.random() * 1000);<br><wbr><wbr><wbr> to.text = "所有人";<br><wbr><wbr><wbr> now = new Date();<br><wbr><wbr> }<br><wbr><br><wbr><wbr> //设置组件样式<br><wbr><wbr> private function _setComponentStyle() {<br><wbr><wbr><wbr> var myTF:TextFormat = new TextFormat();<br><wbr><wbr><wbr> myTF.size = 12;<br><wbr><wbr><wbr> myTF.font = "雅黑宋体";<br><wbr><wbr><wbr> StyleManager.setStyle("textFormat", myTF);<br><wbr><wbr> }<br><wbr><br><wbr><wbr> //开始连接<br><wbr><wbr> private function _startConnect() {<br><wbr><wbr><wbr> nc.addEventListener(NetStatusEvent.NET_STATUS, _statusHandler);<br><wbr><wbr><wbr> nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, _securityHandler);<br><wbr><wbr><wbr> nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, _asyncHandler);<br><wbr><wbr><wbr> nc.connect(redPath, from.text);<br><wbr><wbr><wbr> nc.client = this;<br><wbr><wbr> }<br><wbr><br><wbr><wbr> //状态监听<br><wbr><wbr> private function _statusHandler(evt:NetStatusEvent) {<br><wbr><wbr><wbr> if (evt.info.code == "NetConnection.Connect.Success") {<br><wbr><wbr><wbr><wbr> chatCon.text += "连接成功!/n";<br><wbr><wbr><wbr><wbr> _scrollToEnd();<br><wbr><wbr><wbr><wbr> _publishVideo();<wbr><wbr><wbr><wbr> //发布自己的视频<br><wbr><wbr><wbr><wbr> _setListSO();<wbr><wbr><wbr><wbr><wbr> //创建用户列表共享对象<br><wbr><wbr><wbr><wbr> _setMsgSO();<wbr><wbr><wbr><wbr><wbr> //创建发言信息共享对象<br><wbr><wbr><wbr><wbr> sendBtn.addEventListener(MouseEvent.CLICK, _sendBtnByClick);<wbr><wbr> //单击发送信息<br><wbr><wbr><wbr><wbr> stage.addEventListener(KeyboardEvent.KEY_DOWN, _sendBtnByKey);<wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值