跟我一起开发商业级IM(1)—— 技术选型及协议定义

本文是商业级IM开发系列的第一篇,介绍技术选型和协议定义。作者探讨了通信协议(UDP、TCP、WebSocket、MQTT)和传输协议(JSON、XML、Protobuf)的优缺点,最终选择了TCP和Protobuf。通信框架选用Netty,通过protobuf定义通用消息格式。项目将包含Android服务端和客户端代码,未来可能添加iOS版本。
摘要由CSDN通过智能技术生成

技术选型及协议定义Banner

写在前面

终于可以开始写这个系列的文章了,本系列文章预计将分为13篇,由于IM涉及的知识点稍复杂,所以每个知识点都会单独用一篇文章来阐述,尽量讲透彻,方便大家理解。

灵魂拷问

  • 为什么需要写这个系列的文章呢?
    可能大家会问,有了之前的NettyChat开源一个自用的Android IM库,基于Netty+TCP+Protobuf实现,为什么还需要写这个系列的文章呢?主要是因为一开始开源NettyChat和发布文章的时候,旨在起一种抛砖引玉的作用,带领大家入门IM而已。而且一篇文章难以阐述所有的知识点,加上NettyChat也是一个Demo,有些代码写得不严谨。一年多以来,从群里的反馈、文章的评论可以看到大家对这一块知识有不少的需求,大家去集成NettyChat到自己项目里也比较麻烦,网上也缺乏完整的IM实现,大多是零零碎碎的知识点。所以打算从零开始,手把手教大家实现自己的IM系统。


  • 对比NettyChat有什么新增的功能和优化?
    根据大家的反馈,支持TCP/WebSocket、Protobuf/Json等。优化消息重发管理器,不再是一条消息一个Timer实现(严重浪费资源,影响程序性能)。另外,优化代码结构,提升可扩展性、可维护性等。


  • 项目包含服务端代码吗?
    这也是重新写本系列文章的重要原因,在本系列文章中,将包含Java服务端代码及Android代码,至于IOS,后续有时间会增加。文章完成后,会在Github开源三个项目,分别是:

  1. ims_kula[Android IM Service SDK]
  2. kulachat_server[Java 服务端]
  3. KulaChat[Android 客户端]


  • 为什么项目叫“Kula”?
    其实就是一时兴起,Kula是作者比较喜欢的SNK拳皇系列里的一个角色,没什么具体含义。附上Kula高清图:
    Kula

    大纲如图:
    跟我一起开发商业级IM——大纲

本系列文章将包含:

  • 技术选型及协议定义
  • 接口定义及封装
  • 粘包/粘包处理之自定义消息编解码器
  • 长连接稳定性之连接及重连
  • 心跳机制
  • 消息重发机制
  • 离线消息机制
  • 消息顺序控制
  • 数据库表设计
  • 单聊实现
  • 群聊实现
  • 系统消息实现
  • UI封装

本文为第一篇:技术选型及协议定义

项目架构

首先,讲一下项目整体架构以及使用到的开源框架。根据群里小伙伴的建议以及大家对JavaKotlin的熟悉程度,Android端开发语言还是采用Java,后续有时间会考虑用Kotlin开发一个版本。
由于项目未完成,目前是边写文章边写代码的方式,所以在后续项目完成后,会专门写一篇文章介绍项目架构,包括Android客户端Java服务端

Android客户端
项目整体采用MVP架构,用到的开源库如下:

  • RxJava 2.2.8
  • RxAndroid 2.1.1
  • Retrofit 2.8.1
  • GreenDao 3.3.0
  • Dagger 2.27
  • Butterknife 10.2.1
  • Glide 4.11.0
  • StatusBarUtil 1.5.1
  • BaseRecyclerViewAdapterHelper 3.0.4
  • AutoSize 1.2.1
  • Fastjson 1.1.71.android
  • LogginInterceptor 3.1.0-rc5
  • RxPermissions 0.10.2
  • Toasty 1.4.2
  • Background 1.6.5
  • EventCenter 1.0.1
  • NiceImageView 1.0.5
  • More…

Java服务端
还在开发中,就不一一列举了。
感谢以上开源库的作者。

以下的通信协议选型、传输协议选型、通信框架选型在开源一个自用的Android IM库,基于Netty+TCP+Protobuf实现文章中有说明过,但既然打算重新写本系列的文章,就在此重新讲解一下,一来加入自己新的理解,二来可以整合到本系列文章里。

以下所涉及的原理和理论知识,由于篇幅原因及作者水平有限,没办法详细阐述。本系列文章的着重点在于教大家怎么去实现自己的IM系统,至于偏理论的知识,作者帮大家找了一下原文链接,感兴趣的可以跳转原文阅读。同时感谢以下文章的作者。

通信协议选型

常用的通信协议有以下几种,分别简单地讲讲每种通信协议的优缺点及适用场景。

  • UDP

    • 简单概述
      UDP是一个面向报文的、非连接的协议,也就是无连接的。即发送数据前,双方无需建立连接,数据发送完毕后,也无需断开连接(没有连接可断开)。这样一来,减少了连接和断开连接的开销(无需像TCP一样连接时需要三次握手,断开连接时需要四次挥手)。同时,UDP不存在拥塞机制,即网络拥塞时,不会使源主机的发送速率降低。另外,UDP一个很大的特点就是尽最大努力交付(即不保证交付),也就是可能会存在丢包、乱序等情况。总的来说,UDP是一个不可靠的协议

    • 优点

    • 效率高
      由于UDP在发送数据前,无需建立连接,并且没有TCP一系列的确认机制、重传机制、拥塞机制

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值