通过阅读本文,您可以了解1对1语音聊天服务端的集成操作。
操作步骤
- 获取AppID和AppKey。此处建议记录一下AppID和AppKey,方便后续操作中使用。
- 登录RTC控制台。
- 在左侧导航栏单击应用管理,进入应用管理页面。
- 在AppID/名称列获取AppID。
- 单击操作列的查询AppKey,获取AppKey。
说明 如果应用列表中没有您需要的应用,可以单击
创建应用,创建新的应用。具体操作,请参见
创建应用。
- 获取AccessKey。
说明 由于主账号AccessKey泄露会威胁您所有资源的安全,因此出于安全考虑,需要创建RAM用户(子账号)并获取RAM用户(子账号)的AccessKey,用于访问您的云资源。
- 登录RAM控制台。
- 在左侧导航栏选择,进入用户页面。
- 单击创建用户,填写用户账号信息,选中Open API 调用访问创建用户。
- 单击确定。
- 重新返回用户页面。在用户登录名称/显示名称列下,单击目标RAM子账户,进入管理页面。
- 单击权限管理,再单击添加权限。
- 选择AliyunRTCFullAccess(管理音视频通信的权限,可输入RTC进行搜索)。单击确定。
- 单击认证管理,在用户AccessKey区域单击创建AccessKey。
说明
- 首次创建时需填写手机验证码。
- 如果AccessKey泄露或丢失,则需要创建新的AccessKey,最多可以创建2个AccessKey。
- 获取AccessKey ID和AccessKey Secret。
创建AccessKey完成后,会弹出
创建AccessKey对话框,包含AccessKey ID和AccessKey Secret信息。此处建议记录一下AccessKey ID和AccessKey Secret,方便后续操作中使用。
- 下载并解压Demo,更多信息,请参见Demo源码下载。
说明
- 源码压缩文件内分为Server端、Android端、iOS端三个文件。
- 如果GitHub代码库下载缓慢,可安装加速插件等方式加速下载。
- 配置Demo工程。
- 将server/dist/rtc-api.zip文件解压到dist文件夹下。
解压成功之后如下图所示:
说明 解压成功后,可以看到BOOT-INF、META-INF及org文件夹,这三个文件夹需要和restart.sh保持在同一个目录下。
- 修改配置文件。
打开
BOOT-INF/classes/application.properties文件,修改配置。
说明 使用文本编辑器打开即可,若找不到打开方式,推荐安装VSCode等轻量级代码编辑器打开。
- 设置RTC应用AppId和AppKey,请参见步骤1获取。
rtc.1v1audio.appId = *
rtc.1v1audio.appKey = *
- 设置AK,需要添加AliyunRTCFullAccess权限,请参见步骤2获取。
accessKeyID=*
accessKeySecret=*
- 运行服务,执行restart.sh文件。如果编译过程中出现问题,请参见服务端运行常见问题。
- Mac或Linux环境下请将终端定位至dist目录下,执行如下命令:
sh restart.sh
后台执行可以使用如下命令以确保退出终端时程序能够继续运行。
nohup sh restart.sh >./run_log.log 2>&1 &
- Windows环境需要打开CMD终端定位到server/dist文件夹下,执行如下命令:
java org.springframework.boot.loader.JarLauncher
若提示8080端口被占用,请尝试使用netstat命令查看占用8080端口的进程pid号,并使用taskkill关闭相关进程。
netstat -ano | findstr 8080
taskkill /pid 占用端口的进程pid号 /f
终端成功运行后可以看到服务端启动成功的日志信息。
- 检查服务端是否已经启动。
在浏览器中访问http://127.0.0.1:8080/1v1-audio/index.html,如果显示如下图所示,表示服务端已经启动。
主要功能说明
- 生成joinChannel所需鉴权信息。
访问地址:/app/token
客户端调用RTC SDK加入房间的Token信息就是从这个接口获得。具体生成方式,请参见RTC帮助文档操作步骤。
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(appId.getBytes());
digest.update(appKey.getBytes());
digest.update(channelId.getBytes());
digest.update(userId.getBytes());
digest.update(nonce.getBytes());
digest.update(Long.toString(timestamp).getBytes());
String token = DatatypeConverter.printHexBinary(digest.digest()).toLowerCase();
return token;
- 查询频道实时在线用户列表。
访问地址:/app/descChannelUsers
AppServer通过调用DescribeChannelUsers接口查询频道的实时在线人数。
DefaultAcsClient client = initVodClient();
DescribeChannelUsersRequest request = new DescribeChannelUsersRequest();
request.setAppId(appId);
request.setChannelId(channelId);
DescribeChannelUsersResponse response = client.getAcsResponse(request);
- 查询房间开启时间。
访问地址:/app/descChannelStartTime
当客户端请求加入房间所需的token时,服务端查询当前房间人数,若房间人数为0,保存当前时刻和房间id。并把当前时刻作为此房间的创建时间。
DescribeChannelUsersResponse response = RtcOpenAPI.describeChannelUsers(appId, channelId);
if (CollectionUtils.isEmpty(response.getUserList())) {
ImmutablePair<String, String> appChannel = new ImmutablePair<>(appId, channelId);
ScheduledFuture scheduledFuture = TASKS.getOrDefault(appChannel, new JSONObject()).getObject("scheduledFuture", ScheduledFuture.class);
TASKS.put(appChannel, channelInfo);
}
JSONObject scheduledTask = ScheduledDeleteChannel.TASKS.get(ImmutablePair.of(appId, channelId));