如何搭建一个自己的IM即时通讯聊天软件?

编者按:“眼睛看完这篇稿子:我会了。大脑和键盘手:你放屁。”这是一个要不要自己造轮子的命题,如果要满足安全、稳定、100%不丢消息、亿级高并发,还是推荐传统的IM云服务商,环信即时通讯云五一大促,首月只需88元,赶紧免费体验:/product/im

笔者 2019 年参加了一次 Gopher 大会,有幸听探探的架构师分享了他们 2019 年微服务化的过程。

本文快速搭建的 IM 系统也是使用 Go 语言来快速实现的,这里先和各位分享一下探探 App 的架构图:

本文的目的是帮助读者较为深入的理解 Socket 协议,并快速搭建一个高可用、可拓展的 IM 系统(文章标题纯属引人眼球,不是真的,请读者不要在意),同时帮助读者了解 IM 系统后续可以做哪些优化和改进。

麻雀虽小,五脏俱全,该 IM 系统包含基本的注册、登录、添加好友基础功能,另外提供单聊、群聊,并且支持发送文字、表情和图片,在搭建的系统上,读者可轻松的拓展语音、视频聊天、发红包等业务。

为了帮助读者更清楚的理解 IM 系统的原理:

  • 第一节深入讲解 WebSocket 协议,WebSocket 是长链接中比较常用的协议。

  • 第二节讲解快速搭建 IM 系统的技巧和主要代码实现。

  • 第三节对 IM 系统的架构升级和优化提出一些建议和思路。

  • 最后章节做本文的回顾总结。

Web Sockets 的目标是在一个单独的持久连接上提供全双工、双向通信。在 Javascript 创建了 WebSocket 之后,会有一个 HTTP 请求发送到浏览器以发起连接。

在取得服务器响应后,建立的连接会将 HTTP 升级从 HTTP 协议交换为 WebSocket 协议。

在使用 WebSocket URL 时,必须带着这个模式,因为将来还有可能支持其他的模式。

使用自定义协议而非 HTTP 协议的好处是,能够在客户端和服务器之间发送非常少量的数据,而不必担心 HTTP 那样字节级的开销。由于传递的数据包很小,所以 WebSocket 非常适合移动应用。

上文中只是对 Web Sockets 进行了笼统的描述,接下来的篇幅会对 Web Sockets 的细节实现进行深入的探索。

本文接下来的几个小节不会涉及到大量的代码片段,但是会对相关的 API 和技术原理进行分析,相信大家读完下文之后再来看这段描述,会有一种豁然开朗的感觉。

“握手通道”是 HTTP 协议中客户端和服务端通过"TCP 三次握手"建立的通信通道。

客户端和服务端使用 HTTP 协议进行的每次交互都需要先建立这样一条“通道”,然后通过这条通道进行通信。

我们熟悉的 Ajax 交互就是在这样一个通道上完成数据传输的,只不过 Ajax 交互是短连接,在一次 Request→Response 之后,“通道”连接就断开了。

下面是 HTTP 协议中建立“握手通道”的过程示意图:

上文中我们提到:在 Javascript 创建了 WebSocket 之后,会有一个 HTTP 请求发送到浏览器以发起连接,然后服务端响应,这就是“握手“的过程。

在这个握手的过程当中,客户端和服务端主要做了两件事情:

建立了一条连接“握手通道”用于通信:这点和 HTTP 协议相同,不同的是 HTTP 协议完成数据交互后就释放了这条握手通道,这就是所谓的“短连接”,它的生命周期是一次数据交互的时间,通常是毫秒级别的。

将 HTTP 协议升级到 WebSocket 协议,并复用 HTTP 协议的握手通道,从而建立一条持久连接。

说到这里可能有人会问:HTTP 协议为什么不复用自己的“握手通道”,而非要在每次进行数据交互的时候都通过 TCP 三次握手重新建立“握手通道”呢?

答案是这样的:虽然“长连接”在客户端和服务端交互的过程中省去了每次都建立“握手通道”的麻烦步骤。

但是维持这样一条“长连接”是需要消耗服务器资源的,而在大多数情况下,这种资源的消耗又是不必要的,可以说 HTTP 标准的制定经过了深思熟虑的考量。

到我们后边说到 WebSocket 协议数据帧时,大家可能就会明白,维持一条“长连接”服务端和客户端需要做的事情太多了。

