微信插件之即时通讯系统设计

一、前言

微信是目前最流行的即时通讯工具之一,同时在微门户、企业管理等方面进行社交平台应用的扩展,尤其是企业号的发布,更确立了微信作为企业信息化管理的一种延伸和支持。

二、功能特点

本文将围绕需求之一,即内部群组聊天展开,具体功能包括:

1、       多群组聊天,用户基于微信通讯录;

2、       支持表情功能;

3、       可以发送文字、图片、文件、视频等信息;(其中图片、文件、视频作为二期实现);

4、       聊天历史记录查询;

三、功能设计

1、整体框架

1)       模块定义


2)       组件定义

整个插件系统主要包含以下几个组件(类似于vs的项目工程):




2、数据通讯流程


聊天的信息交互都采用业界即时通讯普遍的方式,Socket通信模式实现,整体框架分客户端和服务器端:

Ø  客户端采用html5中的WebSocket组件;

Ø  服务器端采用C#编写,并以window服务的方式部署和运行;

通讯流程:


1)       客户端连接

客户端在第一次连接时,通知服务器端,进行“握手”操作。传送的数据包格式定义:

<wxchatmessage>
         <action>connect</action>
         <!--群组id-->
         <groupid></groupid>   
         <!--发送者标识-->
         <fromusesrid></fromusesrid >   
         <type>text</type>
         <content>内容</content>
         <createdatetime>发送时间</createdatetime>
</wxchatmessage >


返回结果:

<wxchatmessage>
         <action>connect</action>
         <result>ok</result>     //result:ok,error
</wxchatmessage >

2)       客户端数据发送

客户端连接上服务器端后,将发送相关信息,发送的数据报格式:

<wxchatmessage>
         <action>send</action>
         <!--群组id,如果为空,则表示点对点聊天,touserids必须不为空-->
         <groupid></groupid>   
         <!--发送者标识-->
         <fromusesrid></fromusesrid >   
         <touserids></touserids>          //接收者标识,如为空,则所有人;不为空,则表示私聊
         <type>text</type>    //text:文本、image:图片、file:文件、voice:音频;
         <content>内容</content>      //type=text显示;
         <media>                      //type=text,image,file,voice  支持多个
                   <url></url>      //type=text,image,file,voice
                   <title></title>           //type=file
</media> //type=image |voice
         <createdatetime>发送时间</createdatetime>
</wxchatmessage >

3)       服务器端数据接收

服务器端接收数据来自客户端的数据后,首先解析发送过来的数据包,根据数据包定义进行发送(给客户端);

a、       解析客户端发送过来的数据;

b、       将发送的数据存入缓存;

4)       服务器端数据发送(给客户端)

服务器端的数据解析后,判断touserids和groupid,根据groupid来判断该消息发送给哪个群组;

根据touserids,判断是发送给指定群组中的哪些人,就是私聊;

<wxchatmessage>
         <action>receive</action>
         <!--发送者标识-->
         <fromusesrid></fromusesrid >
         <touserid></touserid>              //单个接收者标识
         <type>text</type>    //text:文本、image:图片、file:文件、voice:音频;
         <content>内容</content>      //type=text显示;
         <media>                      //type=text,image,file,voice  支持多个
                   <url></url>      //type=text,image,file,voice
                   <title></title>           //type=file
</media> //type=image |voice
         <createdatetime>发送时间</createdatetime>
</wxchatmessage >

5)       客户端接收消息

客户端接收来自于服务器端发送的消息。

a、       根据html5的websocket中的onmessage事件获取服务器端发送的信息;

b、       根据数据包的格式定义解析;

c、       将解析后的内容呈现在对话窗口中;

6)       客户端断开

客户端断开后,发送数据包通知服务器端。数据包格式:

<wxchatmessage>
         <action>disconnect</action>
         <!--群组id-->
         <groupid></groupid>   
         <!--发送者标识-->
         <fromusesrid></fromusesrid >   
         <type>text</type>
         <content>内容</content>
         <createdatetime>发送时间</createdatetime>
</wxchatmessage >


3、数据存储

1)       消息文本存储

在利用Socket数据通讯过程中,是不保存数据的,如实现历史记录查询,必须对所有的内容进行存储。

存储的方式将采用间隔定时存储,将缓存中的内容存储到数据库中。通知存储的方式将采用windows服务。

存储流程:

