为你的系统新增即时通讯功能

前言:

有段时间公司要求做一个即时通讯的一个功能,刚拿到这个功能的时候我是一头雾水的,不知道如何做,为了能够有更好的开发思路,我在极客时间上购买了【袁武林】的 即时通讯技术剖析与实战课程。

先来介绍一下袁武林吧!

  来自新浪微博,他主要在微博负责消息箱和直播相关的业务。

正文:

接上面一篇文章继续剖析即时通讯方面的内容: https://blog.csdn.net/tangthh123/article/details/104877794

 1.为你所需要的地方加上即时通讯功能

一般来说时候时候首先要定好一个好的消息收发通道,另外需要建立比原业务系统更加高效实时的消息收发通道。

具体解释:【发送方通过发送通道把消息从本地发送到 IM 服务端;IM 服务端通过接收通道把消息投递给接收方】

消息发送通道:

1.服务端提供一个API 接口,客户端发送消息的时候,调用这个接口 将消息转发给服务端。

2.服务端和客户端维持一个长连接。

重点在于 客户端需要调到服务端的接口 或者服务,这样消息就可以接收到。

消息接收通道:

这里存在一个问题,服务器发送方能够感知到有没有发送消息出去,但是用户没有办法实时知道,那么我们该如何解决这个问题呢?

这里就需要用到网关服务, 服务端的业务逻辑层用来处理消息的逻辑,而网关服务和消息接收方设备之间维护一条长连接(WebSocket),通过这个长连接 将消息发送给用户,对于用户不在线的情况还可以通过手机操作系统级别的辅助通道,把这条消息通过手机通知栏显示。

消息接收通道重点在于服务端和接收方之间 维护一个长连接,当由于网络原因连接被中断的时候,能够快速的感知到,并且在这个长连接里面 要确保我们的消息不会被丢失

消息发送通道和消息接收通道可以合并到一个通道中,也可以独立开来。

第二个就是消息存储。消息作为聊天的一个载体,为了能够查询历时消息记录 和离线消息 ,必然要对消息存储。

第三个就是消息索引。就拿微信聊天来说 一个是消息发送方,一个是消息的接收方。拿下面的再观看观看举例,再我们的系统中一个表用来消息内容,一个表用来存储消息的索引,也就是 id为 1 的消息这条数据  ,在索引表有俩条对应的数据,用来区分发送方和接收方,这样的话,即使消息的发送方在消息列表里将消息删除,对于消息接收方来说没有影响。

第四个就是联系人列表。 

除了上面讲的消息,一个IM 还需要有一个完整的联系人列表,需要更新最近联系人,查询联系人列表的时候需要查询接收方最近的一条消息,消息索引这些更加适用于查询消息记录的场景。

还是上面那个例子,我给一个用户发送消息,需要做几件事情,第一个是消息表存储消息内容消息索引表存储消息接收方 发送方的记录,同时还要更新 我和另外一个人的最近联系人表

更新最近联系人表的时候,如果俩个用户之间没有聊天记录,那么新插入一条联系人记录,如果俩个用户之间有过聊天记录,那么只需要更新最新的一条聊天消息,俩个用户的联系人列表都需要更新。

第五个就是 消息未读数

有俩种情况我们无法感知到有人给我们发送了消息,第一种就是在手机上设置不在通知栏上显示消息,第二就是没有点到软件里面去,我们也不知道有人给我们发了消息,这个时候就引入到了一个消息未读数的统计,主要统计俩个数据,一个是总的未读数,还有一个是我和某个用户的未读数。

也就是说我们还需要去监控这个消息的未读数,我给一个用户发送消息,那么我与该用户的消息未读数+1,当消息接收方打开聊天界面的时候,我与该用户的未读数应该-1,并且总的未读数应该也要-1.

发布了62 篇原创文章 · 获赞 49 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/tangthh123/article/details/104914718