Flex3+Red5语音视频聊天程序

本文介绍了一个基于Java的实时通讯应用程序,使用Red5服务器进行实时数据交换。程序通过维护在线用户列表,实现用户登录、断开连接的通知,以及聊天、视频邀请等功能。利用ISharedObject共享对象和IServiceCapableConnection接口,实现服务器与客户端之间的消息传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
import 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 ISharedObject listSO; 
 private Map<String,IConnection> onlineList = new HashMap<String, IConnection>();// 在线用户表
 //程序运行时志向
 public boolean appStart(IScope app) {
  if (!super.appStart(app)) {
      return false;
  }
  appScope = app;
  return true;
 }
 @Override
 public boolean appConnect(IConnection arg0, Object[] arg1) {
  /**
   *  用户首次连接server 时触发,检查用户是否重复登录,将用户添加到在线用户表中
   */
  String userId=arg0.getClient().getId();
  if(!super.appConnect(arg0, arg1)){
   return false;
  }
  if (arg1 != null ) {
   userName = (String) arg1[0];
  }
  if(onlineList.get(userName) != null){
   rejectClient("请不要重复登录");
   return false;
  }
  onlineList.put(userName, arg0);
  listSO = getSharedObject(appScope, "listSO", false); 
  listSO.setAttribute(userId, userName);
  System.out.println("The user:"+userName+","+userName+" logined successfully");
  return true;
 }
 /**
  * 通知所有人当前用户登录
  * @param params
  */
 public void getOnloadUser(Object[] params) {   
  String clientName = params[0].toString();  
  if(null == clientName || "".equals(clientName)) {
     return ;
   }
  //给所有客户端数据
   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) {
     IServiceCapableConnection sc = (IServiceCapableConnection) tempConn;
     sc.invoke("result_getOnloadUser", new Object[]{clientName});
    }
   }
 }
 //聊天
  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 sayToName=params[0]==null?"":params[0].toString().trim();  
   String sayWhat=params[1]==null?"":params[1].toString().trim();
   if("".equals(sayToName)||"All".equals(sayToName))// 发消息给聊天室的所有人.
   {
    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) {
         IServiceCapableConnection sc = (IServiceCapableConnection) tempConn;
      // 调用客户端showMessage方法。
         sc.invoke("showMessage", new Object[]{clientName+" to All:"+sayWhat});
      }
   }
   }else{
     IConnection tempConn=onlineList.get(sayToName);     
     if (tempConn instanceof IServiceCapableConnection) {
      IServiceCapableConnection sc = (IServiceCapableConnection) tempConn;     
      sc.invoke("showMessage", new Object[]{clientName+" to "+sayToName+":"+sayWhat});
      }
     IServiceCapableConnection sc = (IServiceCapableConnection) conn;
     sc.invoke("showMessage", new Object[]{clientName+" 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.removeAttribute(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) {
         IServiceCapableConnection sc = (IServiceCapableConnection) tempConn;
       // 服务器端调用客户端flash方法。
         sc.invoke("disconnectMessage", new Object[]{user});
      }
    }
  }
 //视频邀请
  public void videoInvite(Object[] params) {
   IConnection conn = Red5.getConnectionLocal();
   String user_id = conn.getClient().getId();
   String clientName =(String) listSO.getAttribute(user_id);
   System.out.println("************视频邀请者是:"+clientName);
   String sayToName=params[0]==null?"":params[0].toString().trim();
   if("".equals(sayToName)||"All".equals(sayToName))// 发消息给聊天室的所有人.
   {
   System.out.println("不可以邀请0或者多个人");  
   }else{
     IConnection tempConn=onlineList.get(sayToName);     
     if (tempConn instanceof IServiceCapableConnection) {
      IServiceCapableConnection sc = (IServiceCapableConnection) tempConn;     
      sc.invoke("showInviteMessage", new Object[]{clientName+";"+sayToName});
      }
   }
 }
  //同意邀请后调用邀请方方法
  public void agreeVideoInvite(Object[] params) {
    IConnection conn = Red5.getConnectionLocal();
    System.out.println("<<<<<params length"+params.length);
    //邀请者
    String inviteUserName=params[0]==null?"":params[0].toString().trim();
    //被邀请者
    String otherUserName=params[1]==null?"":params[1].toString().trim();
    System.out.println("***邀请者是:"+inviteUserName);
    System.out.println("***被邀请者是:"+otherUserName);
    if("".equals(inviteUserName))// 发消息给聊天室的所有人.
    {
    System.out.println("出错了");  
    }else{
      System.out.println("*********调用成功");
      IConnection tempConn=onlineList.get(inviteUserName);     
      if (tempConn instanceof IServiceCapableConnection) {
       IServiceCapableConnection sc = (IServiceCapableConnection) tempConn;     
       sc.invoke("showVideo", new Object[]{otherUserName});
       System.out.println("*********调用结束");
       }
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值