WuKongIM Docs

单聊

实现两个用户之间的持久消息、在线投递、离线同步、未读状态与多设备恢复。

编辑此页报告文档问题

本教程以 alicebob 为例。最终结果是:两端通过自己的业务身份连接,Alice 向 Bob 的个人 Channel 发送一条持久消息,Bob 可以在线接收,也能在断线后从日志恢复,并通过 UID-owned membership 处理未读状态。

开始前

  • 完成启动单节点集群或准备一个测试集群。
  • 理解身份认证的当前 Beta 限制。
  • HTTP 示例只能在本地或受保护的业务服务网络中执行。
Alice product session                         Bob product session
        |                                             |
        +-> SDK CONNECT -> Gateway       Gateway <- CONNECT <-+
        |                                             |
        +-> SEND peer=bob, type=1                    |
                    -> canonical person Channel      |
                    -> quorum commit -> SENDACK       |
                    -> Bob RECV / offline sync -------+

1. 建立业务身份

业务服务应拥有账号登录、好友关系、封禁和内容策略。为两个测试用户选择稳定 UID;不要使用昵称、连接 ID 或设备 ID 代替 UID。

本地兼容环境可以保存设备 Token 元数据:

curl -sS http://127.0.0.1:5001/user/token \
  -H 'Content-Type: application/json' \
  -d '{"uid":"alice","token":"alice-local-only","device_flag":0,"device_level":1}'

这不是生产鉴权证明

默认 v3 Beta Gateway 不会自动使用已存 Token 验证每个 CONNECT。生产发布前必须接入显式凭据校验,并证明错误、过期或撤销 Token 无法连接。

为 Bob 保存独立凭据,然后让两个客户端分别使用自己的 UID、设备标识和 Token 建立连接。没有 SDK 集成时,可以先用内嵌 Chat Demo验证两个浏览器会话。

2. 发送个人消息

客户端发送时使用对端 UID 作为 channel_id,并设置 channel_type=1。不要拼接或存储内部 canonical person Channel ID;服务端会用发送方和接收方 UID 归一化。

受信业务服务也可以用同一语义发送:

curl -sS http://127.0.0.1:5001/message/send \
  -H 'Content-Type: application/json' \
  -d '{
    "from_uid":"alice",
    "channel_id":"bob",
    "channel_type":1,
    "client_msg_no":"dm-alice-bob-0001",
    "payload":"eyJ2ZXJzaW9uIjoxLCJ0eXBlIjoidGV4dCIsInRleHQiOiJoZWxsbyBCb2IifQ=="
  }'

保留稳定且唯一的 client_msg_no。网络结果不明确时,用同一个编号重试同一次逻辑发送,不要换编号制造重复消息。HTTP 返回 reason=1 表示持久发送到达 Channel quorum commit;它不表示 Bob 的每台设备都已收到。

3. 验证在线与离线结果

在线 Bob 应收到 RECV 并在处理后发送 RECVACK。再用兼容同步接口验证持久日志;个人频道查询仍使用对端 UID:

curl -sS http://127.0.0.1:5001/channel/messagesync \
  -H 'Content-Type: application/json' \
  -d '{
    "login_uid":"bob",
    "channel_id":"alice",
    "channel_type":1,
    "start_message_seq":0,
    "limit":20,
    "pull_mode":1
  }'

响应中的 channel_id 会映射回 alicemessage_seq 只在这一个 person Channel 内有序。客户端应按消息 ID、client_msg_no 和 Channel sequence 合并在线投递与重连同步,允许重复到达。

4. 检查会话和未读

curl -sS http://127.0.0.1:5001/conversation/list \
  -H 'Content-Type: application/json' \
  -d '{"uid":"bob","limit":20}'

Bob 的会话项使用 channel_id=aliceunread 由 Bob 的 membership 与 Channel 状态计算,不是全局投递计数。用户确认当前会话已读后,由受信边界调用:

curl -sS http://127.0.0.1:5001/conversations/clearUnread \
  -H 'Content-Type: application/json' \
  -d '{"uid":"bob","channel_id":"alice","channel_type":1}'

clearUnread 会读取最新已提交普通 sequence,并单调推进 Bob membership 的 read_seq。它是红点命令,不是精确的客户端已读回执,因此并发新消息也可能一起被清除红点。

5. 验证多设备与恢复

  1. 用不同 device_id 建立 Bob 的第二个 Session。
  2. 明确产品的主/从设备冲突策略,不把“同 UID”理解为“只有一条连接”。
  3. 断开其中一个设备,再发送一条新的持久消息。
  4. 重连后通过 SDK 同步或 /channel/messagesync 恢复缺失 sequence。
  5. 验证在线投递、离线恢复和 membership-backed 未读计算不会被当成同一个完成信号。

上线前还要测试好友解除、黑名单、Token 撤销、断线重试、重复发送、热点单聊分布和 Webhook 重复消费。继续阅读群聊与超大群消息收发

本页内容