精华内容
下载资源
问答
  • 然后再一次申请提示无法连接到mongodb了![图片说明](https://img-ask.csdn.net/upload/202010/22/1603349787_459771.png) 导出文件也变成了json,并且是不含信息,也是提示连接不上mongodb![图片说明]...
  • 开始的需求是这样子的,我为了实现两个页面组件之间的数据传递,假设我有页面A,点击页面A上的某个按钮之后,...关于vue中的eventbus的使用,我之前在篇vue中的数据传递中提到。 先给你们看一下我开始的
  • 握手建立链接,四挥手断开链接。这个问题算非常经典问题,也是面试官非常喜欢问问题。 不夸张说,校招面试时候每一家公司都问到关于三...但是,里面细节肯定是会有些生疏或者模糊,接下来就一..

    三次握手建立链接,四次挥手断开链接。这个问题算非常经典的问题,也是面试官非常喜欢问的问题。

    不夸张的说,校招面试的时候每一家公司都问到过关于三次握手和四次挥手相关的问题,相信大家也都差不多被面试官各种怼。

     

    这个问题的重要性,已经意识到。不说废话了,接下来就是给你安排的明明白白。

    先画个图,看下TCP的建立连接 和 断开连接的整体过程。

     

    tcp三次握手四次挥手

    看完这个图相信聪明的你在整体对三次握手和四次挥手有了一些基本把控。但是,里面的细节肯定是会有些生疏或者模糊的,接下来就一个一个问题的揭露本质。

    在解释之前先看点基础知识做做铺垫。

    TCP状态转移解释

    再看下TCP的报文格式

     

    TCP报文格式

    首部有20字节的固定长度,含义如下:

    1. 源端口和目的端口

    各占2字节,就是存储源端口号和目的端口的

    1. 序号seq

    占4字节,表示的范围就是整形的范围[0~2^32]。序号使用在给数据部分每个字节进行编号的,编号方式是mod 2^32 。

    1. 确认号ack

    占4字节,范围也是无符号整数的范围。使用在对端传输给我的数据最后一个字节序号,例如A传输给B 101—500,此时B返回的确认号一定是小于等于501的。当B段正确接收数据之后才会返回确认号,换句话说确认号之前的数据已经全部接收。

    1. 数据偏移

    占4bit,数据偏移很多人很容易想到是不是表示数据的长度,那就错了。偏移嘛,指的是TCP起始位置到数据部分的起始位置的偏移,也就是TCP首部的长度。

    1. 保留

    占6bit,保留字段顾名思义,就是为今后使用,默认置为0。

    1. 紧急URG控制位

    占用1bit,URG=1,表示紧急指针有效,此时tcp数据优先传输。相当于生活中的紧急通道,特殊情况时使用。

    在网络中也会有特殊情况,例如,发送一个很长的程序在远程服务器上运行,此时发现程序有bug,需要中断运行,因此我们从键盘输入Ctrl c,假如不使用紧急数据,需要在缓冲区里排队,都知道是bug了,还要排队,这怕是要出锅啊。

    此时使用紧急数据传输,不需要排队,直接中断程序是不是更符合我们的预期。

    需要注意一点是,即使窗口为0时,也可以发送紧急数据。

    如何使用紧急URG控制位,在socket编程中send函数flag参数

    send(int socket, const void *buffer, size_t length, int flags);

    flags参数传MSG_OOB宏时,表示此时有紧急数据。MSG_OOB是个宏,

    1. 确认ACK

    占1bit,当ACK=1时生效。TCP有条硬性规定,当建立链接成功后所有传输的数据报文都必须把ACK置为1。

    1. 推送PSH

    占1bit,发送方把PSH置为1时 会立即发送该数据包,接收方收到PSH=1的报文会立即处理交付给应用层处理。是不是感觉和URG很像,其实还是有些区别的。

    • 两者相同点:

    URG与PSH两者都使用于紧急处理的情况,用来快速传输紧急数据。

    • 两者不同点

    URG置为1时,对于发送发,“带外数据”与正常情况下应该发送的消息数据一起,封装成数据报发送,省去了在队列中等待的时间。 在接收方,解析报文后,获取数据之后还是要放在缓存区中,等待满了之后在向上往应用层交付。

    PSH置为1时,对于发送方,表明这些数据不需要等向下发送的缓存区满,立刻封装成报文,发送,省去了等待发送缓存区到达满的状态的时间。 在接收方,也不需要等接受缓存区满,直接向上交付给应用层。

    1. 复位RST

    占1bit,当RST=1时,TCP会主动释放链接,两种情况会用上。

    TCP出现严重差错时,会主动释放连接,重建链接,传输数据。

    遇到非法报文或者拒绝连接时会把RST置为1.

    1. 同步SYN

    占1bit,同步控制位,用来在传输连接建立时同步传输连接序号。

    SYN=1时,表示这是一个连接请求或连接确认报文。

    SYN=1,ACK=0,表明这是一个连接请求数据段,如果对方同意建立连接,则对方会返回一个SYN=1、ACK=1的确认。

    1. FIN控制位

    占1bit,用于释放一个传输连接。

    FIN=1时,表示数据已全部传输完成,发送端没有数据要传输了,要求释放当前连接,但是接收端仍然可以继续接收还没有接收完的数据。

    FIN=0,正常传输数据。

    1. 窗口大小

    占16bit,2byte,用于表示发送方可以接受的最大数据大小。

    该窗口是动态变化的,用作流量控制时使用。

    1. 检验和

    占16bit,2byte,用于对TCP头部,伪头部,数据三个部分进行校验。

    1. 紧急指针

    占16bit,2byte,用于记录紧急数据的末尾在数据段中的位置。

    当URG=1时,该指针才生效。

    1. 可选项

    可选项最长可达40byte,是可选的,可以没有。当可选项不存在时,TCP头部长度为20byte。

    可选项可以包括窗口缩放选项(Window ScaleOption,WSopt)、MSS(最大数据段大小)选项、SACK(选择性确认)选项、时间戳(Timestamp)选项等。

    1. 数据

    TCP数据部分,由应用层应用程序提交的数据。

    TCP头部是基础知识,必须了解才能更好的理解TCP数据如何封装和传输,以及在建立链接和断开链接时都在操作那些地方。

    点个赞再走呗?您的「三连」就是我的最大动力!

    1. 关注公众号「Linux服务器」,第一时间获取最新Linux干货!
    2. 后台回复【资料】【面试题】【架构】获取精选一线大厂面试、自我提升、简历等资料

     

    三次握手建立连接

    三次握手如何建立连接?

     

    三次握手建立链接

    从图中可以清楚的看到,三次握手的过程,我在在把过程清楚的解释一遍,顺便说下每个过程容易被问到的知识点。

    采用C/S模式解释,假设C端发起传输请求。

    在发送建立链接请求之前,C端是保持CLOSED状态,S端最开始也是处于CLOSED状态,当执行listen函数套接字进入被动监听状态

    所谓被动监听,是指当没有客户端请求时,套接字处于“睡眠”状态,只有当接收到客户端请求时,套接字才会被“唤醒”来响应请求。

    第一次:C端发送SYN=1的请求报文,此时C端进入SYN SENT状态,等待服务器确认。

    此时如果报文丢失发送不到对端会如何?

    C端发送报文之后会启动一个定时器,在超时之后未收到S端的确认,会再次发送SYN请求,每次尝试的时间会是第一次的二倍,如果总的总尝试时间为75秒,此次建立链接失败。

    第二次:S端收到C端发送的SYN报文(建立链接请求)后,S端必须返回确认号并且同时发送一条SYN报文,此时进入SYN RCVD状态。

    为啥要连带发送SYN报文?

    TCP是全双工通信,协议规定当收到建立链接请求后必须返回序列号,同时建立本端到对端的通信链接。这也叫做捎带应答机制。

    如果第二次报文丢失怎么办?

    在发送完ACK+SYN报文后会启动一个定时器,超时没有收到ACK确认,会再次发送,会进行多次重试。超时时间依旧每次翻倍,重试次数可设置。

    修改 /proc/sys/net/ipv4/tcp_synack_retries 的值

    第三次:C端收到S端发的ACK+SYN报文,需要返回一个应答ACK的报文,此时该连接会进入半连接状态的队列,当S端收到ACK后,一条完整的全双工TCP链接建立完成,双方进入ESTABLISHED状态。

    这里有个常用攻击手段,攻击者伪造一个SYN请求发送给服务端,服务端响应之后,会收不到C端的ACK确认,服务端会不断的重试,默认会重试五次。

    此时服务端会维持这个链接的所有资源,如果有大量这样的请求,服务端的资源会被耗完。

    这就是DOS攻击。

    如果第三次报文丢失怎么办?

    S端在发出ACK+SYN报文后会启动一个定时器,在超时触发还没收到ACK就确认是丢失了,会重试一次发送。

    这里面的每个状态都必须搞明白,面试官也超级爱问上面的状态转移。

    你有遇到过一个面试官问你用过socket编程么?问你用过哪些socket函数?

    C端socket编程代码

    //C端
    #define PORT  8080
    #define BUFFER_SIZE 1024
    int main(int argc, char **argv)
    {
        //定义IPV4的TCP连接的套接字描述符
        int sock_cli = socket(AF_INET,SOCK_STREAM, 0);
        //定义sockaddr_in
        struct sockaddr_in servaddr;
        memset(&servaddr, 0, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = inet_addr(argv[1]);
        servaddr.sin_port = htons(PORT);  
     
        //连接服务器,成功返回0,错误返回-1
        int ret = connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr));
     
        //客户端将控制台输入的信息发送给服务器端,服务器原样返回信息,阻塞
        while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)
        {   
            ret=send(sock_cli, sendbuf, strlen(sendbuf),0); ///发送
            recv(sock_cli, recvbuf, sizeof(recvbuf),0); ///接收
            fputs(recvbuf, stdout);
        }
     
        close(sock_cli); // 关闭连接
        return 0;
    }
    

    S端socket编程代码

    int main(int argc, char **argv)
    {
        //定义IPV4的TCP连接的套接字描述符
        int server_sockfd = socket(AF_INET,SOCK_STREAM, 0);
        //定义sockaddr_in
        struct sockaddr_in server_sockaddr;
        server_sockaddr.sin_family = AF_INET;
        server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        server_sockaddr.sin_port = htons(PORT);
     
        //bind成功返回0,出错返回-1
        if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)
     
        //listen成功返回0,出错返回-1,允许同时监听的连接数为QUEUE_SIZE
        if(listen(server_sockfd,QUEUE_SIZE) == -1)
     
        for(;;)
        {
            struct sockaddr_in client_addr;
            socklen_t length = sizeof(client_addr);
            //进程阻塞在accept上,成功返回非负描述字,出错返回-1
            int conn = accept(server_sockfd, (struct sockaddr*)&client_addr,&length);
     
            //处理数据部分
          ...
        }
     
        close(server_sockfd);
        return 0;
    }
    

    为什么需要三次握手建立链接,2次可以么,4次行不行?

    这问题问的,面试官是咋了?在这明知故问的,整些有的没的。肯定是不行啊,RFC 标准就是这样写的啊。

    可不敢这样回答啊,标准是说的三次握手建立链接,可没说四次不行啊。要是这样答,妥妥的会收到,同学我们今天的面试到此基本结束了,你回家等消息...

    来说说这个问题,为什么不能两次?

    如果第二次不发送SYN+ACK,只是发送确认应答消息ACK,会造成只能建立单向通信,而且不能应答。而TCP是全双工通信的,而且必须保证可靠性。

    如果第二发送SYN+ACK,不用应答。此时会出现三种情况

    一、二次握手失败,C端会重复发送SYN报文,等待对端发送确认报文,S端会保存tcp连接的所有资源,大量的这种情况会导致S资源耗尽。

    二、二次握手成功,S收不到ACK会重复发送SYN+ACK报文。

    三、二次握手完以后,双方以为连接建立成功,即可开始通信。假如此时连接并没有真的建立成功,S端开始发送消息,会造成网络拥堵发生。

    为什么不能是四次?

    四次其实原则上来说是可以的,就是把第二次的ACK和SYN分两次发送。在理论上是完全可以行得通的,但是TCP本着节约网络网络资源的前提。

    还有一种是不拆开二次握手的捎带应答,三次握手之后C端继续发送SYN报文,其实这是徒劳的。第三次完成以后链接已经建立,后面无论多少次都是徒劳。

    如果双方同时建立连接,会发生什么情况?

     

    TCP同时建立链接

    这就是双方同时建立链接的情况,情况还不错,反正能建立成功,这点是肯定的。但是要注意两点

    第一、此时只会建立一条全双工的TCP链接,不是两条。

    第二、双方没有CS之分,两端都是同时承担两个角色,客户端和服务器。

    四次挥手断开链接

    先整个图看下四次挥手的整个过程和状态转移。状态转移会考看仔细点。

     

    四次挥手断开链接

    依旧采用C/S模式解释此过程。

    第一次:当C端的应用程序结束数据传输时,会向S端发送一个带有FIN附加标记的报文段(FIN表示英文finish),此时C端进入FIN_WAIT1状态,C端不能在发送数据到S端。

    第二次:S端收到FIN报文会响应一个ACK报文,S端进入CLOSE_WAIT状态。进入此状态后S端把剩余未发送的数据发送到C端,C端收到S端的ACK之后,进入FIN_WAIT2状态。

    同时继续接受S端传输的其他数据包。

    第三次:S端处理完自己待发送的数据之后,也会发送FIN断开链接的请求,S端进入LAST_ACK状态。

    第四次:C端收到S端的断开链接请求后会启动一个定时器,该定时器时长是2MSL(最大段报文生存时间),同时发送最后一次ACK报文。

    为什么要四次挥手?

    TCP是全双工的通信机制,每个方向必须单独进行关闭。

    TCP传输连接关闭的原则如下:

    当一端完成它的数据发送任务后就可以发送一个FIN字段置1的数据段来终止这个方向的数据发送;当另一端收到这个FIN数据段后,必须通知它的应用层 对端已经终止了那个方向的数据传送。

    为什么不能用三次握手中捎带应答机制减少一次握手?

    这点到是很迷惑人,但是掌握了TCP传输的一些细节就会发现并不难。

    TCP是全双工通信的,S收到断开链接请求后只是表示C端不会传输数据到S端了,但是并不表示S端不传输数据到C端。

    如果采用捎带应答,S端将无法把剩余的数据传输到C端。

    为何最后一次ACK之后需要等待2MSL的时间?

    网络是不可靠的,TCP是可靠协议,必须保证最后一次报文送达之后才能断开链接,否则会再次收到S端的FIN报文信息。

    而等待2MSL时间就是为了保证最后最后一次报文丢失时还能重新发送。

    为何是2MSL的时间?

    2MSL是报文一个往返的最长时间,假设小于这个时间会发生,ACK丢了,但是还没接收到对方重传的FIN我方就重新发送了ACK。

    如果已经建立了连接,但是客户端突然出现故障了怎么办?

    这个不难TCP自己做了保证,TCP默认有个定时器,每次收到客户端的请求后会把定时器设置好,通常设置两小时,超过两小时还没收到数据。

    服务端会发送一个探测报文,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

    总结

    三次握手和四次挥手的知识基本告一段落了,就讲到这里了,如果有什么不明白的地方可以加我微信探讨。

    展开全文
  • 而快乐不仅是利润带来反应,更多是自我修正后自信,价格变化背后更多是人心和人性必然,到了一定阶段不再追求某一次盈亏,而是在寻找更有力狙击方法,质量永远比数量要重要多。 17.jpg 第一点:你...

    舒亦梵:身为一个现货投资者,你需要的是什么

    无法拒绝的是开始,无法抗拒的是结束,宁愿丑的别致,也不愿美的雷同,如果在交易的过程中,让你变的难过了,就蹲下来,抱抱自己!而快乐不仅是利润带来的反应,更多的是自我修正后的自信,价格的变化背后更多的是人心和人性的必然,到了一定的阶段不再追求某一次盈亏,而是在寻找更有力狙击的方法,质量永远比数量要重要的多。

    17.jpg

    第一点:你作为一个投资者,你觉得你真正需要的是什么?

    在我看来,你需要一个“高收益,低风险”模式,那是否真实存在呢?试问亏损包赔的基础上帮你控制资金风险,让你自己能够做到稳定的盈利,如果你不相信这个市场能够稳定盈利,那我试问你一句,即使你出现亏损,但是有人时刻当你的资金后援站,那么是不是放大了你的盈利空间?如果说你爆仓一次没有吸收经验,爆仓两次依旧没吸收经验,那么我们给你资金再来第三次,第四次,乃至第十次,但是前提是,你千万不能频繁交易,也千万不要把自己的资金不当钱,此模式主要的服务是帮你保障本金风险,增大盈利而已,而不是让你染上市场上投资者的坏毛病。

    第二点:作为一个新手真的需要花大量的时间去学习技术吗?

    我个人认为是不值得的,对于新手小白来说,也许你听说了投资市场的风险,但是又无奈忍受不了市场金钱的诱惑,你拿着几万人民币过来交易,但是又害怕赔完了,于是你错过了100美金,150美金的行情,陷入进退两难的地步,我们模式帮你,即使一万个不小心出现了亏损甚至爆仓了,我们再赔给你,你的交易还至于担惊受怕吗?你还怕自己学不到技术吗,或许模拟你不当钱,或许你看多了走马观花,但是真正到你自己资金的时候,你自己是否真的吸取到了教训呢?那是肯定的,没有人不会珍惜自己的东西,包括我也是,更何况我们还能帮你最大程度上的提供盈利,你还有什么不满意的呢?

    一直以来有好友的朋友都知道我每天及时更新的思路,方向思路都有了,至于没有跟上盈利或者还在亏损的朋友,可能是你的技术实在是不到位,不敢下单无非是克服不了内心的纠结,纠结源于对自己的不自信,不自信就算别人把点位告诉你,做单的时候还是会迟疑,你缺少一个鼓励一个肯定,不如去找一位老师,不管是我还是其他人,给你一颗定心丸比较好。再来说说亏损的,被套的,不能说你是小白,不能说你是运气差,往往‘’运气差的‘’人后期运气会更差,‘’运气好‘’的人哪怕运气差了几天,后面好运气还会来。真的是运气的成分吗?

    13.jpg​

    很多亏损的客户做单做着做着就急了眼,做空行情涨了,偏偏不信邪,就不信行情不会跌,就不信自己做的总是错,前期止损后面索性不带止损,就算扛单也要把这一波走完了等着出单机会。唉,何必呢?跟行情较真真的有意思吗?很多分析师朋友喜欢解析本周做单的缘由,我相信大家看了那么多,该赚的一直在赚,该亏的一直在亏。不是你不知道如何操作,是你内心太不平静,累了就停下来休息一下,错误的路上走到底错的更远,只要心态没有被击溃,就还有机会,风景都要边走边看,何况是操作呢?留得青山在不愁没柴烧,还是那句话,输给的不是行情而是心态!

    相互之间的信任是赚钱的基础,给你一份指导换来一个真心相交的朋友,俗话说朋友遍天下,走到哪里都不怕,我希望用自己的实力和真诚打开你我之间的隔阂。

    展开全文
  • 开始的需求是这样子的,我为了实现两个页面组件之间的数据传递,假设我有页面A,点击页面A上的某个按钮之后,页面会自动...关于vue中的eventbus的使用,我之前在篇vue中的数据传递中提到。 先给你们看...

    一开始的需求是这样子的,我为了实现两个页面组件之间的数据传递,假设我有页面A,点击页面A上的某一个按钮之后,页面会自动跳转到页面B,同时我希望将页面A上的某一些参数携带过去给页面B。

    然后我就想,这不就是不同组件之间的数据传递问题而已吗?直接用bus 巴士事件来传递数据不就行了吗。于是,我就很愉快地进行了。关于vue中的eventbus的使用,我之前在一篇vue中的数据传递中有提到过。 

    先给你们看一下我一开始的代码:

    实现目标: 
    点击之后,bus emit事件,然后顺便跳转路由到/moneyRecord页面。
    接下来就是在MoneyRecord页面中去on接收这个事件,然后接受参数。
    // 这是页面A的内部触发bus事件的代码
      editList (index, date, item) {
    //  点击进入编辑的页面,需要传递的参数比较多。
          console.log(index, date, item)
          bus.$emit('get', {
            item: item.type,
            date: date
          })
          this.$router.replace({path: '/moneyRecord'})
        }
    
    // moneyRecord页面
    created () {
        //这里我将icon的list给保存下来了
        bus.$on('get', this.myhandle)
      },
    methods: {
      myhandle (val) {
          console.log(val, '这是从上个页面传递过来的参数')
        }
    }
    

    就当我欣喜若狂的时候,觉得自己只要在页面A触发了get事件,页面B中就会理所当然的接受了数据。然而,结果却不如人意,看一下下面的动图。

    主要是看“”这是从上个页面传来的数据这一行数据的输出次数情况来判断事件触发次数。“”

    test.gif

    不知道你有没有发现,就是我第一次进去list页面的时候,我随便点击一下list下的任何一个item,控制台没有输出。但是当我第二次再点击触发事件的时候,就会输出一个测试数据。再一次进去点击,就输出两个数据。。。依次增加了。(控制台上那个“这是从上个页面传来的数据”就是测试数据)

    所以,有两个问题。

    问题

    • 问题1: 为什么第一次触发的时候页面B中的on事件没有被触发
    • 问题2: 为什么后面再一次依次去触发的时候会出现,每一次都会发现好像之前的on事件分发都没有被撤销一样,导致每一次的事件触发执行越来越多。

    解决

    针对问题1
    这个还得从vue的生命周期说起了,我先进行了测试,就是当从页面组件A跳转到页面组件B的时候,两个组件的生命周期分别是怎么样的,关于vue的生命周期具体每一个时期做什么事情我就不再赘述了,下面po一张vue生命周期的图。

    image.png

    我自己做了实验来验证,这个页面跳转过程中,这两个组件的生命周期的执行情况。

    // 我分别在页面A和页面B中去添加以下代码:
    beforeCreate () {
       console.group('%c%s', 'color:red', 'beforeCreate 创建前状态===============组件2》')
     },
     created () {
       console.group('%c%s', 'color:red', 'created 创建完毕状态===============组件2》')
     },
     beforeMount () {
       console.group('%c%s', 'color:red', 'beforeMount 挂载前状态===============组件2》')
     },
     mounted () {
       console.group('%c%s', 'color:red', 'mounted 挂载状态===============组件2》')
     },
     beforeUpdate () {
       console.group('%c%s', 'color:red', 'beforeUpdate 更新前状态===============组件2》')
     },
     updated () {
       console.group('%c%s', 'color:red', 'updated 更新状态===============组件2》')
     },
     beforeDestroy () {
       console.group('%c%s', 'color:red', 'beforeDestroy 破前状态===============组件2》')
     },
     destroyed () {
       console.group('%c%s', 'color:red', 'destroyed 破坏状态===============组件2》')
     }
    // 另外一个组件的我就不放出来了
    

    测试结果图:

    test.gif
    image.png

    其实,可以通过结果清楚看到,当我们还在页面A的时候,页面B还没生成,也就是页面B中的 created中所监听的来自于A中的事件还没有被触发。这个时候当你A中emit事件的时候,B其实是没有监听到的。

    再看一下,红色的是B页面组件,当你从页面A到页面B跳转的时候,发生了什么?首先是先B组件先created然后beforeMount接着A组件才被销毁,A组件才执行beforeDestory,以及destoryed.

    所以,我们可以把A页面组件中的emit事件写在beforeDestory中去。因为这个时候,B页面组件已经被created了,也就是我们写的$on事件已经触发了

    所以可以,在beforeDestory的时候,$emit事件

    // 修改一下A页面中的代码:
    // 这是原先的代码
      editList (index, date, item) {
    //  点击进入编辑的页面,需要传递的参数比较多。
          console.log(index, date, item)
          this.item = item.type
          this.date = date
          this.$router.replace({path: '/moneyRecord'})
        }
    // 重新在data属性内部定义新的变量,来存储要传过去的数据;
    然后:
     beforeDestroy () {
     console.log(this.highlight, '这是今年的数据', this, '看看组件销毁之前会发生什么')
     bus.$emit('get', {
            item: this.item,
            date: this.date
          })
     },
    

    接下来。看一下修改之后的效果

    test.gif

    可以看到,就是第一次点击list的时候,也就是第一次触发emit事件的时候,控制太就输出了,所以在beforeDestoryed去$emit是起到作用的,B页面组件也监听$on到了。

    但是,好像,就是事件的触发还是会依次增加,就是控制台的输出每次都有所增加了。。。

    解决:
    看一下github上提出的。issue
    https://github.com/vuejs/vue/issues/3399

    image.png

    尤大大提出了以下解决:

    image.png

    *就是说,这个$on事件是不会自动清楚销毁的,需要我们手动来销毁。(不过我不太清楚这里的external bus 是什么意思,有大神能解答一下的吗,尤大大也提到如果是注册的是external bus 的时候需要清除)****

    所以。我在B组件页面中添加Bus.$off来关闭。代码如下:

    // 在B组件页面中添加以下语句,在组件beforeDestory的时候销毁。
      beforeDestroy () {
        bus.$off('get', this.myhandle)
      },
    

    来看一下输出的结果

    t可以看到,控制台第一次进去的时候就有输出,而且输出的不会逐次增加

    *当然,尤大大还说可以写一个mixin?我还不知道是什么?以后在研究一下。

    总结: 所以,如果想要用bus 来进行页面组件之间的数据传递,需要注意亮点,组件A$emit事件应在beforeDestory生命周期内。其次,组件B内的$on记得要销毁。

    提问时间:你们在实现页面组件之间的数据传递有什么好的方法吗?可以留言分享一下吗?有时候虽然也可以通过从后台获取,但是考虑到数据只有几个需要传的话,就没有必要去请求数据,我知道有的还有用vueX传递。还有呢?



    作者:Katherine的小世界
    链接:https://www.jianshu.com/p/fde85549e3b0
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    展开全文
  • 飞机游戏java源码 CS 4330/5390: ...一次射击要么是在船上“命中”,要么是“未命中”。 当一艘船所有方格都被击中时,这艘船会下沉。 如果玩家所有船只都被击沉,则游戏结束,对手获胜。 在
  • 但是,这哥们科目二竟然挂了四,第五次有没有我不知道,因为我科目三都考了,那哥们还在练科目二。教练真气不轻,天天扯着嗓门喊:“你那个脑袋瓜子特么能不能不要钻到车窗外面看,把车窗玻璃给我摇上去,...

    嗨,小伙伴们大家好,我是沉默王二,就是那个吹自己既有颜值又有才华的家伙。今天这个话题我觉得还是值得和大家探讨的,因为好的编程习惯对程序员的职业生涯真的非常重要。

    记得我在学驾照的时候,遇到一哥们,之前开过车,属于无证驾驶的那种。但是,这哥们科目二竟然挂了四次,第五次有没有过我不知道,因为我科目三都考过了,那哥们还在练科目二。教练真气的不轻,天天扯着嗓门喊:“你那个脑袋瓜子特么能不能不要钻到车窗外面看,把车窗玻璃给我摇上去,里面难道看不到镜子吗?”

    我在排队等车期间真的观察过,尤其是侧方停车的时候,这哥们总是有意无意把脑袋伸出窗外看,玻璃摇上去的时候都能磕到车窗上,看得我都替他捉急。教练说这哥们之前开车的时候养成了这个坏习惯,现在想改就是改不过来;报了 VIP 也没用,最后一次看天意吧,实在是没招了。

    不是我吹牛,我科目二就考得挺顺利,一次性过,倒车入库的时候感觉都要压线了,但凭借着两周时间养成的好习惯硬是过了。

    那接下来我就来分享三个好习惯,自我感觉良好地认为,值得所有的小伙伴们借鉴。

    01、代码一定要规范
    任何编程语言都有自己的一套规范,好的规范能让代码更易阅读,能让 bug 没有容身之处。你比如说,Java 类的命名应该遵守以下规则:

    必须以大写字母开头
    最好是一个名词,比如说 System
    尽量不要省略成单词的首字母
    来看个例子:

    public class Writer {}
    1
    再比如说,方法的命名应该遵守以下规则:

    必须以小写字母开头
    最好是一个动词,比如说 print()
    可以包含多个单词,第一个单词的首字母小写,其他的单词首字母大写,比如说 actionPerformed()
    来看个例子:

    void writeBook(){}
    1
    遵守这些规则就像是在马路上遵守交通规则一样,否则后果不堪设想。之前给小伙伴们安利过两个 IDEA 插件,一个阿里巴巴的开发规约,一个 SonarLint,它们在提高代码质量上面的效果杠杠的,我自己一直在用。

    还有就是阿里出品的 Java 开发手册,一定要把上面罗列的条目刻到脑子里,至少放一份在桌面上吧,活学活用。

    我之前在日企的时候,公司内部就有一份编码规约,关于 ActionScript 方面的,详细程度可以和阿里的开发手册媲美,只不过没有对外开放。好多年过去了,虽然规约上面的内容忘得一干二净,但它给我的印象深刻——就像初恋女友一样,容颜早已忘却,背影却时不时涌上心头(逃。

    02、学会阅读源码
    源码是香,但我不建议新手一上来就阅读源码,因为很容易劝退。就好像文章开头提到的学驾照一样,如果一开始就从科目三练起,那多半会在路上完蛋。

    阅读源码之前,技术储备一定要到位。也就是说科目三练习之前,科目一的理论知识要过关,科目二的基本技巧要掌握,如果说方向盘都不会打,油门刹车都不会踩,档位都不会挂,那教练不被吓出心脏病才怪。

    一旦你的技术功底达到一定程度后,想要更上一层楼,阅读源码就变得势在必行了。因为阅读源码有以下好处:

    解决 bug。如果 Google、Stack Overflow 上搜不到答案,那么阅读源码几乎就是唯一可行的解决办法了。

    知其所以然。比如说,你想知道为什么 String 类是不可变类,那就必须钻一钻源码才能明白。

    学习。为什么大牛们都会推荐 GitHub,就是因为它上面的项目都是开源的,源代码是可以直接阅读的。

    改造。很多时候,我们已经拿到了一个轮子,但需要对它进行一些改造才能满足需求,那就必须在改之前阅读源码,否则,轮子可能会被改造成锤子。

    知道阅读源码的好处了吧?那有小伙伴可能要问,怎么去阅读源码呢,有哪些技巧呢?我来分享一下自己经验:

    先阅读文档。知道库是干嘛的,知道类是干嘛的,知道方法是干嘛的,知道变量是干嘛的。

    打断点,进行调试。代码之间会有很多调用关系,如果只看不动手和源码干一架的话,很可能不知道代码之间是如何衔接的,通过调试就可以看清楚整个源码之间的脉络。

    分享阅读源码后的心得。所谓好记性不如烂笔头,写下来可不只是为了分享自己阅读源码后的喜悦之情,更重要的是,当你忘的差不多时笔记可以唤醒你的记忆。

    03、独立思考并解决问题
    我的技术交流群里有过那么一个小伙伴,一年多时间过去了,几乎没什么成长,遇到问题就往群里群里扔,或者直接私信发给我。我发现,现在问的问题和一年前问的问题真差不多,无非就是形式上发生了一些变化。

    这说明什么呢?这名小伙伴没有学会独立思考,没有学会举一反三。人最珍贵的财产其实不是钱,而是思考的能力,对吧?脑子是越用越灵活的,不用呢,就真的会生锈。

    一旦你学会独立思考,那么你解决问题的能力真的是会提升一个很高的档次——从一名合格的程序员蜕变为一名优秀的程序员的关键节点。在我上大专的两年时间里,成长真的特别慢,因为遇到问题我就想着问同学啊,问老师啊,结果是同学和老师进步了,我还是原来的我。

    等到大三去实习后,一切就悄然改变了,领导忙得很,压根就没有工夫帮你解决一些鸡毛蒜皮的小问题。再者,真不好意思,不能把底裤漏给领导看啊,没办法,我就只能自己硬着头皮上。

    硬上的次数多了,真的发现,原来自己不通过别人的帮助也能够把问题解决掉。渐渐地,随着时间的推移,我在团队里面开始显山露水了。

    那怎么才能培养独立思考的能力呢?按照胡适先生所说的,就是质疑一切,然后提出假设,最后去求证。

    你比如说,Java 程序员都知道 String 类是不可变的,那假如说它是可变的呢?会是什么样子,研究完你就会明白,原来一个不可变类是这样设计的啊,自己也能搞个不可变类了!

    04、最后
    好了,我亲爱的小伙伴们,这篇文章就探讨到这吧,也许这些习惯你早已经养成,那再好不过了,我必须要为你点个赞。如果你还保留了其他的一些好习惯,欢迎在留言区昭示天下,别藏着掖着啦,让我们也开开眼界,见识见识,学习学习。

    如果觉得文章对你有点帮助,请微信搜索「 沉默王二 」第一时间阅读。本回答已收录 GitHub,传送门~ ,里面更有大厂面试完整考点,欢迎 Star。

    原文链接:https://blog.csdn.net/qing_gee/java/article/details/105779681

    展开全文
  • 了解,JVM就是Java虚拟机,JVM内存方法区,虚拟机栈,本地方法栈,堆和程序计数器。 垃圾回收机制算是Java语言很重要一个特性。...如果需要,可以在程序显式地使用System.gc()来强制进行一次立即内存...
  • 可是参加工作十年了,我真真意义上这么一次。虽然之前帮忙做一些零散事情,但是都不够体系化。这一次才是真正意义上第一次接私活。话不多说,直接入正题。 2020-06-21 当天中午,接到老家一个亲戚电话,...
  • Java线程池,你真会用吗?

    千次阅读 多人点赞 2018-11-05 09:34:19
    在《深入源码分析Java线程池实现原理》这篇文章,我们介绍...作者之所以这么说,是因为这种创建线程池方式很大隐患,稍不慎就有可能导致线上故障,如:一次Java线程池误用引发血案和总结( https://...
  • 一建标题稍微简化为二建标题,虽然总体难度一建确实盖了二建,但只需要在二建基础上加强和深化知识点,不会非常困难。 比如在二建备考我们用了大量一建实际问题示例来解释知识点,两者融合早在我们...
  • 尽管那台很老的服务器几乎难以满足商店运营的需要,但经营者甚至连更换UPS中的电池都不愿意,事实上电池每两年应该更换一次。终于一天突然停电了,而这个UPS实在是太老了,它已经不能使服务器安全关机了。电池...
  • 成就一生成功之路:掌握创业5个黄金阶段 有些事,做错了还可以重新来,但生命每个阶段抉择,都只能有一次。一旦决定了方向,不要后悔,要勇往直前! 我把创业依照年龄分为五个阶段,以下便是我〈五年...
  • 本来最简单的,一次请求,后台一次性返回所有内容,这个过程结束了。 现在后台的处理比较多,耗时较长,得到的数据慢,先后写入到PrintWriter中的。 为了不让页面等待太久,现在想把先写入到PrintWriter...
  • 一次与面试官:情景对话一问一答,例数 Spring 事务那些坑,你遇到吗? 今天,我们来讲 Spring 中和事务有关考题。 因为事务这块,面试出现几率很高。而大家工作 CRUD 比较多,没有好好总结这块...
  • 端口号/项目名,然后我去试着ping两台机器,发现一切都正常,之后我在这个服务器上单独本地访问web项目(非开发电脑,部署测试),访问localhost去看是否能访问这个部署在tomcat项目(仅有一个),发现,服务器...
  • 但寻思了一下,我同学和朋友,多少还是一些从事相关方向并且在一线(或曾在一线)工作过的,所以我请他们帮忙一起梳理这几个我不熟悉领域学习路线,这次嵌入式开发就是其中之。 这篇文章之所以拖这么久...
  • 如果研究HashMap源码同学应该会知道,HashMap底层数组长度不就是2n次方吗,那HashMap是不是这道题答案呢? 答案是肯定,HashMap确实就有这个方法,而且实现上非常巧妙与简洁,下面让我们来看看...
  • 有用STM8S001J3这颗8PIN单片机吗

    千次阅读 2019-01-06 21:59:57
    如题,有用STM8S001J3这颗8PIN单片机吗?...如果你在代码,把烧录口SWIM初始化成串口,可能只能烧录一次,第二次就没法烧录了。 我解决方法是,在初始化SWIM这个IO为串口之前,延时5秒...
  • WC最近入手了一款“淘金游戏”,在某一次游戏,WC触发了隐藏地图,进入了疯狂淘金币环节,现在一列金币摆在WC面前,吞吃金币可以获得一定经验值,每个金币经验值不一定相同,甚至还存在“黑金币”会使得...
  • 同时,纸长度每对折一次会缩小1/2,所以纸长度在不断对折过程会呈指数减小。对于一张普通便笺纸来说,对折7次以后,纸张厚度会超过其长度,在这种情况下,是没有办法再次将这张纸对折。这和折纸人...
  • .世代游戏建模到底是什么呢? 对于刚开始了解建模小白们来说,...世代模型设计是指世代模型设计师根据游戏原画稿件设计出游戏环境、道具、机械、人物、动物、怪物等物体模型,由于世代游戏搭载...
  • 前言 关于Redis知识点总结了一个...RDB文件是一个压缩过的文件,因此RDB持久化体积比AOF小,因为存储是数据,所以恢复很快,性能好,但是可能会丢失最后一次持久化数据。 RDB持久化机制两种方式 显示开启
  • 但我接受过5个月java培训(学还行吧),而且我也很喜欢写程序,但公司现在让我在项目组先做测试,我曾经特意找我主管说过一次我想写程序,但他当时是说可以把我调到专门写程序那个部门,但后来又没下文了,我...
  • 我用C#作了一个窗体应用程序,用cefSharp做了个浏览器放在窗体,窗体打开网页里面个元素(div)显示文字内容段时间会变化一次。 我希望可以将这种变化做成一个触发事件样子,也就是这个元素显示...
  • 在西游记,唐僧作为长生不老延寿资源可谓十分著名了。...2.特性:不可再生,吃一次老唐死了,但不排除割下老唐一块无关紧要肉,再养伤,再割肉这种再生吃法; 3.传说功效:“唐僧乃十世修行真体,人吃他

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 962
精华内容 384
关键字:

有过一次就中的吗