a、       读取指定条数缓存中最旧的队列数据,转换成DataTable批量存储到数据库中(sqlbulkcopy方法);

b、       在缓存中删除已存入数据库的队列数据;

2)       多媒体(media)存储

所有的多媒体文件直接上传到服务器目录下,保存时间保留5天。

多媒体数据定时存储到数据库中。

4、对话窗口

   

1)       第一次进入

用户第一次进入聊天界面时,会从数据库获取该组聊天的最新x条历史记录。

根据用户id,获取头像、昵称;通过用户id调用微信接口获取。此处一定要将用户信息缓存起来,使得用户信息有效期保留24小时;

建立socket连接,发送客户端数据包;

2)       发送文本消息

调用消息时,根据发送类型,组装数据包。

调用html5的websocket中onsend事件,发送数据包到服务器端;

3)       发送表情

所有的表情符号,使用编码表示,如微笑图标:[微笑]等

在对话框中显示的时候,进行语义转换;

也是文本类消息的一种。

4)       发送文件(该功能仅限Android版本微信使用)

将手机端的文件上传给其他用户;

上传流程:

a、       选择本机文件,点击上传;

b、       上传到服务器,并返回url和文件名信息;

c、       再将这些信息包装成通讯数据包发送给服务器端;

d、       服务器端再发送给接收客户端;

5)       发送图片

发送图片将直接调用微信的js-sdk,图片来源有2种,一种是手机图片,还有一种是直接拍摄后获取。

基本流程与发送文件一致,详见微信js-sdk开发文档。

6)       发送音频

发送音频将直接调用微信的js-sdk,音频来源是直接录音;

基本流程与上传图片类似,详见微信js-sdk开发文档;


四、数据定义

1、外部数据

系统涉及到的外部数据,主要包括用户基本信息和用户组信息;

用户基本信息获取依赖于微信,并通过微信接口调用;

用户组信息获取依赖于微信,并通过微信接口调用;

2、数据通讯包定义

详见“数据通讯流程”章节。

3、数据表定义

1)       数据表:ChatInfo

代码

注释

数据类型

长度

ID

主键

int

 

Content

信息内容

Nvarchar

500

CreateDatetime

时间

datetime

 

FromUserId

发送者账号(微信登录账户)

nvarchar

50

ToUserId

接收者账号(微信昵称);可多个,英文逗号分隔。

nvarchar

50

GroupId

分组标识

nvarchar

50


五、适用条件

本插件所适用的微信版本号为6.1(含)以上。

本插件适用于iOS 和 Android操作系统,除文件上传无法适用于Android版微信。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebIM说明 WebIM是一款基于jQuery的一款web即时通讯插件,姑且这么称呼吧。插件最大程度实现了IM的常用功能,除即时通讯的常用功能外,还加入了:消息盒子、窗口抖动、添加删除好友、最近联系人、超时登录界面、网站小秘书、聊天记录、发送频率限制、发送产品、发送名片、发送表情、产品分享、黑名单、举报、收藏、公告、智能网址过滤、消息提醒、修改资料、名片二维码、禁止粘贴、收起联系人列表、推荐好友等30余项改进。全浏览器兼容。 插件调用简单方便,只需在现有的web系统中加入几行代码,理论上可嵌入任何web系统。 2012年项目,已不再维护。 配置 $(function() { $(document).FnWebIM({ autoLogin :true, //boolean型,默认是否自动登录,true:自动登录,false:手动登录,默认为true msgRefreshTime :1000, //number型,消息刷新时间,单位为ms friendRefreshTime :10000, //number型,好友刷新时间,单位为ms showSecretary :true, //boolean型,默认是否显示小秘书,true:显示,false:不显示,默认为true noticeContent :"唐僧师徒历经千辛万苦,终于见到了佛祖……", //string型,公告内容 为空时不显示公告 sendPicture :true, //boolean型,是否允许发送图片,true:允许,false:不允许,默认为true msgMaxSize :300, //number型,单条消息最大允许字符 msgSound :false, //boolean型,是否开启声音提醒,true:开启,false:关闭,默认为true defaultWindow :"" //string型,登录后打开新聊天窗口,此处接收的参数为联系人的uid,否则会出错 }); }); 详细说明文档 http://www.zi-han.net/case/im/help.html 示例 http://www.zi-han.net/developer/721.html 注意 请在服务器(如localhost)环境下打开
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值