说完了握手通道,我们再来看 HTTP 协议如何升级到 WebSocket 协议的。

升级协议需要客户端和服务端交流,服务端怎么知道要将 HTTP 协议升级到 WebSocket 协议呢?它一定是接收到了客户端发送过来的某种信号。

下面是我从谷歌浏览器中截取的“客户端发起协议升级请求的报文”,通过分析这段报文,我们能够得到有关 WebSocket 中协议升级的更多细节。

首先,客户端发起协议升级请求。采用的是标准的 HTTP 报文格式,且只支持 GET 方法。

下面是重点请求的首部的意义:

其中 Connection 就是我们前边提到的,客户端发送给服务端的信号,服务端接受到信号之后,才会对 HTTP 协议进行升级。

那么服务端怎样确认客户端发送过来的请求是否是合法的呢?在客户端每次发起协议升级请求的时候都会产生一个唯一码:Sec-WebSocket-Key。

服务端拿到这个码后,通过一个算法进行校验,然后通过 Sec-WebSocket-Accept 响应给客户端,客户端再对 Sec-WebSocket-Accept 进行校验来完成验证。

  • 通过 SHA1 计算出摘要,并转成 base64 字符串。

258EAFA5-E914-47DA-95CA-C5AB0DC85B11 这个字符串又叫“魔串",至于为什么要使用它作为 WebSocket 握手计算中使用的字符串,这点我们无需关心,只需要知道它是 RFC 标准规定就可以了。

官方的解析也只是简单的说此值不大可能被不明白 WebSocket 协议的网络终端使用。

我们还是用世界上最好的语言来描述一下这个算法吧:

}

.支持联系人状态(在线、离开、离线、忙碌、电话、会议…) .支持会话 .支持邀请多人会话 .支持表情图标 .支持字体与颜色 .支持截图发送 .支持点对点文件发送(Internet上平均传输文件为60KB/秒) .支持点对点文件断点续传 .支持语音交流 .支持视频交流 .查找好友 .显示商务好友信息 .支持消息广播 .留言消息提醒,对方不在线情况下可以留言,对方上线时得到留言提醒 .自定义群组 .自定义个人档案信息 .支持多人语音视频会议 .支持服务器Linux\Win08 历史信息管理 通讯记录,查看历史聊天记录和文件发送接收记录 短信中心 1)一对一手机短信发送(中国移动、中国联通手机) 2)手机短信群发(中国移动、中国联通手机) Web客户端 内嵌Web网页浏览 语言版本 1)支持简体中文操作界面,包括客户端和服务端 2)支持英文操作界面,包括客户端和服务端 应用领域: 1. 高稳定性,高负载大用户量在线即时通信环境。 2. 面向高端商务,商贸,音乐娱乐各行业门户网站。 3. P2P 互动游戏数据交换. 4. 已有会员整合,"一站式" 服务应用领域。 5. 远程教学,医疗咨询,企业文件传输与管理,视频监控,网络电话等应用。 6. 和企业已有软件项目结合(ERP\CRM\SCM) 已经使用的企业: 上海XXX多媒体技术有限公司、上海XX传媒广告有限、上海XXX网络科技有限公司、青岛XXX软件科技有限公司、外X网、上海XXX服饰有限公司、 广州X打折网 、广州X下载网、北京X房产网、北京X龙旅游信息技术有限公司、北京X网络有限公司... 通讯协议: 1)底层通讯基于TCP/IP协议。 2)文件传输基于UDP协议。Internet中传输文件速度与QQ相当,内网传输文件最快,比QQ快点。 3)客户端之间消息交换基于P2P技术(点对点) 4)应用网络地址转换(NAT)技术,局域网和Internet之间自由通讯. 5)穿透防火墙技术. [找出目标进程] [找出SOCKET句柄] [用DuplicateHandle()函数将其SOCKET转换为能被自己使用] [用转换后的SOCKET进行数据传输] 服务端主要用于用户基本信息、在线状态、组织结构的信息保存。 不参与客户之间的信息交换(类似BT),服务器可以为分布式集群,如果数据库为SQL SERVER 2000以上版本可以使用故障转移(负载均衡)大大增强服务端的并发和负载,服务端用户登录数并发为1秒300。 服务器负载说明: 注册用户数量设计上是没有限制的,单服务器情况下允许同时在线用户100000以上。

}

我要回帖

更多关于 移动社交即时通讯IM 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信