WebIM sdk简介

说明:文档简单介绍一下webim sdk的功能以及项目结构。

整体概述

环信imsdk具备完善的即时通讯能力,兼容IE8+、FireFox10+、Chrome54+、Safari6+ 浏览器,可以与Android、IOS SDK的互通,支持文本、表情、图片、音频、地址消息,对外提供简洁易用的API,方便开发者在不关注im本身实现的情况下快速集成,拥有即时通讯能力。

工程设计

基本要素

  • 连接管理
  • 消息
  • 会话
  • 好友管理
  • 通知
  • 实时音视频
  • 扩展

工程架构

1.连接管理
长连接与短连接

文本消息走socket长连接,附件、视频、语音富媒体消息先将文件通过http上传服务器,然后拿到文件url,通过文本消息将url发送给对方,接收方下载完文件后进行ui展示。

2.心跳保活,定时通知服务器连接存在。
3.重连,可配置重连此时,间隔时间。始终保持同一个连接实例。
4.消息
发送消息

支持多种类型消息text、image、video、file、扩展消息,发送消息有消息回执。对方不在线、没有消息回执、消息体内含有离线标识会当成离线消息存储,客户端可拉取离线消息。

5.好友管理
添加好友

通过rest接口支持添加好友、删除好友、黑名单管理、群组管理。

6.通知,新消息、已读、已送达通知,好友增减、群组聊天室相关通知。

整体结构

如图展示sdk项目整体结构,dist存放打包后文件,jsdoc存放API文档,node_modules存放项目依赖包,src存放项目源文件,.babelrc、.gitignore、jsdoc.sh为项目配置文件,package.json、package-lock.json 定义项目所需要的各种模块,以及项目的配置信息,index.js为sdk的入口文件。


sdk整体结构

模块划分及说明

sdk目录下index.js是sdk的入口文件,对外暴露webim对象。src文件下是sdk的源文件,allnode.js是私有协议msync定义的数据格式;status.js是存放的状态码;utils里是封装的一些工具函数;connection.js和chat、muc、roster、statistics模块是负责处理具体业务的。其中connection.js是sdk的主文件,接收服务端消息,解析到meta后判断是什么消息类型,然后分发给chat、muc、roster、statistics去处理,各个模块处理完之后将构建的消息传给监听函数,应用层可以在相应的监听函数内拿到消息,再根据业务需要进行处理。chat模块负责收发消息,muc模块负责处理群组相关的通知,roster负责处理操作好友的通知,statistics负责处理报错信息;

  • connection.js, 是sdk的主文件,包括功能:登录登出,socket连接以及重连,注册监听事件,分发消息,好友操作、群操作、拉取历史消息等rest接口。sdk在收到服务端消息时按类型分发给不同模块进行处理,其中meta.ns == "CONFERENCE" 时为rtc信令,调用webrtcSDK注册在conn对象上的registerConfrIQHandler方法来处理消息。webrtcSDK在发送信令时拿到全局变量WebIM上的conn,调用conn上的send方法进行发送。

  • chat模块,chat模块分为handleChatMessage.js和sendChatMessa.js两部分。
    1、sendChatMessage.js接收参数

//以文本消息为例
{
  ext: {},
  fail: function(){},
  succsess: function(){},
  id: "",
  msg: "",
  type: "",
  to: ""
}

构建消息体并发送。

2、handleChatMessage.js接收聊天消息的meta,解析成json格式

//以文本消息为例
{
   id: msgId,
   type: type,
   from: from,
   to: to,
   data: text,
   ext: ext,
   sourceMsg: text, 
   error: errorBool,
   errorText: errorText,
   errorCode: errorCode
}

将消息传给不同的消息监听函数。

  • muc 模块,接收群组操作通知的meta,解析成json格式
//以禁言通知为例
{
  type: 'addMute',
  owner: thirdMessage.from.name,
  gid: thirdMessage.mucId.name,
  from: thirdMessage.from.name,
  fromJid: thirdMessage.from,
  to: thirdMessage.to.length?thirdMessage.to[0].name:'',
  toJid: thirdMessage.to,
  chatroom: thirdMessage.isChatroom,
  status: thirdMessage.status
}

并根据不同类型构建成不同的消息,最后将消息传递给监听函数onPresence

  • roster 模块,有两个函数operatRoster发送操作好友通知,handleMessage处理收到的好友操作通知。
    operatRoster接收参数option, type
//以加入黑名单为例
option = {
  to: "user"
}
type = "ban"

handleMessage函数接收好用操作的meta,解析并构建成json格式通知

{
//  以加好友为例
 type: "subscribe",
 to: thirdMessage.to[0].name,
 from: thirdMessage.from.name,
 status: thirdMessage.reason
}

传给监听函数onPresence。

  • statistics 模块接收meta.ns == "STATISTIC"时的meta, 解析并构建json格式通知消息
error = {
  type: _code.WEBIM_CONNCTION_USER_REMOVED
};

传给监听函数onError。

对外依赖

  • Base64 使在ie9可以使用base64
  • long 解决msgId、metaId过长
  • protobufjs 用于传输二进制数据
  • sockjs-client 为websocket在不同浏览器做兼容
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,944评论 0 15
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,142评论 1 32
  • 1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构? 基本数据类型:Undefined、Nul...
    极乐君阅读 5,598评论 0 106
  • 即时通讯系列阅读 即时通讯基础 即时通讯:XMPP基础 即时通讯:XMPP项目实践-微聊 Smack类库最好的学习...
    JackChen1024阅读 1,986评论 2 9
  • 2017.02.22 可以练习,每当这个时候,脑袋就犯困,我这脑袋真是神奇呀,一说让你做事情,你就犯困,你可不要太...
    Carden阅读 1,378评论 0 1