# 频道基础 (/zh-CN/realtime-media/rtm/build/channels-and-topics/channel-basic)

> For AI agents: see the complete documentation index at [llms.txt](/llms.txt).

在 RTM 实时网络中，频道是一种有效的数据传输管理机制，用于将数据从一个设备传递到另一个设备。任何订阅或加入频道的用户都可以在 100 毫秒内接收到该频道中传输的消息或事件。RTM 允许客户端同时订阅或加入多个频道，具体数量参考 [API 调用限制](/zh-CN/realtime-media/rtm/reference/usage-limits-and-errors/api-limits)。大多数 RTM API 都使用频道作为参数，包括发送消息、接收消息、加密等。

## 频道类型 [#频道类型]

RTM 的频道，根据其使用方法和消息投递方式可以分为 3 种类型，分别是 Message Channel、User Channel 和 Stream Channel，在 API 中通过 `channelType` 参数加以区别。3 种频道类型的主要区别如下：

- Message Channel：此频道类型使用了一种常见的通信方式，遵循发布-订阅模式以传递消息，类似于 MQTT 协议。使用时，无需提前创建频道，只需向指定频道发布消息，或者订阅指定频道以接收消息。由于其灵活性，用户可以轻松实现一对一频道、群组频道、广播频道、单播频道等不同拓扑结构。因为此频道类型通常有大量订阅者，所以无法保证所有订阅者在收到消息后都发送送达回执。详见 [Message Channel](/zh-CN/realtime-media/rtm/build/channels-and-topics/message-channel)。
- User Channel：此频道类型用于向指定用户（`userId`）发送点对点消息。在使用时，只需将 `message.publish` 方法中的 `channelType` 参数设为 `enumv.channeltypeuser`，将 `channelName` 参数设为对方的 `userId` 即可。接收消息无需订阅，只需实现`config.onmessageevent` 事件监听即可。因为是一对一的消息收发，所以此频道类型支持送达回执功能。即发送方发送消息后，如果接收方在线并成功接收到消息，则会返回成功；如果接收方不在线或接收失败，则会返回失败或超时。此频道类型只能实现一对一拓扑结构。虽然你可以通过返回值判断对方是否在线，但我们推荐通过 `Presence` 功能来实现。
- Stream Channel：这是一种特殊的频道类型，遵循类似观察者模式的 Room（房间）概念，在此类型的频道中，用户不可以直接发送消息。用户需要先调用 `topic.join` 方法注册成为该 Topic 的发布者，然后才可以发送消息，详见[发送消息](/zh-CN/realtime-media/rtm/build/messaging/send-message)。如果用户要接收消息，则需订阅指定 Topic 中的指定消息发布者（通过 `userId` 标识），详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。此外，还支持客户端消息以更高的 QPS 进行投递，详见 [API 调用限制](/zh-CN/realtime-media/rtm/reference/usage-limits-and-errors/api-limits)。此频道类型往往推荐在元宇宙、平行驾驶、云游戏等场景中使用。

此外，在 Message Channel 和 Stream Channel 中，皆可根据实际需求启用 Presence、Storage 及 Lock 等功能。然而，User Channel 无法利用这些功能，可将其视为一种简单的消息直通通道。

RTM 的频道分为两种类型，分别是 **Message** 和 **Stream**，在 API 中通过 `enumv.channeltype` 加以区别。两种频道的主要区别如下：

