即时通讯(Instant Messaging)是一种基于互联网的即时交流消息的业务。

实时聊天交互功能是市面上主流APP的重要功能之一,人们所熟悉的就是微信,QQ的聊天消息系统,IM看似简单,技术开发绝非易事,海量并发,超低延时,消息必达等高实时性需求需要众多技术的应用合体;

IM结合RTC可以实现直播间场景的实时互动,感兴趣的小伙伴可以查阅RTC系列专题教程,结合需求进行IM+RTC服务联动的场景开发;

本文介绍如何使用 ZIM SDK 快速实现基本的消息收发功能。

1 方案介绍

ZIM SDK 提供了如下接入方案:

在此方案中,您需要通过您自己的业务系统实现以下业务逻辑:

  • 搭建客户端的用户管理逻辑,并下发用户 ID 用于客户端登录。
  • 鉴权 Token,建议由您的业务后台自行实现,保证鉴权数据安全。

2 项目准备

2.1 创建项目

进入即构官网,在【ZEGO控制台】创建项目,并申请有效的 AppID,这一步很关键,appid为应用的唯一标识,如身份证号,是应用的身份证明,用于明确你的项目及组织身份。zego提供的服务也是基于APP ID;

App ID的获取方式很简单,只需3~5分钟,在即构官网-我的项目-创建即可。创建的项目信息可用于SDK的集成和配置;

2.2 Token 鉴权

登录房间时必须 使用 Token 鉴权 ,可参考 Token 鉴权教程

为了方便开发阶段的调试,开发者可直接在 ZEGO 控制台获取临时 Token(有效期为 24 小时) 来使用,详情请参考 控制台(新版) - 项目管理 中的 “项目信息”

3 集成 SDK

3.1 新建项目

此步骤以如何创建新项目为例,如果是集成到已有项目,可忽略此步。

1.创建一个文件夹作为项目文件夹,结构类似如下:

├── assets
│ ├── css
│ │ └── index.css # 页面的样式
│ └── js
│ ├── biz.js # 实现 im 业务功能
│ └── zim.js # zim sdk
├── index.html # 应用的前端页面文件

2.将以下代码拷贝到 “index.html” 文件中。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="renderer" content="webkit" />
<title>ZIM</title>
<link rel="stylesheet" href="assets/css/index.css" />
</head> <body></body> <script src="./assets/js/zim.js"></script>
<script src="./assets/js/biz.js"></script>
</html>

3.用浏览器打开 “index.html” 文件。

3.2 导入 SDK

使用 npm 获取 SDK

1.执行 npm i zego-zim-web 命令安装依赖。

a.npm 下载包支持 typescript 语言(推荐)。

b.如果在 macOS 或 Linux 系统中执行 npm 命令失败,提示 “permission denied”,请在 npm 命令前加上 sudo 重新执行即可。

导入 SDK。

import { ZIM } from 'zego-zim-web';

const ZIM = require('zego-zim-web').ZIM;

4 实现基本收发消息

以下流程中,我们以客户端 A 和 B 的消息交互为例,实现 1v1 通信功能:

API的正确调用时序是保证消息实时发送和接收的关键,也是用户实时“交互”体验的重要因素。

故开发者需按照以下完整时序图进行调用:

4.1 实现流程

1. 创建 ZIM 实例

首先我们需要在项目中创建 ZIM 实例,一个实例对应的是一个用户,表示一个用户以客户端的身份登录系统。

例如,客户端 A、B 分别调用 create 接口,传入 AppID,创建了 A、B 的实例:

// 创建 ZIM 对象,传入 AppID

var appID = xxxx;

var zim = ZIM.create(appID)

2. 监听回调事件

在客户端登录前,开发者可以通过调用 on 接口,自定义 ZIM 中的事件回调,接收到 SDK 异常、消息通知回调等的通知。

// 错误消息回调
zim.on('error', function (zim, errorInfo) {
console.log(errorInfo.code, errorInfo.message);
}); // 连接状态变更回调
zim.on('connectionStateChanged', function (zim, state, event, extendedData) {
console.log(state, event, extendedData);
}); // 房间状态变更回调
zim.on('roomStateChanged', function (zim, state, event, extendedData, roomID) {
console.log(roomID, state, event, extendedData);
}); // 成员加入房间回调
zim.on('roomMemberJoined', function (zim, memberList, roomID) {
console.log(memberList, roomID);
}); // 成员离开房间回调
zim.on('roomMemberLeft', function (zim, memberList, roomID) {
console.log(memberList, roomID);
}); // 收到房间消息回调
zim.on('receiveRoomMessage', function (zim, messageList, fromRoomID) {
console.log(messageList, fromRoomID);
}); // 收到单聊通信的消息回调
zim.on('receivePeerMessage', function (zim, messageList, fromUserID) {
console.log(messageList, fromUserID);
}); // 令牌即将过期的提醒回调
zim.on('tokenWillExpire', function (zim, second) {
console.log(second);
// 可以在这里调用 renewToken 接口来更新 token
// 新 token 生成可以参考上文
zim.renewToken(token)
.then(function(token){
// 更新成功
})
.catch(function(err){
// 更新失败
})
});
3. 登录 ZIM

