1、51CTO下载Flex+Red5语音视频聊天程序实现Flex+Red5语音视频聊天程序实现2010-12-06 09:30:32|分类: 程序代码 |标签:red5 |字号大中小订阅 java代码部分package first;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;import org.red5.server.adapter.ApplicationAdapter;import org.red5.server.api.IConnection;impo
2、rt org.red5.server.api.IScope;import org.red5.server.api.Red5;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 ISharedOb
3、ject listSO;private Map onlineList = new HashMap();/ 在线用户表/程序运行时志向public boolean appStart(IScope app) if (!super.appStart(app) return false; appScope = app; return true; Overridepublic boolean appConnect(IConnection arg0, Object arg1) /* * 用户首次连接server 时触发,检查用户是否重复登录,将用户添加到在线用户表中 */String userId=arg
4、0.getClient().getId();if(!super.appConnect(arg0, arg1)return false;if (arg1 != null ) userName = (String) arg10;if(onlineList.get(userName) != null)rejectClient(请不要重复登录);return false;onlineList.put(userName, arg0);listSO = getSharedObject(appScope, listSO, false);listSO.setAttribute(userId, userName
5、); System.out.println(The user:+userName+,+userName+ logined successfully);return true;/* * 通知所有人当前用户登录 * param params */public void getOnloadUser(Object params) String clientName = params0.toString();if(null = clientName | .equals(clientName) return ; /给所有客户端数据 IScope scope = Red5.getConnectionLoca
6、l().getScope(); Iterator it = scope.getConnections().iterator(); for (;it.hasNext();) Set connections = (Set)it.next(); IConnection tempConn = (IConnection)connections.iterator().next(); if (tempConn instanceof IServiceCapableConnection) IServiceCapableConnection sc = (IServiceCapableConnection) tem
7、pConn; sc.invoke(result_getOnloadUser, new ObjectclientName); /聊天 public void sayToAll(Object params) IConnection conn = Red5.getConnectionLocal(); String user_id = conn.getClient().getId(); String clientName =(String) listSO.getAttribute(user_id); System.out.println(*发言者是:+clientName); String sayTo
8、Name=params0=null?:params0.toString().trim(); String sayWhat=params1=null?:params1.toString().trim(); if(.equals(sayToName)|All.equals(sayToName)/ 发消息给聊天室的所有人. IScope scope = Red5.getConnectionLocal().getScope(); Iterator it = scope.getConnections().iterator(); for (;it.hasNext();) Set connections =
9、 (Set)it.next(); IConnection tempConn = (IConnection)connections.iterator().next(); if (tempConn instanceof IServiceCapableConnection) IServiceCapableConnection sc = (IServiceCapableConnection) tempConn; / 调用客户端showMessage方法。 sc.invoke(showMessage, new ObjectclientName+ to All:+sayWhat); else IConne
10、ction tempConn=onlineList.get(sayToName); if (tempConn instanceof IServiceCapableConnection) IServiceCapableConnection sc = (IServiceCapableConnection) tempConn; sc.invoke(showMessage, new ObjectclientName+ to +sayToName+:+sayWhat); IServiceCapableConnection sc = (IServiceCapableConnection) conn; sc
11、.invoke(showMessage, new ObjectclientName+ to +sayToName+:+sayWhat); / 用户断开连接的时候触发 public void appDisconnect(IConnection conn) String dis_user_id = conn.getClient().getId(); String user = (String) listSO.getAttribute(dis_user_id); / 根据ID删除对应在线纪录 onlineList.remove(user); / 删除用户列表共享对象的对应属性 listSO.remo
12、veAttribute(dis_user_id); IScope scope = Red5.getConnectionLocal().getScope(); Iterator it = scope.getConnections().iterator(); for (;it.hasNext();) Set connections = (Set)it.next(); IConnection tempConn = (IConnection)connections.iterator().next(); if (tempConn instanceof IServiceCapableConnection)
13、 IServiceCapableConnection sc = (IServiceCapableConnection) tempConn; / 服务器端调用客户端flash方法。 sc.invoke(disconnectMessage, new Objectuser); /视频邀请 public void videoInvite(Object params) IConnection conn = Red5.getConnectionLocal(); String user_id = conn.getClient().getId(); String clientName =(String) li
14、stSO.getAttribute(user_id); System.out.println(*视频邀请者是:+clientName); String sayToName=params0=null?:params0.toString().trim(); if(.equals(sayToName)|All.equals(sayToName)/ 发消息给聊天室的所有人. System.out.println(不可以邀请0或者多个人); else IConnection tempConn=onlineList.get(sayToName); if (tempConn instanceof IServ
15、iceCapableConnection) IServiceCapableConnection sc = (IServiceCapableConnection) tempConn; sc.invoke(showInviteMessage, new ObjectclientName+;+sayToName); /同意邀请后调用邀请方方法 public void agreeVideoInvite(Object params) IConnection conn = Red5.getConnectionLocal(); System.out.println(params length+params.l
16、ength); /邀请者 String inviteUserName=params0=null?:params0.toString().trim(); /被邀请者 String otherUserName=params1=null?:params1.toString().trim(); System.out.println(*邀请者是:+inviteUserName); System.out.println(*被邀请者是:+otherUserName); if(.equals(inviteUserName)/ 发消息给聊天室的所有人. System.out.println(出错了); else
17、 System.out.println(*调用成功); IConnection tempConn=onlineList.get(inviteUserName); if (tempConn instanceof IServiceCapableConnection) IServiceCapableConnection sc = (IServiceCapableConnection) tempConn; sc.invoke(showVideo, new ObjectotherUserName); System.out.println(*调用结束); Flex3代码部分!CDATAimport mx.
18、events.CloseEvent;import mx.collections.ArrayCollection;import mx.controls.Alert;private var listSO:SharedObject;private var userArr:Array;private var conn:NetConnection;private var localUsername:String;private var stm:NetStream; private var stm2:NetStream; /摄像头private var cam:Camera;/麦克风private var
19、 mic:Microphone; private var video_0:Video;private var video_1:Video;Bindablepublic var cards:ArrayCollection;/视频邀请集合public var videoUsers:Array;protected function login(event:MouseEvent):void/ TODO Auto-generated method stublocalUsername= txt_name.text;if(localUsername=)Alert.show(用户名不能为空);return;e
20、lseif(conn=null)conn = new NetConnection();conn.client = this;conn.addEventListener(NetStatusEvent.NET_STATUS, _statusHandler); conn.connect(rtmp:/192.168.0.10/szftest, localUsername);/状态监听 private function _statusHandler(evt:NetStatusEvent):void if (evt.info.code = NetConnection.Connect.Success) th
21、is.currentState = chat;Alert.show(连接成功); _setListSO(); /创建用户列表共享对象 this.showJoinInInfo(localUsername); if (evt.info.code = NetConnection.Connect.Failed) Alert.show(连接失败); if (evt.info.code = NetConnection.Connect.Closed) Alert.show(连接关闭); public function showJoinInInfo(message:String) : void/conn.ca
22、ll(getOnloadUser, new Responder(result_getUsers); conn.call(getOnloadUser, null,message);public function result_getOnloadUser(str:String):void txt_chatmsg.text += str + 加入聊天室 + n; /创建用户列表共享对象 private function _setListSO():void listSO = SharedObject.getRemote(listSO, conn.uri, false); listSO.connect(
23、conn); listSO.addEventListener(SyncEvent.SYNC,_listSOSyncHandler); /用户列表共享对象被更新之后事件 private function _listSOSyncHandler(evt:SyncEvent):void _showUserList(); /更新用户列表 /更新用户列表 private function _showUserList():voidcards = new ArrayCollection( label:All);userArr = new Array(); /用户数组更新 for (var tmp:String
24、 in listSO.data) userArr.push(listSO.datatmp); /添加ArrayCollection for (var i:int = 0; i userArr.length; i+ ) cards.addItem( label:userArri ); /将数组添加到列表中显示出来 userList.dataProvider = cards; users.dataProvider=cards;public function showMessage(message:String) : voidtxt_chatmsg.text += message + n; prot
25、ected function sendMessage(event:MouseEvent):void/ TODO Auto-generated method stubvar sendString:String = txt_yousay.text;/var sendTo:String=users.selectedItem.userName=null?:users.selectedItem.userId;var sendTo:String=userList.selectedItem.label;txt_yousay.text = ;conn.call(sayToAll, null,sendTo,se
26、ndString);/断线通知public function disconnectMessage(disUser:String):voidtxt_chatmsg.text += disUser + 退出聊天室n;/视频邀请protected function video_clickHandler(event:MouseEvent):void/ TODO Auto-generated method stubvar sendTo:String=userList.selectedItem.label;conn.call(videoInvite, null,sendTo);/显示自己的视频 public function _publishVideo():voidstm = new N
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1