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

前提条件

  • 您已经完成注册阿里云账号,并完成实名认证,具体操作请参见阿里云账号注册流程
  • 您已经开通音视频通信服务,具体操作请参见开通服务。语音聊天室无需购买套餐也可正常搭建。
  • 首次开通RTC服务后,系统会自动帮您创建一个应用项目,可以直接使用自动创建好的应用项目进行使用。如果没有应用项目,需要您在阿里云音视频通信RTC控制台创建应用
  • 服务端环境需要Java JDK 8的版本,具体操作,请参见安装JDK
  • 服务端环境建议使用MySQL 5.7版本。具体操作,请参见安装MySQL
说明 Linux环境推荐安装Oracle JDK,不推荐使用Open JDK进行服务端集成。

操作步骤

说明 您在集成服务端时,如果遇到问题,请参见服务端运行常见问题
  1. 获取应用ID和AppKey。
    说明

    应用ID和AppKey需要对应,不同的应用ID有不同的AppKey。

    在后续开发中会使用应用ID和AppKey,建议记录到本地文档中,妥善保存。

    1. 登录RTC控制台
    2. 在左侧导航栏单击应用管理,进入应用管理页面。
    3. 获取应用ID和查询AppKey。
      • 应用ID:可在应用ID/名称列表下直接获取。
      • AppKey:单击查询AppKey获取AppKey。
      如果您还未有应用,您可以单击创建应用创建。获取AppKey和应用ID
  2. 获取AccessKey。
    警告 由于主账号AccessKey泄露会威胁您所有资源的安全,因此出于安全考虑,需要创建一个子账号(RAM用户)并获取子账号的AccessKey,用于1对1语音聊天Demo访问您的云资源。
    1. 登录RAM控制台
    2. 在左侧导航栏选择人员管理 > 用户,进入用户页面。
    3. 请单击创建用户,填写用户账号信息,选择编程访问创建用户。
      创建用户
    4. 重新返回用户页面。在用户登录名称/显示名称列表下,单击目标RAM子账户,进入管理页面。
      单击子RAM账户
    5. 单击权限管理,单击添加权限
      添加权限
    6. 选择AliyunRTCFullAccess(管理音视频通信(RTC)的权限),可输入RTC进行搜索。单击确定
      添加权限
    7. 单击认证管理,在用户AccessKey区域单击创建AccessKey
      说明
      • 首次创建时需填写手机验证码。
      • 如果AccessKey泄露或丢失,则需要创建新的AccessKey,最多可以创建2个AccessKey。
      创建AccessKey
    8. 获取AccessKey ID和AccessKey Secret。
      创建AccessKey完成后,会弹出创建AccessKey对话框,可以获取AccessKey ID和AccessKey Secret。
      注意 AccessKey和AccessKey Secret,在后续开发中会使用,建议记录到本地文档妥善保存。AccessKey Secret只在创建时显示,不提供查询。
      获取AccessKey
  3. 下载Demo源码。
    说明
    • 源码压缩文件内分为Server端、Android端、iOS端三个源文件。
    • 若遇到Github代码库下载缓慢的问题,可通过安装加速插件等方式加速下载。
  4. 解压Demo源码压缩包。
    解压成功之后如下图所示:目录
    1. 选择server/dist/RTCAudioLiveRoom.zip文件,双击解压文件,将文件解压到dist文件夹下。

      解压成功之后如下图所示。

      解压文件
      说明 解压成功后,可以看到BOOT-INF、META-INF及org文件夹,这三个文件夹需要和restart.sh保持在同一个目录下。
    2. 在MySQL中创建数据库并使用sql文件建表。

      sql文件路径:/server/sql/appserver_create_table.sql

      启动MySQL服务
      • Windows
        net start MySQL服务名
      • Mac
        sudo Mysql服务路径 start
      • Linux
        service mysql start
      新建终端,并将终端定位到sql文件目录下。
      1. 创建chatroom数据库。
        mysqladmin -u root -p create chatroom
      2. 在chatroom数据库中执行sql文件。
        mysql -u (输入用户名,如root) -p(输入密码) chatroom < ./appserver_create_table.sql
    3. 修改配置文件。
      打开BOOT-INF/classes/application.properties文件,修改配置。
      说明 使用文本编辑器打开即可,若找不到打开方式,推荐安装VSCode等轻量级代码编辑器打开。
      配置文件
      • 设置RTC应用AppId和AppKey,可参见步骤获取AppKey和应用ID。获取。

        rtc.chatroom.appId = *

        rtc.chatroom.appKey = *

      • 设置AK,需要添加AliyunRTCFullAccess权限,可参见步骤获取AccessKey获取。

        accessKeyID=*

        accessKeySecret=*

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

        数据库访问地址:spring.datasource.url = jdbc:mysql://数据库IP地址(本地:127.0.0.1):3306/数据库名(chatroom)?useSSL=false&useUnicode=true&characterEncoding=UTF-8

        用户名:spring.datasource.username = *

        密码:spring.datasource.password = *

        说明 如果数据库和服务端都在本地运行,则数据库IP地址可以使用127.0.0.1。
  5. 运行服务,执行restart.sh文件。
    • Mac或Linux环境下请将终端定位至dist目录下,执行如下命令:
      sh restart.sh
      后台执行可以使用如下命令以确保退出终端时程序能够继续运行。
      nohup sh restart.sh >./run_log.log 2>&1 &
    • Windows环境需要打开CMD终端定位到server/dist文件夹下,使用如下命令执行restart.sh。
      java org.springframework.boot.loader.JarLauncher
      若提示8080端口被占用,请尝试使用netstat命令查看占用8080端口的进程pid号,并使用taskkill关闭相关进程。
      netstat -ano | findstr 8080
      taskkill /pid 占用端口的进程pid号 /f 
      终止8080端口
      终端成功运行后可以看到服务端启动成功的日志信息。日志
  6. 访问指定URL地址。

    URL地址:http://127.0.0.1:8080/chatroom

    如果您在浏览器上看到Hello RTC! ,代表服务端已经启动。验证

主要功能说明

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

    访问地址:/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);