human: 如何处理七牛云的实时音视频房间管理

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > Uniapp >房间管理

#  房间管理

最近更新时间: 2023-12-18 15:12:19

**房间**
是对音视频对话空间的抽象，用于隔离不同的通话过程，保障数据的安全及独立。同一房间内的用户可以互相接收对方的音视频数据。本部分介绍如何进行房间管理，获取房间信息、用户信息以及如何实现踢人等常见功能。

>   *
> 加入、离开房间代表一次音视频通话的开始和结束，一次会话仅需调用一次加入、离开的操作即可，无需重复调用。加入房间后对于音视频数据的发送和接收，可参考发布和订阅相关流程。
>   * 加入房间需要携带相应的 [RoomToken](https://developer.qiniu.com/rtc/9909/the-rtc-
> basic-
> concept#room_token)，[RoomToken](https://developer.qiniu.com/rtc/9909/the-
> rtc-basic-concept#room_token) 需通过您的服务端生成，签算方式可参考 [RoomToken
> 签发服务](https://developer.qiniu.com/rtc/8813/roomToken)。
>

# 房间的生命周期

  * 当用户加入的房间不存在时，七牛后台服务会自动创建对应的房间。
  * 若房间内的所有用户都已离开，那么房间维持空状态 10s 后将会自动关闭。
  * 若房间为服务端创建，且创建后无用户进入，那么房间维持空状态 30s 后将会自动关闭。
  * 若房间内的用户由于断网等原因，30s 未向七牛后台服务通信，则该用户将被视为退出房间。

# 加入房间

本地调用
[QNRTCClient.join](https://developer.qiniu.com/rtc/11402/UniappQNRTCClient#join)
通过 roomToken 加入房间。

    
    
    const token = "..."
    const userData = "..."
    client.join(token, userData)
    

> 1.请确保在 `QNConnectionState.DISCONNECTED` 状态下调用该接口加入房间，否则接口调用无效  
>  2.加入房间时根据业务需求，每个用户可通过 `userData` 携带自定义数据

关于 roomToken 的签算规则，可查阅 [RoomToken
的签算文档](https://developer.qiniu.com/rtc/8813/roomToken)。

**本地用户收到的回调：**

调用
[QNRTCClient.join](https://developer.qiniu.com/rtc/11402/UniappQNRTCClient#join)
接口后，会触发
[onConnectionStateChanged](https://developer.qiniu.com/rtc/11404/UniappQNRTCClinetEvent#connectionStateChanged)
监听回调房间状态改变的通知

  * 若加入房间成功，会回调 [QNConnectionState.CONNECTED](https://developer.qiniu.com/rtc/11407/UniappQNConnectionState#CONNECTED) 状态。
  * 若加入房间失败，会回调 [QNConnectionState.DISCONNECTED](https://developer.qiniu.com/rtc/11407/UniappQNConnectionState#DISCONNECTED) 状态，同时可以通过 [QNConnectionDisconnectedInfo](https://developer.qiniu.com/rtc/11387/UniappQNConnectionDisconnectedInfo) 获取失败的原因以及对应的错误码

**远端用户收到的回调：**

    
    
    client.on("onUserJoined", (remoteUserID, userData) => {
        // ...
    })
    

# 离开房间

本地调用 [QNRTCClient.leave](https://developer.qiniu.com/rtc/11841/room-
management-uniapp) 退出房间。本地退出房间成功后，会触发如下回调：

**本地用户收到的回调：**

    
    
    client.on("onConnectionStateChanged", (info, state) => {
        // 当房间状态改变时会触发此回调，成功离开房间后，回调状态为 QNConnectionState.DISCONNECTED，QNConnectionDisconnectedInfo 回调 Reason 为 LEAVE
        // ...
    })
    

**远端用户收到的回调：**

    
    
    client.on("onUserLeft", (remoteUserID) => {
        // ...
    })
    

# 房间信息

### 获取房间内远端用户信息

本地可调用
[QNRTCClient.getRemoteUser](https://developer.qiniu.com/rtc/11402/UniappQNRTCClient#getRemoteUsers)
接口获取音视频通话房间中的所有远端用户。

    
    
    const users = client.getRemoteUser()
    

### 获取房间状态信息

本地可以调用
[QNRTCClient.getConnectionState](https://developer.qiniu.com/rtc/11402/UniappQNRTCClient#getConnectionState)
接口获取音视频通话的房间状态信息。

    
    
    const state = client.getConnectionState()
    

其中 **QNConnectionState** 包含如下状态：

    
    
    enum QNConnectionState {
        // 未链接状态, SDK 出现无法恢复错误时也进入该状态
        DISCONNECTED,
        // 正在连接状态, 加入房间时首先进入该状态，表示开始连接房间服务
        CONNECTING,
        // 连接成功状态，在完成和房间服务连接后进入该状态
        CONNECTED,
        // 正在重连状态，当和房间的已有连接由于网络中断、网络异常等原因断开，SDK 进行周期性重连时进入该状态
        RECONNECTING,
        // 重连成功状态，当从 RECONNECTING 状态，重新和房间服务建立连接后进入该状态
        RECONNECTED
    }
    

# 踢人

### 客户端踢人

客户端 SDK 未提供踢人的接口，但是踢人操作可以通过自定义消息来实现。实现步骤可参考如下：

1.业务侧协商定义好踢人消息的格式规范 2.踢人方在执行踢人操作时，向指定用户发送协商好的踢人消息 3.被踢方接收到踢人消息后，主动离开当前房间

示例代码参考如下：

**踢人方：**

踢人方发送协商好的踢人消息：

    
    
    client.sendMessage("kickOut", ["user1"], "message1");
    

其中，自定义消息的使用方式可以参考
[QNRTCClient.sendMessage](https://developer.qiniu.com/rtc/11402/UniappQNRTCClient#sendMessage)。

**被踢方：**

被踢方监听
[onMessageReceived](https://developer.qiniu.com/rtc/11404/UniappQNRTCClinetEvent#onMessageReceived)
回调接口来接收踢人消息，并在收到消息后主动离开房间：

    
    
    client.on("onMessageReceived", (info) => {
        if(info.message === "kickOut") {
            // 离开房间
        }
    })
    }
    

### 服务端踢人

服务端提供了踢人的接口，详情可参考服务端文档，当服务端执行踢人操作后，会触发被踢方
[onConnectionStateChanged](https://developer.qiniu.com/rtc/11404/UniappQNRTCClinetEvent#onConnectionStateChanged)
回调。

其中，被服务端踢出房间的场景下回调的状态为
[QNConnectionState.DISCONNECTED](https://developer.qiniu.com/rtc/11407/UniappQNConnectionState#DISCONNECTED)，同时
[QNConnectionDisconnectedReason](https://developer.qiniu.com/rtc/11398/UniappQNConnectionDisconnectedReason#KICKED_OUT)
为 **KICKED_OUT** 。

以上内容是否对您有帮助？