直播聊天室

    为方便开发者了解和接入融云直播聊天室,本文将介绍融云直播聊天室功能特点、主要构成及常见功能的解决方案。

    产品介绍

    融云直播聊天室,是专门为视频直播业务提供的一个产品。主要特点是:

    丰富的聊天室消息类型和消息进阶功能

    1. 支持消息类型包括文字、语音、图片等内置消息类型和可实现点赞、礼物等功能的自定义消息类型;
    2. 支持内容安全管理,包括敏感词设置,聊天内容反垃圾处理等;
    3. 支持聊天室消息管理功能,包括消息优先级、消息分发控制等;
    4. 支持聊天室消息云端存储功能,可以实现视频回放时历史记录回看等场景;
    5. 支持服务端发送聊天室消息,可以实现聊天室通知等场景;

    便捷细致的聊天室管理功能

    1. 支持聊天室用户管理功能,包括创建、加入、销毁、禁言、查询、封禁(踢人)等;
    2. 支持聊天室用户白名单功能,白名单用户处于被保护状态不会被自动踢出,且发送消息优先级别最高;
    3. 支持聊天室实时消息数据统计;
    4. 支持聊天室消息实时路由功能,由此功能可以对聊天室消息进行数据实时分析和挖掘;

    满足个性化需求的聊天室服务

    1. 融云直播聊天室人数无上限;
    2. 支持海量消息的并发,消息速度极快;
    3. 支持与多家视频 CDN 服务商完美兼容;
    4. 支持同一用户进入多个聊天室,可以同时建立多个连接;
    5. 支持海外节点及专属海外数据中心,包括美国、东南亚、欧洲等地;
    6. 融云直播聊天室可以实现平滑的横向扩展,支持任意规模的同时在线用户消息分发。

    通过以上各点可以极大的节约视频直播产品的开发和运营成本。目前融云承担的日消息分发量峰值已经超过 2000 亿。

    直播聊天室主要构成

    融云的视频直播聊天室方案,由两部分构成,视频直播 SDK 和融云聊天室 SDK。后者由融云提供,前者你使用自己的推流和拉流来实现,或者使用第三方成熟的 SDK 来实现。融云的开源视频直播室 App 里整体方案为您打包了金山云视频 SDK,同时我们也支持七牛、乐视、阿里、UCloud 等视频云 SDK。

    视频直播 SDK

    • 主播端

      主播端使用的是推流 SDK,主播需要把摄像头采集的视频源做编码,然后推到视频直播云上。

    • 观众端

      观众端使用的是拉流 SDK,观众需要的是把视频从服务端拉倒本地做解码,并展示到手机终端上。观众端还必须包括一个视频播放器。

      您也可以把以上的主播端和观众端打包到同一个 App 里,同时提供主播推流功能,又提供观众端拉流观看的功能。融云直播聊天室对于以上几种模式的支持都是完全相同的。

    融云聊天室 SDK

    • IMLib

      IMLib 是融云的 SDK 的一个产品组件,提供的是基础的通信能力,当使用融云聊天室的时候,您只需要简单调用初始化、连接、加入聊天室、发送消息等功能。

    • 直播聊天室 App 开源代码

      基于融云的 IMlib SDK,融云把常见的视频直播聊天室的常用功能封装成了一个 App,SealLive。在这个 App 内,融云实现了登录、连接、直播界面的显示、输入框、发送接收消息的处理流程,我们建议您直接使用这部分代码,可以大大的减轻整个聊天室 UI 的开发工作。

      Android 直播聊天室源码

      iOS 直播聊天室源码

    App 与 SDK 的逻辑关系

    集成融云 SDK 之前,请先了解 App 与 SDK 的逻辑关系,如下:

    image

    连接成功之后 (Android 为 connect 方法,iOS 为 connectWithToken 方法),融云提供两种加入聊天室的方式:

    1、 App Server 创建聊天室,客户端调用 joinExistChatRoom 加入聊天室,如果聊天室不存在,则加入不成功,需要 App Server 先调用 RongCloud Server 创建聊天室,如图:

    image

    如果聊天室已经存在,则可直接加入聊天室,如图:

    image

    2、 App Server 只管理聊天室 Id 列表,客户端调用 joinChatRoom 加入聊天室,如果聊天室不存在则自动创建。

    image

    App 服务器需要实现的功能

    • 管理用户体系和融云 userId 的映射关系

      融云不维护用户体系和好友关系,App 需要为您用户体系中的每个用户和融云的 userId 建立一一对应的映射关系。之后就可以根据 userId ,加入、退出聊天室并收发消息。

    • 实现从融云 Server 获取 Token 的逻辑,详细请查看获取 Token 方法

    • 根据 App 的产品逻辑,维护每个聊天室的信息和聊天室列表

    App 服务器还可以实现的功能

    通过调用融云 Server API 实现以下功能:

    • 创建、销毁聊天室。
    • 查询聊天室的信息。
    • 查询聊天室中的用户列表。
    • 设置聊天室用户用户禁言、封禁。
    • 设置消息敏感词。
    • 按消息类型设置消息优先级。

    App 客户端需要实现的功能

    • 初始化融云 SDK。
    • 加入、退出聊天室。
    • 初始化视频播放器(多家合作厂家可选)。
    • 调用融云 SDK 接口实现收发消息功能。
    • 实现文字、表情、点赞、鲜花等功能、UI 显示处理。

    其中,App 以上部分的功能和 UI 都已经实现并开源,可以开箱即用也可以随意定制。

    App 客户端还可以实现的功能

    通过融云 SDK 方法实现以下功能:

    • 自定义任意消息及其显示样式(也可以不显示)。
    • 客户端本地插入消息,而不发送出去。
    • 监听消息收发,App 可以按自己需求控制逻辑和 UI。
    • 后期可以很方便地集成 IMKit,快速扩展出单聊、群聊、黑名单、客服、VoIP 等功能。

    聊天室集成指南

    Demo 源码

    集成指南

    直播聊天室开发指南,请参考 iOS IMLib 开发指南Android IMLib 开发指南

    服务器相关接口

    详细请查看 Server 开发指南聊天室服务相关接口

    聊天室登录、重连问题

    登录聊天室是否要先连接融云

    必须先连接融云,所有接口都是连接融云后才可以调用。

    是否可以实现匿名登录

    从融云 SDK 的角度,都是需要确定一个 UserId 来与融云服务器连接,以保证其后所有的操作都有指向性。

    但作为 App 应用层来讲,可以不暴露融云的 UserId,所谓匿名就是以一个随机的或者说不跟你们应用帐号绑定的 UserId 来登录。

    断线情况如何处理

    进入聊天室后如果出现断开连接,当与融云服务器的连接恢复后,SDK 会尝试重连聊天室。重连过程不需要用户参与,用户可以设置聊天室状态监听,来获取聊天室重连的状态信息。


    聊天室消息问题

    进入时如何获取最新消息

    对于同一个聊天室,只存储该聊天室的 50 条最新消息,也就是说移动端用户进入聊天室时,最多能够拉取到最新的 50 条消息。

    可通过融云加入聊天室方法,设置获取历史消息条数,加入后可获取到对应条数的历史消息。

    详细请查看 Android 加入聊天室iOS 加入聊天室

    如何发送和接收聊天室消息

    详细请查看 iOS 发送与接收消息Android 发送与接收消息文档。

    如何发送用户进入聊天室消息

    如用户加入聊天室时,需要发送“XX加入聊天室”的通知消息,融云推荐使用自定义消息在客户端来实现,可以在消息体中附加其他需要的信息属性。也可以用既有的消息类型,无论何种只需要跟聊天消息区别开即可。

    如何往聊天室中发送通知消息

    往聊天室中发送通知消息是指用应用内的系统帐号向某聊天室发送通知消息,消息类型推荐使用自定义消息,通过调用 Server API 接口发送。

    发送方法请参考发送聊天室消息方法

    点赞、礼物消息问题

    如何发送展示点赞消息

    发送点赞消息推荐使用自定义消息类型,鉴于有些用户会连续点击,建议做消息合并机制处理。比如设置定时器,每 5 秒触发一次,将 5 秒内所有的点赞数一次性发出去,降低服务器压力,保证重要消息的畅达。另外点赞的动画效果可以参考我们的直播聊天室 Demo 源码:

    如何发送展示礼物消息

    发送礼物消息使用融云自定义消息类型实现,展示就是界面上的一个 View,完全可以根据你们的需求来自定义。因为聊天室类型的应用 UI 都是特殊定制的,作为融云 SDK 来讲,只是负责消息通知,并不负责 UI 绘制。

    自定义消息开发指南:


    聊天室用户信息显示

    如何显示用户昵称和头像

    融云不维护用户的信息,所以用户的昵称和头像信息都需要您自己来维护管理。详细请查看用户信息显示集成指南。

    如何显示用户列表

    用户列表显示逻辑是根据您的需求来确定。举一个例子:聊天室人数从几百到十几万不等,比如需求定为只显示 10 个用户的头像,那就可以根据用户等级或者加入时间的顺序,选取 10 个在线用户的信息来显示。可以由应用自己的服务器来维护这个用户列表,不定时通知给全体成员,也可以每个用户加入/退出聊天室时发送状态消息,由端上接收并维护这个列表。显示的方法也是移动端进行 UI 绘制。

    如何显示用户等级信息

    融云不维护用户的信息,所以关于用户信息和等级的显示,都需要您自己进行开发。通常有两种处理方式:

    1. 在收到消息需要展示用户信息的时候,您可以通过您的 Server 端接口获取到用户信息来展示。
    2. 用户在发送消息时把自己的信息附加到消息中,接收方通过解析消息获得用户信息。


    聊天室管理功能

    聊天室踢人功能实现

    可通过调用融云 Server API 聊天室封禁服务接口,实现将用户踢出聊天室。

    设置聊天室禁言用户

    可通过融云 Server API 接口,设置聊天室禁言用户,被禁言用户不能在聊天室中发送消息,详细请查看聊天室成员禁言服务

    聊天室成员自动退出机制

    聊天室中用户在离线 30 秒后或离线后聊天室中产生 30 条消息时会被自动退出聊天室。如应用场景中有驻留用户,不允许被自动退出聊天室,则需要将用户加入到聊天室白名单中。

    聊天室用户白名单设置方法

    可通过融云 Server API 接口,设置聊天室白名单,详细请查看聊天室用户白名单服务

    聊天室自动销毁机制

    聊天室中 1 小时无人说话时,同时没有人加入聊天室时,会把聊天室内所有成员踢出聊天室并销毁聊天室。

    聊天室不被自动销毁实现方式

    可通过融云 Server API 接口,设置需要保活的聊天室,设置后聊天室不会被自动销毁,详细请查看聊天室保活服务

    用户如何同时加入多个聊天室

    默认同一用户不能同时加入多个聊天室,可通过提交工单方式开启用户同时加入多个聊天室功能。同时,在开启多设备消息同步情况下,多端用户可同时加入到多个聊天室。

    如何动态获取聊天室在线人数

    调用 Server API 中的查询聊天室内用户方法,可通过返回值 total 获取聊天室中在线人数。

    聊天室消息进阶功能

    是否支持合并消息

    支持合并消息,以点赞消息来举例,用户不停的点击赞按钮时,您可以把用户点击数记录下来,然后在用户停止的时候或者利用计时器,每隔几秒钟把这些点赞信息组装一条自定义消息发送出去。接收方收到消息之后把次数等信息解析出来,做相应的展示。

    自定义消息开发指南请查看:

    消息的分级与抛弃模型

    当聊天室内人数众多,消息量会变得非常大,这时可能会出现服务端超过预设承载能力或者分发的消息量超过客户端消息接收能力的情况,这时,就需要引入消息分级机制。

    融云并没有对任何消息进行抛弃,但是在消息量极大的情况下,比如 1 万人到百万左右的聊天室内,消息并发量极大的情况下,每个用户端能收发到的消息和体验已经很有限,因此消息抛弃指的是确保用户端总是能收到最重要的消息,因此不重要的消息看起来就像是被抛弃了。

    在开发过程中,除官方的普通文本消息之外,开发者需要针对不同的消息类别定义不同的消息类型,以便通过消息的 ObjectName 设置消息分级。目前融云支持两级消息分类,分别是高优先级消息和低优先级消息。当发生消息抛弃行为时,优先抛弃低优先级消息。

    如何统计聊天室点赞消息数

    您可以通过开通服务端实时消息路由来实现此功能,用户在发送点赞消息时,这条消息同步给您的应用服务器。您的应用服务器通过消息类型来分析统计这些数据。

    查看服务端实时消息路由功能介绍

    如何实现消息回看功能

    如果直播聊天室中需要实现消息回看功能,则需要开通聊天室消息云端存储功能。开通成功后,可通过接口获取聊天室中历史消息,消息回看 UI 界面的展示需要由您自己实现。

    聊天室中存储的消息类型及自定义消息如何设置存储,请查看聊天室消息云端存储功能介绍

    如何保证重要消息不被丢弃

    目前有两种设置方式,可保证重要消息不被丢弃:

    1. 添加聊天室用户白名单,白名单中用户发送消息的优先级别最高,在服务器负载较高的情况下也不被丢弃。查看聊天室用户白名单功能介绍。

    2. 设置聊天室消息优先级,把不重要的消息设置为低优先级消息;这样高并发时保证高优先级消息先通过。查看聊天室消息优先级服务功能介绍。

    多端情况下退出聊天室

    多端情况下,一端退出聊天室其他终端是否同步退出聊天室?

    在开通了多端同时登录情况下,用户登录多个终端,加入聊天室后,如在一端退出聊天室,其他端不会同步退出,仍然可以收到聊天室中的消息,如果需要一端退出聊天室后,其他已登录的终端也一起退出聊天室,则需要在退出时发送一条命令消息通知其他端退出聊天室,此步骤需要开发者自行实现。

    另外,需要注意如果用户登录终端 A 后,加入了聊天室并在聊天室的会话界面中,这时用户又登录了终端 B ,但未进入聊天室会话界面,这时 A 、B 两个终端都会收接聊天室的消息,只是 B 端的聊天室消息不进行展示。如用户在 A 端退出聊天室,这时融云认为用户在 B 端仍然在聊天室中,会继续向 B 端发送聊天室消息。如果需要 B 端同时也退出聊天室,则需要 A 端在退出时发送一条命令消息通知其他端退出聊天室,此步骤需要开发者自行实现。