频道基础
在 RTM 实时网络中,频道是一种有效的数据传输管理机制,用于将数据从一个设备传递到另一个设备。任何订阅或加入频道的用户都可以在 100 毫秒内接收到该频道中传输的消息或事件。RTM 允许客户端同时订阅或加入多个频道,具体数量参考 API 使用限制。大多数 RTM API 都使用频道作为参数,包括发送消息、接收消息、加密等。
频道类型
RTM 的频道,根据其使用方法和消息投递方式可以分为 3 种类型,分别是 Message Channel、User Channel 和 Stream Channel,在 API 中通过 channelType
参数加以区别。3 种频道类型的主要区别如下:
- Message Channel:此频道类型使用了一种常见的通信方式,遵循发布-订阅模式以传递消息,类似于 MQTT 协议。使用时,无需提前创建频道,只需向指定频道发布消息,或者订阅指定频道以接收消息。由于其灵活性,用户可以轻松实现一对一频道、群组频道、广播频道、单播频道等不同拓扑结构。因为此频道类型通常有大量订阅者,所以无法保证所有订阅者在收到消息后都发送送达回执。详见 Message Channel。
- User Channel:此频道类型用于向指定用户(
userId
)发送点对点消息。在使用时,只需将publish
方法中的channelType
参数设为AgoraRtmChannelTypeUser
,将channelName
参数设为对方的userId
即可。接收消息无需订阅,只需实现didReceiveMessageEvent
事件监听即可。因为是一对一的消息收发,所以此频道类型支持送达回执功能。即发送方发送消息后,如果接收方在线并成功接收到消息,则会返回成功;如果接收方不在线或接收失败,则会返回失败或超时。此频道类型只能实现一对一拓扑结构。虽然你可以通过返回值判断对方是否在线,但我们推荐通过Presence
功能来实现。 - Stream Channel:这是一种特殊的频道类型,遵循类似观察者模式的 ROOM(房间)概念,在此类型的频道中,用户不可以直接发送消息。用户需要先调用
joinTopic
方法注册成为该 Topic 的发布者,然后才可以发送消息,详见发送消息。如果用户要接收消息,则需订阅指定 Topic 中的指定消息发布者(通过userId
标识),详见 Topic。此外,还支持客户端消息以更高的 QPS 进行投递,详见 API 使用限制。此频道类型往往推荐在元宇宙、平行驾驶、云游戏等场景中使用。
此外,在 Message Channel 和 Stream Channel 中,皆可根据实际需求启用 Presence、Storage 及 Lock 等功能。然而,User Channel 无法利用这些功能,可将其视为一种简单的消息直通通道。
创建频道
对于 Message Channel,在使用前,你无需提前定义或创建频道。在你首次向 Message Channel 发送消息或首次订阅 Message Channel 时,RTM 会为你自动创建该频道。
对于 Stream Channel,虽然本质上也是随用随取的,但在使用前你需要明确的调用 createStreamChannel
方法创建一个 AgoraRtmStreamChannel
对象实例,然后才能调用 joinWithOption
方法加入频道。
频道限制
RTM 对同时存在的 Message 和 Stream 频道数量没有限制。然而,不同频道对单个客户端同时订阅或加入的频道数量、收发消息的 QPS 等的限制不同,详见 API 使用限制。
频道名称
频道名称不能为空,可为长度不超过 64 字节的字符串,由 ASCII 字符集中的字母或数字组成。RTM 使用 App ID 作为频道的命名空间,每个 App ID 下的频道由频道名称和频道类型共同标识。如果两个频道的频道类型不同或频道名称不同,则 RTM 会将它们视为两个独立的频道;如果两个频道的频道类型和频道名称都相同,则 RTM 会将它们视为同一个频道。
非法字符
.
、*
、/
、\
、\0
和不可打印的 ASCII 字符都属于非法字符。
合法字符
支持的合法字符如下:
- 26 个小写英文字母 a~z
- 26 个大写英文字母 A~Z
- 10 个数字 0~9
- 空格
!
、#
、$
、%
、&
、(
、)
、+
、,
、-
、:
、;
、<
、=
、>
、?
、@
、[
、]
、^
、_
、{
、|
、}
、~
、`
命名不能以 _
为前缀。
命名约定
虽然 SDK 并未强制要求,但是声网建议你在为频道命名的时候,通过有意义的前缀字符来表征频道的业务用途或此频道中消息的类型等,以便于你更清晰地展示你的业务逻辑。点击命名推荐查看更多建议。