精华内容
下载资源
问答
  • 多朋友希望通过考取华为认证网络工程师,从而达到转行或者拿到高工资的岗位机会。但是多朋友又不知道华为hcie的难度是多大。所以多朋友找到网工记小编,经常问到的是零基础,如果学习华为认证网络工程师可以...

    有很多朋友希望通过考取华为认证网络工程师,从而达到转行或者拿到高工资的岗位机会。但是很多朋友又不知道华为hcie的难度是多大。

    所以很多朋友找到网工记小编,经常问到的是零基础,如果学习华为认证网络工程师可以吗?学习华为认证网络工程师hciE的难度有多大?华为hcIE能考过吗?

    网工记小编在这里总结一下经常见到的情况,让大家具体了解一下hcie的难度是多少

    一 什么是华为hcIE网络工程师

    e4209216bae33df6272f3a146bad25ec.png

    如果你对华为认证网络工程师还不太了解的话,首先看一下网工记小编给大家放出的上面这张图。

    因为很多人是零基础,只是听过华为也不太了解,具体华为认证到底学的是什么,以及华为分成了几个层次,那么看这张图你就可以看出来了。

    华为的网络工程师分成了三个级别,分别叫做工程师和高级工程师,还有网络专家。而华为的hcie认证网络工程师就是网络专家,这个级别也就代表着是华为认证网络工程师里面最高级别的这个认证。

    所以如果你现在是零基础,或者你是想从事华为认证网络工程师,那么你就可以来学习华为认证,同时考华为认证证书,这样的话你就可以顺利成为一名拥有华为认证的高级工程师或者网络专家了。

    二 华为hcIE难度有多大?华为hcIE有多难?

    38ab15949cc7e08fad0f9076c8625756.png

    华为认证肯定是有难度的,它绝对不是说小白花一两天或者一两周就能学会的,毕竟这是一个专业的工程师的技术水平。

    华为认证难度最大的在于它是需要大量真实操作,需要有动手能力的,所以你需要花一段时间专门去学习,华为的设备如何操作,如何配置以及真实的项目案例如何做。

    华为hcie认证是华为体系里面难度最大的网络工程师,也相当于代表着你是华为认证网络工程师里面的技术专家,水平这种专家水平工资在整个华为的网络工程师里面也是最高的。

    网工记小编强烈建议各位如果要从事华为认证,网络工程师想从事技术这方面的工作,那你就要把华为认证hcIE作为你的职业发展目标,一是华为这个厂家市场份额占有率大二是华为的名气足够罩着你在这个行业发展了。

    三 华为认证网络工程师hcie一般学习需要多长时间?

    6ee187130b118f9b647dde3deb0f7c57.png

    所以如果你准备从事这方面的工作,你需要好好花一个月两个月三个月,甚至是四五个月,把华为认证所需要的网络技术通讯技术和华为的网络设备配置调试,以及真实项目案例,这些工程师所需要具备的能力完全学会,所以这肯定是要花一定时间的。

    比如很多朋友问到网工记小编我最多的问题就是华为认证网络工程师通常学习需要花多长时间,一般来说两个月到4个月,这就是最常见的。

    四 华为hciE网络工程师在工作中能够做什么

    9dabb366973254dd883f5647f78e5ce8.png

    来看上面这张图,这就是一个网络工程师在现场调试华为网络设备的一个照片,一般来说作为网络工程师,你需要拿电脑登录到华为的网络设备上,进行命令行的输入配置维护。

    顺便说一句,这张照片的版权属于网工记小编所有,其他任何组织都不可以盗用。

    网络工程师他的工作职责主要就是帮助客户配置华为的网络设备,然后把它配置好调通,然后客户有什么样的需求,根据客户的需求,把网络进行不断的优化,以及对客户的出现故障的网络进行技术支持。

    四 华为hcIE网络工程师一般从事什么工作岗位

    883ac0c58fb81a368ede500043fc9aa7.png

    因为华为网络工程师本身就是从事数据通信的岗位。所谓的数据通信就是指我们现在用手机上互联网,用电脑上互联网,这个互联网就叫做数据通信,当然也会有人把它叫做弱电,实际上弱电里面的数据包通讯也属于计算机网络。

    所以当你拥有了华为hcie认证之后,你从事的工作就叫做网络工程师或者数据通信工程师或者华为网络工程师大一点的叫法,还有叫做系统集成工程师的。

    五 华为hcIE的月薪是多少

    f37b879add3e372693010a643defa6f3.png

    华为认证的网络工程师相对应的也算是高薪工作了,但是这个高薪工作依然是跟你的工作经验有很大的关系

    所以如果你的学历比较好,你的工作经验比较多,你的项目经验比较丰富,然后你又在一线城市,那么你拿三五万都是正常的

    但是反过来如果学历不太好,如果工作经验又是0,如果是刚刚学出来的,那可能5000~8000在一个二三线小城市,这样的收入也是正常的

    当然马上会有网络喷子来说,学完华为认证才这点工资,对于这种无脑的人,网工记小编懒得废话了,网络工程师成长日记作者小编要说的是这是刚起步的工资,当你拥有一项技术或者拥有一个认证之后,你的起点就会慢慢的走向正轨,然后工资越来越高,单纯的直接拿你某个阶段的工资和别人去做比较,没有任何意义。

    展开全文
  • 多朋友希望通过考取华为认证网络工程师,从而达到转行或者拿到高工资的岗位机会。但是多朋友又不知道华为hcie的难度是多大。所以多朋友找到网工记小编,经常问到的是零基础,如果学习华为认证网络工程师可以...

    有很多朋友希望通过考取华为认证网络工程师,从而达到转行或者拿到高工资的岗位机会。但是很多朋友又不知道华为hcie的难度是多大。

    所以很多朋友找到网工记小编,经常问到的是零基础,如果学习华为认证网络工程师可以吗?学习华为认证网络工程师hciE的难度有多大?华为hcIE能考过吗?

    网工记小编在这里总结一下经常见到的情况,让大家具体了解一下hcie的难度是多少

    一 什么是华为hcIE网络工程师

    23405e53bbafe26f5e1c6d25db9e6f1a.png

    如果你对华为认证网络工程师还不太了解的话,首先看一下网工记小编给大家放出的上面这张图。

    因为很多人是零基础,只是听过华为也不太了解,具体华为认证到底学的是什么,以及华为分成了几个层次,那么看这张图你就可以看出来了。

    华为的网络工程师分成了三个级别,分别叫做工程师和高级工程师,还有网络专家。而华为的hcie认证网络工程师就是网络专家,这个级别也就代表着是华为认证网络工程师里面最高级别的这个认证。

    所以如果你现在是零基础,或者你是想从事华为认证网络工程师,那么你就可以来学习华为认证,同时考华为认证证书,这样的话你就可以顺利成为一名拥有华为认证的高级工程师或者网络专家了。

    二 华为hcIE难度有多大?华为hcIE有多难?

    a43e29f536ea9509e6670efcefae2bdc.png

    华为认证肯定是有难度的,它绝对不是说小白花一两天或者一两周就能学会的,毕竟这是一个专业的工程师的技术水平。

    华为认证难度最大的在于它是需要大量真实操作,需要有动手能力的,所以你需要花一段时间专门去学习,华为的设备如何操作,如何配置以及真实的项目案例如何做。

    华为hcie认证是华为体系里面难度最大的网络工程师,也相当于代表着你是华为认证网络工程师里面的技术专家,水平这种专家水平工资在整个华为的网络工程师里面也是最高的。

    网工记小编强烈建议各位如果要从事华为认证,网络工程师想从事技术这方面的工作,那你就要把华为认证hcIE作为你的职业发展目标,一是华为这个厂家市场份额占有率大二是华为的名气足够罩着你在这个行业发展了。

    三 华为认证网络工程师hcie一般学习需要多长时间?

    9c4c9bb06d5ef0a2f87e2775b069999c.png

    所以如果你准备从事这方面的工作,你需要好好花一个月两个月三个月,甚至是四五个月,把华为认证所需要的网络技术通讯技术和华为的网络设备配置调试,以及真实项目案例,这些工程师所需要具备的能力完全学会,所以这肯定是要花一定时间的。

    比如很多朋友问到网工记小编我最多的问题就是华为认证网络工程师通常学习需要花多长时间,一般来说两个月到4个月,这就是最常见的。

    四 华为hciE网络工程师在工作中能够做什么

    f73862228883a15c058df23ffef7430c.png

    来看上面这张图,这就是一个网络工程师在现场调试华为网络设备的一个照片,一般来说作为网络工程师,你需要拿电脑登录到华为的网络设备上,进行命令行的输入配置维护。

    顺便说一句,这张照片的版权属于网工记小编所有,其他任何组织都不可以盗用。

    网络工程师他的工作职责主要就是帮助客户配置华为的网络设备,然后把它配置好调通,然后客户有什么样的需求,根据客户的需求,把网络进行不断的优化,以及对客户的出现故障的网络进行技术支持。

    四 华为hcIE网络工程师一般从事什么工作岗位

    0f80c0a35c1dcd71644a6aeb1c779c59.png

    因为华为网络工程师本身就是从事数据通信的岗位。所谓的数据通信就是指我们现在用手机上互联网,用电脑上互联网,这个互联网就叫做数据通信,当然也会有人把它叫做弱电,实际上弱电里面的数据包通讯也属于计算机网络。

    所以当你拥有了华为hcie认证之后,你从事的工作就叫做网络工程师或者数据通信工程师或者华为网络工程师大一点的叫法,还有叫做系统集成工程师的。

    五 华为hcIE的月薪是多少

    21007d82b92645f1b1f4fc5b6122a219.png

    华为认证的网络工程师相对应的也算是高薪工作了,但是这个高薪工作依然是跟你的工作经验有很大的关系

    所以如果你的学历比较好,你的工作经验比较多,你的项目经验比较丰富,然后你又在一线城市,那么你拿三五万都是正常的

    但是反过来如果学历不太好,如果工作经验又是0,如果是刚刚学出来的,那可能5000~8000在一个二三线小城市,这样的收入也是正常的

    当然马上会有网络喷子来说,学完华为认证才这点工资,对于这种无脑的人,网工记小编懒得废话了,网络工程师成长日记作者小编要说的是这是刚起步的工资,当你拥有一项技术或者拥有一个认证之后,你的起点就会慢慢的走向正轨,然后工资越来越高,单纯的直接拿你某个阶段的工资和别人去做比较,没有任何意义。

    展开全文
  • 一直都在练习lab,前后历时17个月的时间,终于在2019年10月底的时候在北京通过了CCIE考试,编号CCIE#63635,也算是对自己多年来在数通道路上的一种认可,还是高兴的;说是考了17个月其实练习时间加在一起可能只有...

    我自己是从2018年开始准备CCIE考试吧,前期一年的时间就是做一些CCIE的理论和实验课程的学习、复习、巩固。一直都在练习lab,前后历时17个月的时间,终于在2019年10月底的时候在北京通过了CCIE考试,编号CCIE#63635,也算是对自己多年来在数通道路上的一种认可,还是很高兴的;说是考了17个月其实练习时间加在一起可能只有最后请假备考冲刺的那一个月练习的时间最多,所以我们准备考试的时候需要调整一下自己的时间,给自己足够的练习时间,一直都在练习的朋友,最后一个月冲刺是完全可以的,没有问题的。可以调休或者请假专心用1-2个月的时间来冲刺考试,这样也算是事半功倍了。如果是打算考完换工作的,可以考虑辞掉工作直接开始备考,这样考试通过的几率会被自己无限放大。

    首先说一下考试,考试和实际工作完全两码事。考试的内容技术点很旧很窄,但是很深,要全部掌握也要付出相当多的努力,lab阶段没日没夜的做练习是一定的,这段时间什么都不能干就是专心去做大量的练习,其他活动真的是要暂停的。就现在的CCIE5.0末期的版本来说真的量太大了,能坚持下来的人真的挺不容易的,我在后期冲刺阶段基本上每天都在练习,考前冲刺需要脱产来练习,练习量太大了,目前5.0练习的lab大致如下:

    lab 共 5 套 lab1、lab1+、lab2、lab2+、lab3 (难度几何倍的递增)

    TS共 9套 TS1(六种解法)TS2(三种解法)

    DIAG 6套 D1(两套)、D2(两套)、D3(两套)——答案还有不同

    其中lab部分最难,消耗的时间也是最长的,期初一套lab需要2周左右的时间才能完全敲完,而且前期敲完的正确率也是较低的,而达到考试的水准是4个小时内敲完并且正确率在90%以上,TS相对于lab来说能轻松一些(只是相对),但是也需要大量的练习才能熟悉,DIAG这个东西就需要纯记忆了,这个考前用一周天时间绰绰有余。

    考试分为三个部分就是上面的LAB、TS、DIAG,每个部分的分数必须80%以上才算这个部分通过,而三个部分的总分加起来也要达到总分的80%以上才能通过考试,也就是说如果三门分科通过但是总成绩加起来没有达到通过线也是不能通过考试的。所以还是要尽量的拿高分数才保险,毕竟考试费很贵加上付出的精力很多,如果不能一次通过对自己的信心打击将是很大的。说下考试吧,我去的是北京考场,在银泰大厦C做8楼进行考试,早上8点开始到下午4:30结束(TS有2.5小时、DIAG半个小时可以延长半小时、其余时间LAB),中午有15分钟的吃饭时间(考官会带吃饭,盒饭味道一般,花了10800,再难吃也要吃下去)考试中途可以随意进出卫生间没有次数限制,我当天抽到的考题是TS2-1、DIAG3、LAB1+,其中TS和DIAG部分非常顺利结束,下午的LAB部分也和平常练习的进度一样,很顺利,一切都显得那么顺,让我很安心(毕竟之前已经fail过两次了),考完之后还是很有信心的,就怕考官TR,故意卡人,一直到五点多的时候成绩出来了显示了PASS,这才把一颗悬着的心放下来。

    由于版本现在有点多不好背了,再加上思科会限制通过率(变题)导致目前考试的人相对少了很多(位置很紧张,过了中秋到十一月香港才重新放了位子,北京还是没有放位子),堵版本的做法不推荐。虽然很大程度上考试在一定时间内只主要考到1-2个lab,但是很有可能就会抽到你不熟悉的那套lab就很可能会挂掉,因为我之前有个同学就是因为工作很忙,把重心放在了常考的2个版本,当时考试最多的是lab2+和lab3,但是考试的时候却抽到了lab1+,结果就是挂掉了,所以逢赌必输这词不是空穴来风考试还是要做好万全的准备,考试前有必要看近期的其他考生的战报,因为考场的底层环境很可能会发生变法,需求也随时可能会有小的变化,有时候会因为这些很小的点没有GET到而导致一个问题没有搞定,进而影响整个考试的发挥得不偿失,尤其是TS的小变化点经常会导致排错的时候搞不定,很影响。

    总结CCIE考试的时候心态要放轻松,很多人会觉得考试难度很大,没有把握和信心,其实考试就是考试只要针对的练习,大量的练习肯定是没有问题的,但是必须要有大量的练习把每个lab融会贯通,就个人而言练习版本的阶段其实是成长最快的阶段,比学习CCIE理论成长的多得多,因为很多技术点和理论只有在练习版本的过程中才能真正的理解,所谓会者不难难者不会就是这样的道理,但是CCIE考试时至今日只会越来越难(思科本身也开始控制通过率)。

    关于明年的RS变革,让现在很多备考的学员很慌,但是一旦可以抢到位子,自己准备的足够充足可以上去试一下,通过考试所带来的认同感是无可比拟的,通过短暂的时间就能获得的成就感和通过很久的努力才能获得的喜悦是不可同日而语的,就像是玩几小时赢得一场游戏和学习一年取得CCIE的成就感和喜悦感是完全不同的,后者那种耕耘很久后苦尽甘来的甜将给自己带来足够多的满足感和自信。

    最后是需要谢谢自己和自己的老师,考前的辅导,备考过程中出现的问题,都是需要老师去帮忙解惑的,也谢谢自己可以坚持这么久去备考,当然家里人的支持也是非常重要的,如果没有家里人的支持自己一定会有一些动摇,但是考过了就是我对他们的最好的回报,各位学员自己加油吧,你们要给自己信心,积极备考,注意抢位子哦!!!!

    华为认证 北京华为认证,思科ccie,sp ccie 思科ccnp

    展开全文
  • 自撸一个Android IM库,即时通讯很难吗

    千次阅读 多人点赞 2019-05-30 08:00:00
    / 今日科技快讯 /5月29日,市场研究机构Gartner发布最新数据显示,2019年第一季度全球智能手机销量为3.73亿部,同比下降2.7%。华为继续保持其全球...
        

    640?wx_fmt=jpeg


    /   今日科技快讯   /


    5月29日,市场研究机构Gartner发布最新数据显示,2019年第一季度全球智能手机销量为3.73亿部,同比下降2.7%。华为继续保持其全球第二大智能手机供应商的地位,并继续缩小与三星的差距。


    /   作者简介   /


    本篇文章来自 FreddyChen的投稿,分享了开源一个基于Netty+TCP+Protobuf实现的Android IM库,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章。


    FreddyChen的博客地址:

    https://juejin.im/user/5bd7affbe51d4547f763fe72


    /   写在前面   /


    一直想写一篇关于im即时通讯分享的文章,无奈工作太忙,很难抽出时间。今天终于从公司离职了,打算好好休息几天再重新找工作,趁时间空闲,决定静下心来写一篇文章,毕竟从前辈那里学到了很多东西。工作了五年半,这三四年来一直在做社交相关的项目,有直播、即时通讯、短视频分享、社区论坛等产品,深知即时通讯技术在一个项目中的重要性,本着开源分享的精神,也趁这机会总结一下,所以写下这篇文章,文中有不对之处欢迎批评与指正。


    不想看文章的同学可以直接移步到Github fork源码:github地址

    https://github.com/FreddyChen/NettyChat


    接下来,让我们进入正题。


    /   为什么使用TCP?   /


    优点


    • TCP的优点体现在稳定、可靠上,在传输数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完之后,还会断开连接用来节约系统资源。

    • UDP的优点体现在快,比TCP稍安全,UDP没有TCP拥有的各种机制,是一个无状态的传输协议,所以传递数据非常快,没有TCP的这些机制,被攻击利用的机制就少一些,但是也无法避免被攻击。


    缺点


    • TCP缺点就是慢,效率低,占用系统资源高,易被攻击,TCP在传递数据之前要先建立连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞机制等都会消耗大量时间,而且要在每台设备上维护所有的传输连接。

    • UDP缺点就是不可靠,不稳定,因为没有TCP的那些机制,UDP在传输数据时,如果网络质量不好,就会很容易丢包,造成数据的缺失。


    适用场景


    • TCP:当对网络通讯质量有要求时,比如HTTP、HTTPS、FTP等传输文件的协议, POP、SMTP等邮件传输的协议。

    • UDP:对网络通讯质量要求不高时,要求网络通讯速度要快的场景。


    /   为什么使用Protobuf?   /


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


    优点


    • json优点就是较XML格式更加小巧,传输效率较xml提高了很多,可读性还不错。

    • xml优点就是可读性强,解析方便。

    • protobuf优点就是传输效率快(据说在数据量大的时候,传输效率比xml和json快10-20倍),序列化后体积相比Json和XML很小,支持跨平台多语言,消息格式升级和兼容性还不错,序列化反序列化速度很快。


    缺点


    • json缺点就是传输效率也不是特别高(比xml快,但比protobuf要慢很多)。

    • xml缺点就是效率不高,资源消耗过大。

    • protobuf缺点就是使用不太方便。


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


    /   为什么使用Netty?   /


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


    为什么用Netty?


    • API使用简单,更容易上手,开发门槛低

    • 功能强大,预置了多种编解码功能,支持多种主流协议

    • 定制能力高,可以通过ChannelHandler对通信框架进行灵活地拓展

    • 高性能,与目前多种NIO主流框架相比,Netty综合性能最高

    • 高稳定性,解决了JDK NIO的BUG

    • 经历了大规模的商业应用考验,质量和可靠性都有很好的验证。


    为什么不用第三方SDK,如:融云、环信、腾讯TIM?


    这个就见仁见智了,有的时候,是因为公司的技术选型问题,因为用第三方的SDK,意味着消息数据需要存储到第三方的服务器上,再者,可扩展性、灵活性肯定没有自己开发的要好,还有一个小问题,就是收费。比如,融云免费版只支持100个注册用户,超过100就要收费,群聊支持人数有限制等等...


    640?wx_fmt=png


    Mina其实跟Netty很像,大部分API都相同,因为是同一个作者开发的。但感觉Mina没有Netty成熟,在使用Netty的过程中,出了问题很轻易地可以找到解决方案,所以,Netty是一个不错的选择。


    好了,废话不多说,直接开始吧。


    /   准备工作   /


    首先,我们新建一个Project,在Project里面再新建一个Android Library,Module名称暂且叫做im_lib,如图所示:


    640?wx_fmt=png


    然后,分析一下我们的消息结构,每条消息应该会有一个消息唯一id,发送者id,接收者id,消息类型,发送时间等,经过分析,整理出一个通用的消息类型,如下:


    • msgId    消息id

    • fromId   发送者id

    • toId   接收者id

    • msgType  消息类型

    • msgContentType   消息内容类型

    • timestamp    消息时间戳

    • statusReport   状态报告

    • extend   扩展字段


    根据上述所示,我整理了一个思维导图,方便大家参考:


    640?wx_fmt=png


    这是基础部分,当然,大家也可以根据自己需要自定义比较适合自己的消息结构。


    我们根据自定义的消息类型来编写proto文件。


    640?wx_fmt=png


    然后执行命令(我用的mac,windows命令应该也差不多):


    640?wx_fmt=png


    然后就会看到,在和proto文件同级目录下,会生成一个java类,这个就是我们需要用到的东东:


    640?wx_fmt=png


    我们打开瞄一眼:


    640?wx_fmt=png


    东西比较多,不用去管,这是google为我们生成的protobuf类,直接用就行,怎么用呢?直接用这个类文件,拷到我们开始指定的项目包路径下就可以啦:


    640?wx_fmt=png


    添加依赖后,可以看到,MessageProtobuf类文件已经没有报错了,顺便把netty的jar包也导进来一下,还有fastjson的:


    640?wx_fmt=png


    建议用netty-all-x.x.xx.Final的jar包,后续熟悉了,可以用精简的jar包。


    至此,准备工作已结束,下面,我们来编写java代码,实现即时通讯的功能。


    /   封装   /


    为什么需要封装呢?说白了,就是为了解耦,为了方便日后切换到不同框架实现,而无需到处修改调用的地方。举个栗子,比如Android早期比较流行的图片加载框架是Universal ImageLoader,后期因为某些原因,原作者停止了维护该项目,目前比较流行的图片加载框架是Picasso或Glide,因为图片加载功能可能调用的地方非常多,如果不作一些封装,早期使用了Universal ImageLoader的话,现在需要切换到Glide,那改动量将非常非常大,而且还很有可能会有遗漏,风险度非常高。


    那么,有什么解决方案呢?


    很简单,我们可以用工厂设计模式进行一些封装,工厂模式有三种:简单工厂模式、抽象工厂模式、工厂方法模式。在这里,我采用工厂方法模式进行封装,具体区别,可以参见:通俗讲讲我对简单工厂、工厂方法、抽象工厂三种设计模式的理解,地址如下:

    https://blog.andyqiao.top/article/12/


    我们分析一下,ims(IM Service,下文简称ims)应该是有初始化、建立连接、重连、关闭连接、释放资源、判断长连接是否关闭、发送消息等功能,基于上述分析,我们可以进行一个接口抽象:


    640?wx_fmt=png


    640?wx_fmt=png


    OnEventListener是与应用层交互的listener:


    640?wx_fmt=png


    IMConnectStatusCallback是ims连接状态回调监听器:


    640?wx_fmt=png


    然后写一个Netty tcp实现类:


    640?wx_fmt=png


    640?wx_fmt=png


    接下来,写一个工厂方法:


    640?wx_fmt=png


    封装部分到此结束,接下来,就是实现了。


    /   初始化   /


    我们先实现init(Vector serverUrlList, OnEventListener listener, IMSConnectStatusCallback callback)方法,初始化一些参数,以及进行第一次连接等。


    640?wx_fmt=png


    其中,MsgDispatcher是消息转发器,负责将接收到的消息转发到应用层。ExecutorServiceFactory是线程池工厂,负责调度重连及心跳线程。


    /   连接及重连  /


    resetConnect()方法作为连接的起点,首次连接以及重连逻辑,都是在resetConnect()方法进行逻辑处理,我们来瞄一眼:


    640?wx_fmt=png


    可以看到,非首次进行连接,也就是连接一个周期失败后,进行重连时,会先让线程休眠一段时间,因为这个时候也许网络状况不太好,接着,判断ims是否已关闭或者是否正在进行重连操作,由于重连操作是在子线程执行,为了避免重复重连,需要进行一些并发处理。开始重连任务后,分四个步骤执行:


    • 改变重连状态标识

    • 回调连接状态到应用层

    • 关闭之前打开的连接channel

    • 利用线程池执行一个新的重连任务


    ResetConnectRunnable是重连任务,核心的重连逻辑都放到这里执行:


    640?wx_fmt=png


    640?wx_fmt=png


    640?wx_fmt=png


    toServer()是真正连接服务器的地方:


    640?wx_fmt=png


    initBootstrap()是初始化Netty Bootstrap:


    640?wx_fmt=png


    注:NioEventLoopGroup线程数设置为4,可以满足QPS是一百多万的情况了,至于应用如果需要承受上千万上亿流量的,需要另外调整线程数。


    接着,我们来看看TCPChannelInitializerHanlder:


    640?wx_fmt=png

    其中,ProtobufEncoder和ProtobufDecoder是添加对protobuf的支持,LoginAuthRespHandler是接收到服务端握手认证消息响应的处理handler,HeartbeatRespHandler是接收到服务端心跳消息响应的处理handler,TCPReadHandler是接收到服务端其它消息后的处理handler,先不去管,我们重点来分析下LengthFieldPrepender和LengthFieldBasedFrameDecoder,这就需要引申到TCP的拆包与粘包啦。


    /   TCP的拆包和粘包   /


    什么是TCP拆包?为什么会出现TCP拆包?


    简单地说,我们都知道TCP是以“流”的形式进行数据传输的,而且TCP为提高性能,发送端会将需要发送的数据刷入缓冲区,等待缓冲区满了之后,再将缓冲区中的数据发送给接收方,同理,接收方也会有缓冲区这样的机制,来接收数据。


    拆包就是在socket读取时,没有完整地读取一个数据包,只读取一部分。


    什么是TCP粘包?为什么会出现TCP粘包?


    粘包就是在socket读取时,读到了实际意义上的两个或多个数据包的内容,同时将其作为一个数据包进行处理。


    引用网上一张图片来解释一下在TCP出现拆包、粘包以及正常状态下的三种情况,如侵请联系我删除:


    640?wx_fmt=png


    了解了TCP出现拆包/粘包的原因,那么,如何解决呢?通常来说,有以下四种解决方式:


    • 消息定长

    • 用回车换行符作为消息结束标志

    • 用特殊分隔符作为消息结束标志,如\t、\n等,回车换行符其实就是特殊分隔符的一种。

    • 将消息分为消息头和消息体,在消息头中用字段标识消息总长度。


    netty针对以上四种场景,给我们封装了以下四种对应的解码器:


    • FixedLengthFrameDecoder,定长消息解码器

    • LineBasedFrameDecoder,回车换行符消息解码器

    • DelimiterBasedFrameDecoder,特殊分隔符消息解码器

    • LengthFieldBasedFrameDecoder,自定义长度消息解码器。


    我们用到的就是LengthFieldBasedFrameDecoder自定义长度消息解码器,同时配合LengthFieldPrepender编码器使用,关于参数配置,建议参考netty--最通用TCP黏包解决方案:LengthFieldBasedFrameDecoder和LengthFieldPrepender这篇文章,地址如下:

    https://blog.csdn.net/u010853261/article/details/55803933


    讲解得比较细致。我们配置的是消息头长度为2个字节,所以消息包的最大长度需要小于65536个字节,netty会把消息内容长度存放消息头的字段里,接收方可以根据消息头的字段拿到此条消息总长度。


    当然,netty提供的LengthFieldBasedFrameDecoder已经封装好了处理逻辑,我们只需要配置lengthFieldOffset、lengthFieldLength、lengthAdjustment、initialBytesToStrip即可,这样就可以解决TCP的拆包与粘包,这也就是netty相较于原生nio的便捷性,原生nio需要自己处理拆包/粘包等问题。


    /   长连接握手认证   /


    接着,我们来看看LoginAuthHandler和HeartbeatRespHandler。


    LoginAuthRespHandler是当客户端与服务端长连接建立成功后,客户端主动向服务端发送一条登录认证消息,带入与当前用户相关的参数,比如token,服务端收到此消息后,到数据库查询该用户信息,如果是合法有效的用户,则返回一条登录成功消息给该客户端,反之,返回一条登录失败消息给该客户端,这里,就是在接收到服务端返回的登录状态后的处理handler,比如:


    640?wx_fmt=png


    可以看到,当接收到服务端握手消息响应后,会从扩展字段取出status,如果status=1,则代表握手成功,这个时候就先主动向服务端发送一条心跳消息,然后利用Netty的IdleStateHandler读写超时机制,定期向服务端发送心跳消息,维持长连接,以及检测长连接是否还存在等。


    HeartbeatRespHandler是当客户端接收到服务端登录成功的消息后,主动向服务端发送一条心跳消息,心跳消息可以是一个空包,消息包体越小越好,服务端收到客户端的心跳包后,原样返回给客户端,这里,就是收到服务端返回的心跳消息响应的处理handler,比如:


    640?wx_fmt=png


    这个就比较简单,收到心跳消息响应,无需任务处理,直接打印一下方便我们分析即可。


    /   心跳及读写超时机制   /


    心跳包是定期发送,也可以自己定义一个周期,比如Android微信智能心跳方案。为了简单,此处规定应用在前台时,8秒发送一个心跳包,切换到后台时,30秒发送一次,根据自己的实际情况修改一下即可。心跳包用于维持长连接以及检测长连接是否断开等。


    接着,我们利用Netty的读写超时机制,来实现一个心跳消息管理handler:


    640?wx_fmt=png


    可以看到,利用userEventTriggered()方法回调,通过IdleState类型,可以判断读超时/写超时/读写超时,这个在添加IdleStateHandler时可以配置,下面会贴上代码。首先我们可以在READER_IDLE事件里,检测是否在规定时间内没有收到服务端心跳包响应,如果是,那就触发重连操作。在WRITER_IDEL事件可以检测客户端是否在规定时间内没有向服务端发送心跳包,如果是,那就主动发送一个心跳包。发送心跳包是在子线程中执行,我们可以利用之前写的work线程池进行线程管理。


    在IdleStateHandler里,配置的读超时为心跳间隔时长的3倍,也就是3次心跳没有响应时,则认为长连接已断开,触发重连操作。写超时则为心跳间隔时长,意味着每隔heartbeatInterval会发送一个心跳包。读写超时没用到,所以配置为0。


    onConnectStatusCallback(int connectStatus)为连接状态回调,以及一些公共逻辑处理。连接成功后,立即发送一条握手消息,再次梳理一下整体流程:


    • 客户端根据服务端返回的host及port,进行第一次连接。

    • 连接成功后,客户端向服务端发送一条握手认证消息(1001)

    • 服务端在收到客户端的握手认证消息后,从扩展字段里取出用户token,到本地数据库校验合法性。

    • 校验完成后,服务端把校验结果通过1001消息返回给客户端,也就是握手消息响应。

    • 客户端收到服务端的握手消息响应后,从扩展字段取出校验结果。若校验成功,客户端向服务端发送一条心跳消息(1002),然后进入心跳发送周期,定期间隔向服务端发送心跳消息,维持长连接以及实时检测链路可用性,若发现链路不可用,等待一段时间触发重连操作,重连成功后,重新开始握手/心跳的逻辑。


    看看TCPReadHandler收到消息是怎么处理的:


    640?wx_fmt=png


    640?wx_fmt=png


    可以看到,在channelInactive()及exceptionCaught()方法都触发了重连,channelInactive()方法在当链路断开时会调用,exceptionCaught()方法在当出现异常时会触发,另外,还有诸如channelUnregistered()、channelReadComplete()等方法可以重写,在这里就不贴了,相信聪明的你一眼就能看出方法的作用。


    我们仔细看一下channelRead()方法的逻辑,在if判断里,先判断消息类型,如果是服务端返回的消息发送状态报告类型,则判断消息是否发送成功,如果发送成功,从超时管理器中移除,这个超时管理器是干嘛的呢?


    下面讲到消息重发机制的时候会详细地讲。在else里,收到其他消息后,会立马给服务端返回一个消息接收状态报告,告诉服务端,这条消息我已经收到了,这个动作,对于后续需要做的离线消息会有作用。如果不需要支持离线消息功能,这一步可以省略。最后,调用消息转发器,把接收到的消息转发到应用层即可。


    代码写了这么多,我们先来看看运行后的效果,先贴上缺失的消息发送代码及ims关闭代码以及一些默认配置项的代码。


    发送消息:


    640?wx_fmt=png


    关闭ims:


    640?wx_fmt=png


    ims默认配置:


    640?wx_fmt=png


    还有,应用层实现的ims client启动器:


    640?wx_fmt=png


    由于代码有点多,不太方便全部贴上,如果有兴趣可以下载demo体验。


    /  调试  /


    我们先来看看连接及重连部分(由于录制gif比较麻烦,体积较大,所以我先把重连间隔调小成3秒,方便看效果)。


    启动服务端:


    640?wx_fmt=gif


    启动客户端:


    640?wx_fmt=gif


    可以看到,正常的情况下已经连接成功了,接下来,我们来试一下异常情况,比如服务端没启动,看看客户端的重连情况:


    640?wx_fmt=gif


    这次我们先启动的是客户端,可以看到连接失败后一直在进行重连,由于录制gif比较麻烦,在第三次连接失败后,我启动了服务端,这个时候客户端就会重连成功。


    然后,我们再来调试一下握手认证消息即心跳消息:


    640?wx_fmt=gif


    可以看到,长连接建立成功后,客户端会给服务端发送一条握手认证消息(1001),服务端收到握手认证消息会,给客户端返回了一条握手认证状态消息,客户端收到握手认证状态消息后,即启动心跳机制。gif不太好演示,下载demo就可以直观地看到。


    接下来,在讲完消息重发机制及离线消息后,我会在应用层做一些简单的封装,以及在模拟器上运行,这样就可以很直观地看到运行效果。


    /   消息重发机制  /


    消息重发,顾名思义,即使对发送失败的消息进行重发。考虑到网络环境的不稳定性、多变性(比如从进入电梯、进入地铁、移动网络切换到wifi等),在消息发送的时候,发送失败的概率其实不小,这时消息重发机制就很有必要了。


    说一下逻辑吧:发送消息时,除了心跳消息、握手消息、状态报告消息外,消息都加入消息发送超时管理器,立马开启一个定时器,比如每隔5秒执行一次,共执行3次,在这个周期内,如果消息没有发送成功,会进行3次重发,达到3次重发后如果还是没有发送成功,那就放弃重发,移除该消息,同时通过消息转发器通知应用层,由应用层决定是否再次重发。如果消息发送成功,服务端会返回一个消息发送状态报告,客户端收到该状态报告后,从消息发送超时管理器移除该消息,同时停止该消息对应的定时器即可。


    另外,在用户握手认证成功时,应该检查消息发送超时管理器里是否有发送超时的消息,如果有,则全部重发。


    /   离线消息   /


    由于离线消息机制,需要服务端数据库及缓存上的配合,代码就不贴了,太多太多,我简单说一下实现思路吧:


    客户端A发送消息到客户端B,消息会先到服务端,由服务端进行中转。这个时候,客户端B存在两种情况:


    • 长连接正常,就是客户端网络环境良好,手机有电,应用处在打开的情况。

    • 废话,那肯定就是长连接不正常咯。这种情况有很多种原因,比如wifi不可用、用户进入了地铁或电梯等网络不好的场所、应用没打开或已退出登录等,总的来说,就是没有办法正常接收消息。

    如果是长连接正常,那没什么可说的,服务端直接转发即可。


    如果长连接不正常,需要这样处理:服务端接收到客户端A发送给客户端B的消息后,先给客户端A回复一条状态报告,告诉客户端A,我已经收到消息,这个时候,客户端A就不用管了,消息只要到达服务端即可。然后,服务端先尝试把消息转发到客户端B,如果这个时候客户端B收到服务端转发过来的消息,需要立马给服务端回一条状态报告,告诉服务端,我已经收到消息,服务端在收到客户端B返回的消息接收状态报告后,即认为此消息已经正常发送,不需要再存库。


    如果客户端B不在线,服务端在做转发的时候,并没有收到客户端B返回的消息接收状态报告,那么,这条消息就应该存到数据库,直到客户端B上线后,也就是长连接建立成功后,客户端B主动向服务端发送一条离线消息询问,服务端在收到离线消息询问后,到数据库或缓存去查客户端B的所有离线消息,并分批次返回,客户端B在收到服务端的离线消息返回后,取出消息id(若有多条就取id集合),通过离线消息应答把消息id返回到服务端,服务端收到后,根据消息id从数据库把对应的消息删除即可。


    以上是单聊离线消息处理的情况,群聊有点不同,群聊的话,是需要服务端确认群组内所有用户都收到此消息后,才能从数据库删除消息,就说这么多,如果需要细节的话,可以私信我。


    /   应用层封装   /


    这个就见仁见智啦,每个人代码风格不同。由于每个人代码风格不同,封装代码都有自己的思路,所以,在此就不过多讲解,只是把自己简单封装的代码全部贴上来,作一个参考即可。只需要知道,接收到消息时,会回调OnEventListener的dispatchMsg(MessageProtobuf.Msg msg)方法:


    640?wx_fmt=png


    发送消息需要调用imsClient的sendMsg(MessageProtobuf.Msg msg)方法:


    640?wx_fmt=png


    即可,至于怎样去封装得更好,大家自由发挥吧。


    最后,为了测试消息收发是否正常,我们需要改动一下服务端。


    运行一下吧:


    640?wx_fmt=gif


    640?wx_fmt=gif


    • 首先,启动服务端。

    • 然后,修改客户端连接的ip地址为192.168.0.105(这是我本机的ip地址),端口号为8855,fromId,也就是userId,定义成100001,toId为100002,启动客户端A。

    • 再然后,fromId,也就是userId,定义成100002,toId为100001,启动客户端B。

    • 客户端A给客户端B发送消息,可以看到在客户端B的下面,已经接收到了消息。

    • 用客户端B给客户端A发送消息,也可以看到在客户端A的下面,也已经接收到了消息。

    • 至于,消息收发测试成功。至于群聊或重连等功能,就不一一演示了,还是那句话,下载demo体验一下吧。。。


    如果有需要应用层UI实现(就是聊天页及会话页的封装)的话,我再分享出来吧。


    github地址

    https://github.com/FreddyChen/NettyChat


    一个人精力有限,大家在使用过程中,如果发现其它bug,烦请告诉我,反正我是会虚心接受,坚决不改,呸,一定改,一定改。另外,欢迎fork,期待大家与我一起完善。。。


    /   写在最后  /


    终于写完了,这篇文章大概写了10天左右,有很大部分的原因是自己有拖延症,每次写完一小段,总静不下心来写下去,导致一直拖到现在,以后得改改。第一次写技术分享文章,有很多地方也许逻辑不太清晰,由于篇幅有限,也只是贴了部分代码,建议大家把源码下载下来看看。


    一直想写这篇文章,以前在网上也尝试过找过很多im方面的文章,都找不到一篇比较完善的,本文谈不上完善,但包含的模块很多,希望起到一个抛砖引玉的作用,也期待着大家跟我一起发现更多的问题并完善,最后,如果这篇文章对你有用,希望在github上给我一个star哈。。。


    推荐阅读:

    每位开发者都应该读的9本技术书,本本都是经典

    读懂底层,才是安卓真正开始的时候

    今天我们深入探讨一下如何写好异步代码


    欢迎关注我的公众号

    学习技术或投稿


    640.png?


    640?wx_fmt=jpeg

    长按上图,识别图中二维码即可关注


    展开全文
  • 华为HCNA好考吗?

    千次阅读 2019-04-29 17:33:32
    其实想要考取华为HCNA也不是很难,把握好以下几点方向,还是很有把握可以拿下HCNA的。 首先要了解华为HCNP考试的一些基本信息。 考试语种方面,目前华为提供中英文二种考试,英文考试在全球发布,中文考试仅在中国...
  • iPhone手机在国内部分手机用户心中还是很难进行选择的,那么对于9月份的即将到来,很多人都在考虑是否入手iPhone的2019年版,对此的争议还是很大的,虽然有很多地方显得不尽人意,但是苹果手机的工艺还是十分精湛的...
  • 不久前谷歌再度对华为进行封杀,目前海外版的华为mate 30系列要想自行安装谷歌服务已经如登天,传统的方法已经不再适用。随着谷歌封杀的华为态度愈加强硬,华为负责人余承东表示,不久后华为自主研发的鸿蒙系统将...
  • 这个问题尖锐,现在八字还没有一撇,怎么答都是错。但只要有人问出来,就不可不回答。果然,当郭平表态愿意跟高通合作之后,风起云涌。高通有朋友可能要说,高通不止一次地向华为示好,这不是正彰显了礼尚往来的...
  • 这其中的主要原因就是因为人们通常会更容易记住图像,同时文字如果太多也会影响人们整洁的视觉体验,不过因为这些图标太多,用户往往也很难完全记住每一个图标代表的意思,为此,@华为EMUI 也发长图为大家科普图标的...
  • 很多人说操作系统也很难,这个肯定是的,但是任正非说话的背景是现在,也就是华为的操作系统研发从2012年就开始了,一直到现在,再加上华为的体量,每年的研发的费用投入确实对于华为来说不难。但是生态不同的,是需...
  • 像电脑和智能手机的出现,就极大的加快了人们的工作效率,而电脑和智能手机也已经被应用到了我们生活的方方面面,我们几乎很难想象现在没有了电脑和手机的生活将会变成什么样子!虽然说手机和电脑都已经...
  • 对于绝大部分的花粉来说,对于华为mate20 pro还是充满好感度的,它是历代最惊艳、也是配置升级最大的一款Mate系列,一经发布就引发业内强烈反向, 多前沿的科技在华为mate20 pro上得到应用,就连今年的华为mate30 ...
  • HCIE认证由笔试+实验考试+面试构成,面试是其中最难过的一关,多考生也在这一步面前望而却步,所幸考生有多次机会进行面试, HCIE面试的次数上,理论上讲是没有限制的,在华为认证的补考政策中,考生如果顺利通过...
  • 走出华为 走出华为

    2011-10-28 09:13:24
    科生,我这个在市场前线很难一见的纯纯粹粹的文科生,是华为一如既往地手把 手教我。当领导告诉我可以选择一个办事处的时候,我将信将疑地问他:杭州可 以吗?当任命出来时,我久久地注视着屏幕。我谢谢你,华为。 ...
  • 手机在人们生活中扮演者越来越重要的角色,社交、娱乐、学习、查询、付款……无论是工作还是生活我们似乎都很难离开它。但是你有尝试过将门钥匙添加到手机里面吗?目前,HUAWEI AI PASS门钥匙已支持用华为手机模拟...
  • 虽然很难,但这条路上依旧是热闹非凡。众所周知,程序员的资历深浅是跟很多方面都有关联的:知识、阅历、情商等等。但一个程序员要想成长为一个成熟优秀的程序员,这些能力或许能帮助到你。华为云社区:程序员从幼稚...
  • 先撕算法,括号匹配,不 然后自我介绍 从项目开始问起,问的细,项目逻辑是什么,你的角色是什么,你做了什么,遇到了什么困难,怎么解决的 问了好久 然后才是基础知识,数据结构,计算机网络 基础知识问了...
  • 多吃瓜群众想,既然三星、苹果、华为行,别的品牌为何不行?“手机芯片吗不就是ARM的CPU和GPU拼在一起然后找一家代工厂造不就完了吗?”然而事实却并不是这样,宣布自研芯片的小米面临澎湃S2的“难产”,LG的芯片...
  • 前面我们发布了华为、锐捷、H3C交换机的配置,有多的朋友提到了vlan的划分,今天我们来看下具体应用。多朋友在留言中也多次提到了华为交换机,华为也是在项目中用的比较多交换机,因此,我们今天以华为交换机为...
  • 项目中有没有让你认为很难的事情? 印象中最深刻的bug? 你们的项目流程是什么? 性能测试流程? jmeter前置后置?接口依赖时怎么做? 性能场景? 性能测试指标?tps和并发数关系? 性能测试过程中遇到的问题?怎么...
  • 近日,华为又处在了风口浪尖的位置,围绕华为L20首席安全专家为Linux内核提交补丁却被发现漏洞,国内外有了多的讨论。于是就有一位华为顶级专家提交了这份Linux+redis+netty+zookeeper归纳笔记以平人心,于是就有...
  • 不走到正门还真的很难窥探里面。 来看20:30-00:30的华为。朋友说华为加班很夸张,所以晚上8点半,是不指望有人出来的。 22:15,一个穿单薄白T的小姐姐,在晚风里瑟瑟发抖,这是她在华为第四年! **问:这么晚回家...
  • 关于vlan的划分方法有多,项目应用中较多的方法就是基于端口划分vlan、基于mac地址划分vlan、基于ip地址划分vlan,要真正对vlan了解,必须熟悉这三次划分方法,以便于根据实际项目进行应用。一...
  • 年关近了,你知道自己今年会拿到多少年终奖吗?大部分人恐怕都不知道。于是,年底的这两个月,就成了公司最躁动的时期。...然而经验告诉我们,年终奖很难让所有人满意。曾任华为前全球团队建设负责人的冉...
  • 2018中国国际大数据产业博览会(简称数博会)将于5月26日在贵州贵阳开幕。这一当下最具影响力的大数据主题博览会也将汇集众多产业巨擘参加,其中不乏有微软、阿里巴巴、百度、华为、...处理10万亿个数据,就很难吗...
  • 无论是现在还是以前进大厂的门槛始终很高,最重要的还是面试环节,大厂的面试题是很难的,这里我准备了一份阿里、腾讯、京东、华为合集大厂300+道面试题分享给大家,文中有对应的面试答案免费提供!! 大厂面试...
  • 从字节跳动面试官这些问题,可以看出,第三面他们考察的一个重要的方向就是项目架构和性能优化。 “懒洋洋”甚至跟我吐槽:“我靠,现在大厂面试java后端都这么的吗?” 大厂面试就是,但是大厂的待遇是真的香...
  • 以上列举的大厂除了华为主业都是消费类电子,而且手机行业竞争非常惨烈,产品需求非常赶,你一delay,落在别人后面发布,就很难再抢到市场了。所以想不996的,在选择行业的时候应该远离消费类产品,而跟技术栈没有...
  • 从字节跳动面试官这些问题,可以看出,第三面他们考察的一个重要的方向就是项目架构和性能优化。 “懒洋洋”甚至跟我吐槽:“我靠,现在大厂面试java后端都这么的吗?” 大厂面试就是,但是大厂的待遇是真的香...

空空如也

空空如也

1 2 3 4 5 6
收藏数 102
精华内容 40
关键字:

华为很难吗