• 教你轻松开发一个Andriod版即时通讯


    本文适合没有任何即时通讯(IM)开发经验的小白开发者阅读,文章将教你从零开始,围绕一个典型即时通讯(IM)系统的方方面面,手把手为你展示如何基于Netty+TCP+Protobuf来开发出这样的系统。非常适合从零入门的Android开发者。

     

    为什么使用TCP?

    这里需要简单解释一下,TCP/UDP的区别,简单地总结一下。

    优点:

        1)TCP:优点体现在稳定、可靠上,在传输数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完之后,还会断开连接用来节约系统资源。
        2)UDP:优点体现在快,比TCP稍安全,UDP没有TCP拥有的各种机制,是一个无状态的传输协议,所以传递数据非常快,没有TCP的这些机制,被攻击利用的机制就少一些,但是也无法避免被攻击。


    缺点:

        1)TCP:缺点就是慢,效率低,占用系统资源高,易被攻击,TCP在传递数据之前要先建立连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞机制等都会消耗大量时间,而且要在每台设备上维护所有的传输连接。
        2)UDP:缺点就是不可靠,不稳定,因为没有TCP的那些机制,UDP在传输数据时,如果网络质量不好,就会很容易丢包,造成数据的缺失。


    适用场景:

        1)TCP:当对网络通讯质量有要求时,比如HTTP、HTTPS、FTP等传输文件的协议, POP、SMTP等邮件传输的协议。
        2)UDP:对网络通讯质量要求不高时,要求网络通讯速度要快的场景。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询

     

    为什么使用Protobuf

    对于App网络传输协议,我们比较常见的、可选的,有三种,分别是json/xml/protobuf,老规矩,我们先分别来看看这三种格式的优缺点。

    优点:

        1)json:优点就是较XML格式更加小巧,传输效率较xml提高了很多,可读性还不错。
        2)xml:优点就是可读性强,解析方便。
        3)protobuf:优点就是传输效率快(据说在数据量大的时候,传输效率比xml和json快10-20倍),序列化后体积相比Json和XML很小,支持跨平台多语言,消息格式升级和兼容性还不错,序列化反序列化速度很快。


    缺点:

        1)json:缺点就是传输效率也不是特别高(比xml快,但比protobuf要慢很多)。
        2)xml:缺点就是效率不高,资源消耗过大。
        3)protobuf:缺点就是使用不太方便。


    在一个需要大量的数据传输的场景中,如果数据量很大,那么选择protobuf可以明显的减少数据量,减少网络IO,从而减少网络传输所消耗的时间。考虑到作为一个主打社交的产品,消息数据量会非常大,同时为了节约流量,所以采用protobuf是一个不错的选择。

    为什么使用Netty

    首先,我们来了解一下,Netty到底是个什么东西。网络上找到的介绍:Netty是由JBOSS提供的基于Java NIO的开源框架,Netty提供异步非阻塞、事件驱动、高性能、高可靠、高可定制性的网络应用程序和工具,可用于开发服务端和客户端。

    为什么不用Java BIO?

        1)一连接一线程:由于线程数是有限的,所以这样非常消耗资源,最终也导致它不能承受高并发连接的需求。
        2)性能低:因为频繁的进行上下文切换,导致CUP利用率低。
        3)可靠性差:由于所有的IO操作都是同步的,即使是业务线程也如此,所以业务线程的IO操作也有可能被阻塞,这将导致系统过分依赖网络的实时情况和外部组件的处理能力,可靠性大大降低。


    为什么不用Java NIO?

        1)NIO的类库和API相当复杂,使用它来开发,需要非常熟练地掌握Selector、ByteBuffer、ServerSocketChannel、SocketChannel等。
        2)需要很多额外的编程技能来辅助使用NIO,例如,因为NIO涉及了Reactor线程模型,所以必须必须对多线程和网络编程非常熟悉才能写出高质量的NIO程序。
        3)想要有高可靠性,工作量和难度都非常的大,因为服务端需要面临客户端频繁的接入和断开、网络闪断、半包读写、失败缓存、网络阻塞的问题,这些将严重影响我们的可靠性,而使用原生NIO解决它们的难度相当大。
        4)JDK NIO中著名的BUG--epoll空轮询,当select返回0时,会导致Selector空轮询而导致CUP100%,官方表示JDK1.6之后修复了这个问题,其实只是发生的概率降低了,没有根本上解决。


    为什么用Netty?

        1)API使用简单,更容易上手,开发门槛低;
        2)功能强大,预置了多种编解码功能,支持多种主流协议;
        3)定制能力高,可以通过ChannelHandler对通信框架进行灵活地拓展;
        4)高性能,与目前多种NIO主流框架相比,Netty综合性能最高;
        5)高稳定性,解决了JDK NIO的BUG;
        6)经历了大规模的商业应用考验,质量和可靠性都有很好的验证。

  • 相关阅读:
    【自然语言处理】【大模型】赋予大模型使用工具的能力:Toolformer与ART
    【MicroPython ESP32】 入网和udp数据接收通讯示例
    爱上开源之golang入门至实战第四章-切片(Slice)
    【Python】Pyinstaller打包后程序运行报错configparser.NoSectionError: No section:XX问题解决
    思腾云计算
    QODBC查询Oracle中文乱码问题
    aspose.cells java合并多个excel
    微服务 第二章 CountDownLatch和Semaphone的应用
    c语言进制的转换16进制转换2进制
    ElasticSearch-head前端安装以及连接ES基本步骤(linux)
  • 原文地址:https://blog.csdn.net/wecloud1314/article/details/126847303