您可以阅读本文,了解语音聊天室服务端的集成操作。

前提条件

  • 您已经完成注册阿里云账号,并完成实名认证,具体操作请参见阿里云账号注册流程
  • 您已经开通音视频通信服务,具体操作请参见开通服务
  • 您需要在阿里云音视频通信RTC控制台创建应用

操作步骤

  1. 获取AppKey和AppID
    • 您可以在控制台点击应用管理,点击查询AppKey,获取AppKey。
    • 您可以在控制台点击应用管理,复制您的AppID,如下图所示:AppID
  2. 获取AccessKey

    您可以为阿里云主账号和子账号创建一个访问密钥(AccessKey)。在调用阿里云ENS API时您需要使用AccessKey完成身份验证。

    AccessKey包括AccessKeyId和AccessKeySecret。
    • AccessKeyId:用于标识用户。
    • AccessKeySecret:用于验证用户的密钥。AccessKeySecret必须保密。
    警告 主账号Accesskey泄露会威胁您所有资源的安全。建议使用子账号(RAM用户)Accesskey进行操作,可有效降低Accesskey泄露的风险。

    具体操作步骤,请参见创建AccessKey

  3. 获取Demo源码
    如果您需要语音聊天室开源示例项目,请添加钉钉群获取:顶顶群码
  4. 数据库初始化

    创建表

    建表语句在工程sql文件夹中,项目根目录下可以找到建表的sql文件,地址如下:./sql/appserver_create_table.sql

  5. 配置运行
    说明 服务端环境需要JDK 8及以上版本。
    1. 下载编译好的server,解压dist/rtc-api.zip。
    2. 修改配置文件BOOT-INF/classes/application.properties,如下图所示: 配置文件
      • 设置AK,需要添加AliyunRTCFullAccess权限 ,AccessKeyId和AccessKeySecret的生成请参考步骤二

        accessKeyID=*

        accessKeySecret=*

      • 修改RTC应用appId和appKey 。

        rtc.chatroom.appId = *

        rtc.chatroom.appKey = *

    3. 修改数据库访问地址、用户名和密码。

      spring.datasource.url = jdbc:mysql://*:3306/chatroom?

      useSSL=false&useUnicode=true&characterEncoding=UTF-8

      spring.datasource.username = *

      spring.datasource.password = *

    4. 执行restart.sh即可启动或重启Server。
    5. 访问http://127.0.0.1:8080/chatroom/index.html即可看到启动成功提示。

源码编译运行

命令行切换到项目所在磁盘的根目录执行命令:
mvn clean package -Dmaven.test.skip=true
出现BUILD SUCCESS则打包成功,可看到target/chatroom-api-0.0.1-SNAPSHOT.jar文件。执行命名即可启动项目
nohup java -jar chatroom-api-0.0.1-SNAPSHOT.jar &

主要功能说明

  • 生成随机用户,并返回用户信息

    访问地址:/user/randomUser

    随机生成用户信息和客户端调用RTC SDK加入房间的Token信息。具体生成方式参考RTC帮助文档生成Token

         if (StringUtils.isBlank(channelId)) {
                channelId = RandomStringUtils.randomNumeric(5);
         }
        JSONObject rtcAuth = RtcOpenAPI.createToken(channelId, UUID.randomUUID().toString());
        rtcAuth.put("userName", RandomString.getRandomName());
        return rtcAuth;
  • 成功加入房间后保存用户信息

    访问地址:/user/joinSuccess

    客户端成功加入房间后,通知AppServer,保存用户信息到rds。

    userService.insertUser(channelId, userid, userName, seatIndex);
  • 获取上麦用户麦序

    访问地址:/user/getSeatList

    获取所有上麦用户麦序信息。查询频道实时在线用户列表,对比AppServer保存的用户麦序,为新上麦的用户分配麦序,删除下麦用户的麦序。

            List<User> userList = userService.getUserList(channelId);
    
            DescribeChannelUsersResponse describeChannelUsersResponse = RtcOpenAPI.describeChannelUsers(appId, channelId);
            List<String> liveUserList = describeChannelUsersResponse.getInteractiveUserList();
    
            List<String> takeSeatUserIds = new ArrayList<>(liveUserList);
            List<String> leaveSeatUserIds = new ArrayList<>(userIdList);
    
            List<String> existSeatIndex = new ArrayList<>();
            for (User user : userList) {
                if (liveUserList.contains(user.getUserId())) {
                    existSeatIndex.add(user.getSeatIndex());
                }
            }
    
            leaveSeatUserIds.removeAll(liveUserList);
            takeSeatUserIds.removeAll(userIdList);
    
            List<User> updateUserList = new ArrayList<>();
            for (int i = 0, takeSeatIndex = 0; i < 8 && takeSeatIndex < takeSeatUserIds.size(); i++) {
                if (!existSeatIndex.contains(String.valueOf(i))) {
                    User user = new User();
                    user.setUserId(takeSeatUserIds.get(takeSeatIndex));
                    user.setSeatIndex(String.valueOf(i));
                    updateUserList.add(user);
                    takeSeatIndex++;
                }
            }
            for (String leaveSeatUserId : leaveSeatUserIds) {
                User user = new User();
                user.setUserId(leaveSeatUserId);
                user.setSeatIndex(null);
                updateUserList.add(user);
            }
    
            userService.updateUserSeats(updateUserList);
            userList = userService.getUserList(channelId);
  • 查询房间人数

    调用访问地址:/user/describeChannelUsers

    查询频道实时在线用户列表。

           DefaultAcsClient client = initVodClient();
            DescribeChannelUsersRequest request = new DescribeChannelUsersRequest();
            request.setAppId(appId);
            request.setChannelId(channelId);
            DescribeChannelUsersResponse response = client.getAcsResponse(request);