创建实例后,客户端 A 和 B 需要登录 ZIM,只有登录成功后才可以开始发送、接收消息、更新 Token 等。

客户端需要使用各自的用户信息和 Token 进行登录。调用 login 接口进行登录,传入用户信息 ZIMUserInfo 对象,以及 Token 进行鉴权,鉴权通过后才能登录成功。

“userID”、“userName” 支持开发者自定义规则生成。建议开发者将 “userID” 设置为一个有意义的值,可将其与自己的业务账号系统进行关联。

如果 Token 过期,需要在 tokenWillExpire 即将过期回调接口中,调用 renewToken 接口,更新 Token 后才能正常使用 SDK。

// 登录时,需要开发者 按照 基础功能中的 "使用 Token 鉴权" 文档生成 token 即可

// userID 和 userName,最大 32 字节的字符串。仅支持数字,英文字符 和 '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '=', '-', '`', ';', '’', ',', '.', '<', '>', '/', ''。

var userInfo = { userID: '', userName: '' };

var token = '';

zim.login(userInfo, token)

.then(function () {

// 登录成功

})

.catch(function (err) {

// 登录失败

});

4. 发送消息

客户端 A 登录成功后,可以向客户端 B 发送消息。

目前 ZIM 支持的消息类型如下:

消息类型 说明
ZIMMessage 基类消息,包含如下属性:priority:消息优先级。type:消息类型。messageID:标识这条消息的唯一 ID。timestamp:发送时间。message:消息内容。senderUserID:消息发送者。conversationID:会话的 ID。conversationType:会话类型。
ZIMTextMessage 文本消息,是在基类的基础上添加了一个 String 类型的 “message” 参数,消息大小不超过 32 KB,发送频率限制为 10 次/秒。
ZIMCommandMessage 开发者可自定义数据类型的信令消息。信令消息是在基类的基础上添加了一个 Byte/Data 类型的 “message” 参数,消息大小不超过 5 KB,发送频率限制为 20 次/秒。

当前 Web/小程序(版本均为 1.2.0)的 SDK ,仅支持信令消息,不支持文本消息类型;同时也不支持发送离线消息的功能。

如果开发者需要使用 “Web/小程序”(当前 SDK 最新版本均为 1.2.0)SDK、与其它平台(iOS/Android/macOS/Windows 平台,当前 SDK 最新版本均为 2.0.0)SDK 进行消息互通,请统一使用信令(即 ZIMCommandMessage)消息,保证消息畅通。

客户端 A 可以调用 sendPeerMessage 接口,传入客户端 B 的 userID、消息内容等信息,即可发送一条消息到 B 的客户端。

// 发送单聊信息
var messageObj = { priority: 1, type: 1, message: '消息内容' };
var toUserID = ''; zim.sendPeerMessage(messageObj, toUserID)
.then(function (message) {
// 发送成功
})
.catch(function (err) {
// 发送失败
});
5. 接收消息

客户端 B 登录 ZIM 后,将会收到在 on 回调中设置的 receivePeerMessage 监听接口,收到客户端 A 发送过来的消息。

// 收到单聊消息的回调
zim.on('receivePeerMessage', function (zim, messageList, fromUserID) {
console.log(messageList, fromUserID);
});
6. 退出登录

如果客户端需要退出登录,直接调用 logout 接口即可。

zim.logout();
7. 销毁 ZIM 实例

如果不需要 ZIM 实例,可直接调用 destroy 接口,销毁实例。

zim.destroy();

到这里,你已经完成了IM基本收发消息功能,快去找你的小伙伴互发消息体验吧~

ZEGO 提供 ZIM + RTC 服务联动的场景解决方案,公开语聊房、秀场直播等业务场景搭建的示例源码,帮助开发者能在极短的时间内搭建完美的业务场景。

同时ZIM提供免费体验版,点击联系商务获取体验资格,了解更多优惠活动;

获取Demo、开发文档、技术支持,访问即构文档中心

注册即构ZEGO开发者帐号,快速开始...