|  频道类型   | 主要特征                                                                                                                                                                                                                                                                                        | 适用场景                                                                                                                                      |
| --------- | ----------- | ---------------- |
| **Message** | 遵循行业标准的 Pub/Sub （发布/订阅）模式投递消息和事件，频道无需提前创建，随用随取。频道内的发布者和订阅者数量没有上限，但对于单个频道的上行 QPS（Queries per second，每秒查询数）有限制，详见 [API 调用限制](/zh-CN/realtime-media/rtm/reference/usage-limits-and-errors/api-limits)。                                                            | 常见的基于 Pub/Sub 场景的应用及多设备接入的应用，例如：IoT 行业的多设备管理和指令收发，智能设备中的多终端管理和指令收发位置跟踪，大型社区等。 |
| **Stream**  | 遵循行业类似观察者模式的 Room（房间）概念，用户需要加入频道才能收发事件通知。消息通过频道内的 Topic 进行管理和投递，单个频道最多允许 1000 个用户同时加入。支持与声网 RTC 音视频数据共频道、同步传输等。此外，还支持客户端消息以更高的 QPS 进行投递，详见 [API 调用限制](/zh-CN/realtime-media/rtm/reference/usage-limits-and-errors/api-limits)。 | 高频大并发数据传输场景以及与 RTC 音视频数据共频道、同步传输的场景，例如：元宇宙，平行驾驶，云游戏等。                                         |

可以认为频道是一种控制消息流动的管道。**Message** 和 **Stream** 频道在消息流的控制上采用了不同的策略：

- 在 Message 频道中，发布者只需要将消息投递到特定频道中，那么任何订阅该频道的设备或用户都可以收到该消息或事件通知。
- 在 Stream 频道中，用户不可以直接发送消息。用户需要先调用 `topic.join` 方法注册成为该 Topic 的发布者，然后才可以发送消息，详见[发送消息](/zh-CN/realtime-media/rtm/build/messaging/send-message)。如果用户要接收消息，则需订阅指定 Topic 中的特定消息发布者（通过用户 ID 标识），才能接收到该发布者发布的消息，详见[ Topic ](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。

除消息以外，Message 频道和 Stream 频道对于 Presence、Storage、Lock 等其他事件通知的机制和用法是相同的。

## 创建频道 [#创建频道]

对于 Message Channel，在使用前，你无需提前定义或创建频道。在你首次向 Message Channel 发送消息或首次订阅 Message Channel 时，RTM 会为你自动创建该频道。

对于 Stream Channel，虽然本质上也是随用随取的，但在使用前你需要明确的调用 `channel.create` 方法创建一个 `channel.istreamchannel` 对象实例，然后才能调用 `channel.join` 方法加入频道。

## 频道限制 [#频道限制]

RTM 对同时存在的 Message 和 Stream 频道数量没有限制。然而，不同频道对单个客户端同时订阅或加入的频道数量、收发消息的 QPS 等的限制不同，详见 [API 调用限制](/zh-CN/realtime-media/rtm/reference/usage-limits-and-errors/api-limits)。

## 频道名称 [#频道名称]

频道名称不能为空，可为长度不超过 64 字节的字符串。支持的合法字符请参见下文“合法字符”。RTM 使用 App ID 作为频道的命名空间，每个 App ID 下的频道由频道名称和频道类型共同标识。如果两个频道的频道类型不同或频道名称不同，则 RTM 会将它们视为两个独立的频道；如果两个频道的频道类型和频道名称都相同，则 RTM 会将它们视为同一个频道。

### 非法字符 [#非法字符]

`.`、`*`、`/`、`\`、`\0` 和不可打印的 ASCII 字符都属于非法字符。

### 合法字符 [#合法字符]

支持的合法字符如下:

- 26 个小写英文字母 a~z
- 26 个大写英文字母 A~Z
- 10 个数字 0~9
- 空格
- `!`、`#`、`$`、`%`、`&`、`(`、`)`、`+`、`,`、`-`、`:`、`;`、`<`、`=`、`>`、`?`、`@`、`[`、`]`、`^`、`_`、`{`、`|`、`}`、`~`

:::info[信息]
命名不能以 `_` 为前缀。
:::

### 命名约定 [#命名约定]

虽然 SDK 并未强制要求，但是声网建议你在为频道命名的时候，通过有意义的前缀字符来表征频道的业务用途或此频道中消息的类型等，以便于你更清晰地展示你的业务逻辑。点击[命名推荐](/zh-CN/realtime-media/rtm/build/channels-and-topics/channel-name)查看更多建议。
