消息
收发消息是 RTM 服务的基础功能之一,任何使用 RTM 服务发送的消息将会在 100 ms 以内送达到任何一个在线订阅用户端上,你可以一次只给一个人发消息,也可以一次给多人广播消息,这取决于你的使用方式。
RTM 有两种频道类型,分别是 Message Channel 和 Stream Channel。两种频道中消息的传递方式和需要调用的方法不同,区别如下:
- Message Channel:实时频道,消息通过频道传递,可扩展性强。本地用户可以调用
publish
方法在频道中发送消息,远端用户可以调用subscribe
方法订阅频道并接收消息。 - Stream Channel:流传输频道,用户需要先加入频道,然后加入 Topic,消息通过 Topic 传递。本地用户可以调用
publishTopicMessage
方法在 Topic 中发送消息,远端用户可以调用subscribeTopic
方法订阅 Topic 并接收消息。
本文介绍如何在 Message Channel 中收发消息。
想要了解更多收发消息的信息可以查看:
消息
publish
接口描述
你可以直接调用publish
方法向订阅该频道的所有在线用户发送消息。即使没有订阅频道,也能在频道中发送消息。
信息
以下做法可有效提升消息收发的可靠性:
- 消息负载限制在 32 KB 以内,否则发送会失败。
- 向单个频道发送消息的速率上限为 30 QPS。如果发送速率超限,将会有部分消息被丢弃。在满足要求的情况下,速率越低越好。
- RTM 不保证所有订阅者接收到消息的顺序与发送者发送消息的顺序保持一致。如果你想要保障消息绝对有序,声网建议你在消息负载中自定义消息序号。
成功调用该方法后,SDK 会触发 message
事件通知。订阅了该频道并且开启了事件监听的用户将会收到该事件通知,详见事件监听。
接口方法
你可以通过以下方式调用 publish
方法:
JavaScript
rtm.publish(
channelName: string,
message: string | Uint8Array,
options?: {customType?: string;}
): Promise<PublishResponse>;
参数 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
message | string/Uint8Array | 必填 | - | 消息负载。支持任意 string 类型和 Uint8Array 类型。 |
channelName | string | 必填 | - | 频道名称。同一时间仅支持向一个频道发送消息。 |
options | object | 选填 | - | 消息选项。 |
options
对象中包含以下属性:
属性 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
customType | string | 选填 | - | 用户自定义字段。仅支持 string 型。 |
基本用法
示例 1:向指定频道发送 string 消息
JavaScript
try {
const result = await rtm.publish( 'my_channel', "Hello world" );
console.log(result);
} catch (status) {
console.log(status);
}
示例 2:向指定频道发送 Uint8Array 消息
JavaScript
const str2ab = function(str) {
var buf = new ArrayBuffer(str.length * 2); // 每个字符占用 2 个字节
var bufView = new Uint16Array(buf);
for (var i = 0, strLen = str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
};
var Message=str2ab('hello world');
try {
const result = await rtm.publish('my_channel', Message );
console.log(result);
} catch (status) {
console.log(status);
}
信息
成功调用该方法后,SDK 会触发 message
事件通知。订阅了该频道并且开启了事件监听的用户将会收到该事件通知,详见事件监听。
返回值
如果方法调用成功,则返回一个 PublishResponse
类型数据:
JavaScript
type PublishResponse = {
timeToken: number, // (预留属性)操作成功时间戳
chanelName : string // 频道名称
}
如果方法调用失败,则返回一个 ErrorInfo
类型数据:
JavaScript
type ErrorInfo = {
error: boolean; // 本次操作是否出错
operation: string; // 本次操作的 API 名称
errorCode: number; // 错误码
reason: string; // 错误描述
}
你可以通过检索 errorCode
字段的错误码了解错误原因,并找到对应的解决方法。
接收消息
RTM 提供消息、状态、事件变更等信息的事件通知。通过设置事件监听,你可以接收已订阅频道中的消息和事件。
关于如何添加和设置事件监听,详见事件监听章节。