如何基于 ZEGO SDK 实现 Web 基本消息收发的更多相关文章

  1. 如何基于 ZEGO SDK 实现 Windows 一对一音视频聊天应用

    互联网发展至今,实时视频和语音通话越来越被大众所依赖. 今天,我们将会继续介绍如何基于ZEGO SDK实现音视频通话功能,前两篇文章分别介绍了Android,Flutter平台的实现方式,感兴趣的小伙 ...

  2. 如何基于ZEGO SDK 实现通话质量监测

    如何基于ZEGO SDK 实现通话质量监测 1 功能简介 在进行视频通话过程中,用户有时候会出现网络不好的情况,比如在进行多人视频通话或者多人唱歌时,我们需要实时显示用户的网络质量. 示例源码 请参考 ...

  3. 如何基于 ZEGO SDK 实现 Flutter 一对一音视频聊天应用?

    之前的文章发布了ZEGO SDK实现Android端音视频通话应用的开发教程,不少开发者反馈很实用,能不能也出一版Flutter的教程. 有求必应,这不小编来了- 我们封装了ZEGO Flutter ...

  4. 如何基于 ZEGO SDK 实现 Android 一对一音视频聊天应用

    疫情期间,很多线下活动转为线上举行,实时音视频的需求剧增,在视频会议,在线教育,电商购物等众多场景成了"生活新常态". 本文将教你如何通过即构ZEGO sdk在Android端搭建 ...

  5. 如何基于 ZEGO SDK 实现 Android 通话质量监测

    功能简介 在进行视频通话过程中,用户有时候会出现网络不好的情况,比如在进行多人视频通话或者多人唱歌时,我们需要实时显示用户的网络质量. 示例源码 参考 下载示例源码 获取源码. 相关源码请查看 &qu ...

  6. 基于ajax与msmq技术的消息推送功能实现

    周末在家捣鼓了一下消息推送的简单例子,其实也没什么技术含量,欢迎大伙拍砖.我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图: 先说说这个ajax长轮询,多长时 ...

  7. 基于MVC4+EasyUI的Web开发框架经验总结(11)--使用Bundles处理简化页面代码

    在Web开发的时候,我们很多时候,需要引用很多CSS文件.JS文件,随着使用更多的插件或者独立样式文件,可能我们的Web界面代码会越来越臃肿,看起来也很累赘,在MVC里面提供了一个Bundle的对象, ...

  8. 基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出

    数据的导入导出,在很多系统里面都比较常见,这个导入导出的操作,在Winform里面比较容易实现,我曾经在之前的一篇文章<Winform开发框架之通用数据导入导出操作>介绍了在Winform ...

  9. 基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用

    在前面介绍了两篇关于我的基于MVC4+EasyUI技术的Web开发框架的随笔,本篇继续介绍其中界面部分的一些使用知识,包括控件的赋值.取值.清空,以及相关的使用. 我们知道,一般Web界面包括的界面控 ...

  10. 转--基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用

    原文  http://www.cnblogs.com/wuhuacong/p/3317223.html 基于MVC4+EasyUI的Web开发框架形成之旅--界面控件的使用 在前面介绍了两篇关于我的基 ...

随机推荐

  1. 如何在AutoCAD Electrical中修改项目描述中的行号

    默认情况下,项目描述对话框中都会以行号+数字的形式显示,如下图所示: 1.打开记事本程序,按照以下格式收入文字: LINE1=设计 LINE2=制图 LINE3=校对 LINE4=审核 LINE5=工 ...

  2. 第1.3讲、什么是 Attention?——从点菜说起 🍽️

    假设你在一家餐厅点餐,菜单上有好多菜(句子中的每个单词),你现在要点菜(做决策),但不可能每道菜都吃一样多. 你会怎么做?你会: 看下菜单(获取所有信息) 根据自己的口味打分(我喜欢辣.不要太咸) 按 ...

  3. 精选 12 款开源、免费、美观的 Vue 后台管理系统模板!

    前言 在当前软件开发领域,Vue.js 凭借其高效.灵活和易于上手的特性,成为了前端开发的热门选择.对于需要快速搭建企业级后台管理系统的开发者而言,使用现成的 Vue 后台管理系统模板无疑是一个明智之 ...

  4. WPF绑定与通知属性到界面

    绑定与通知属性到界面 本文同时为b站WPF课程的笔记,相关示例代码 前言 在上一篇文章C#代码事件里面,我们介绍了利用给控件命名的方式,在后端代码中访问并修改属性.这样子直截了当,但是这样后端代码依赖 ...

  5. 超实用!Dify快速接入本地MCP服务

    Dify 可以通过插件实现 MCP 服务调用,而被调用的 MCP 服务基本可以分为以下两类: 通用 MCP 服务(非本地 MCP 服务). 本地 MCP 服务. 本地 MCP 服务指的是本地通过 Ja ...

  6. Java常用类Object

    1 package com.lv.study.pm; 2 3 public class TestObject { 4 5 public static void main(String[] args) ...

  7. cosbench工具使用方法

    一.Cosbench工具介绍 cosbench是intel开源的针对对象存储开发的测试工具 二.Cosbench安装 运行环境: 这里我们的系统是Centos7.6 依赖软件: JDK nmap-nc ...

  8. linux环境下的redis安装

    选择一个安装目录 cd /usr/src/redis/ 下载redis,下载路径的版本号可以改 wget https://download.redis.io/releases/redis-3.2.0. ...

  9. 从 DeepSeek 突然爆发,看数据开发的应用市场

    在数字化快速发展的当下,人工智能与数据技术不断迭代.近期,DeepSeek 凭借自身技术实力在市场中迅速崛起,为剖析数据开发应用市场提供了视角. DeepSeek 爆发:技术与市场的双重驱动 1.1 ...

  10. React 的 KeepAlive 实战指南:深度解析组件缓存机制

    Vue 的 Keep-Alive 组件是用于缓存组件的高阶组件,可以有效地提高应用性能.它能够使组件在切换时仍能保留原有的状态信息,并且有专门的生命周期方便去做额外的处理.该组件在很多场景非常有用,比 ...