• 冬渐暖
    2019-11-14
    在编码数据前,先对数据进行积累Cumulator。解码的时候先判断是否小于固定的长度,小的话就是包不全也就不去解码数据,等于的话就直接解(没问题),大于的话就解对应长度的,多的那部分还是在积累器里面,等下次用

    关于Cumulator,先看看空间够不够,不够扩容,然后
    有两种方式
    1.内存复制(默认)
    2.像list一样组合起来
    内容复制:就是把数据复制到内存里面去
    关于您说内存复制是默认的,,,buff是子类的decoder搞出来的,所以不能说哪个是绝对的好,但为什么内存复制更加通用所以才选择这个啊.........................?

    netty有三个编码器,对应上节的三个找边界的,
    其中有个固定长度的,可以设置偏移量等一系列参数,比如传进来的数据为“18cm不含头”,描述符为“7” ,下次读的时候就往右偏一个字段,不读描述符的那个“7”
    展开

    作者回复: 因为组合的方式没有经过充分的证明:证明在所有场景下肯定比内存复制的性能要好(毕竟组合方式的指针维护复杂些,如果解码是把组合的直接能拆出来就可以用,那明显会好,例如ssl hanlder里面就有显示设置为组合方式的例子,但是大多不是如此用,仅有的测试也只是表明好一点而已),所以自然默认就用原始的那种方式(也就是所有人一上来就会想到的通用的内存复制的方式),而不是直接切换到后来加的组合方式,只是提供了setCumulator方法让我们有切换的选择。
    总结下:不是说1+1不等于2,而是说大家都这么觉得,但是没有人去有力的证明,所以保持怀疑的态度,就保守起见了,没有改默认的。

    
     1
  • 蓝魔丶
    2019-11-03
    老师,视频里讲到的数据收集器有两种方式,一种内存复制,一种组合方式,这两种方式netty选择内存复制作为默认方式,视频中也说明了原因,但是感觉不够深入,听着还是没有说服力,后面会有深入分析嘛?

    作者回复: 这是个好问题,正好前面(或许是后面)也有一个人问这个问题,我直接复制下给他的回复吧:
    因为组合的方式没有经过充分的证明:证明在所有场景下肯定比内存复制的性能要好(毕竟组合方式的指针维护复杂些,如果解码是把组合的直接能拆出来就可以用,那明显会好,例如ssl hanlder里面就有显示设置为组合方式的例子,但是大多不是如此用,仅有的测试也只是表明好一点点而已),所以自然默认就还是用原始的那种方式(也就是所有人一上来就会想到的通用的内存复制的方式),而不是直接切换到后来加的组合方式,另外提供了setCumulator方法让我们有切换的选择。

    总结下:不是说1+1不等于2,而是说大家都这么觉得,但是没有人去有力的证明,所以保持怀疑的态度,就保守起见了,没有改默认的。

    
     1
  • z.l
    2020-02-08
    看了源码,说下我对两种方式的Cumulator的理解。我觉得使用哪种主要看decode实现,如果decode的实现包含很多随机读(比如读取第4-8个字节这种),这种情况肯定是基于复制的Cumulator更好,因为复制方式是连续内存,随机读时间复杂度为O(1), 而组合方式是基于数组实现,由于不确定目标内容在数组的位置,所以 需要遍历数组,效率偏低。
    
    
  • delete is create
    2019-12-25
    如果客户端传的是16进制字节流,用DelimiterBasedFrameDecoder做分隔符就不好使了,客户端必须发送字符串才行 老师怎么解决这个问题

    作者回复: 你这个问题是你自己假想的?因为最终交给底层的(jdk的)的数据类型还是byte,所以你肯定要转的,所以你的16进制最终还是要与byte互转,所以再加一层编解码就行,或者直接在已有的编解码里面转也可以。另外,DelimiterBasedFrameDecoder说是分隔符,但是还是byte:io.netty.handler.codec.DelimiterBasedFrameDecoder#delimiters

     1
    
  • Sebastian
    2019-12-25
    不应该先写个netty使用的demo吗。从来没接触过netty的看着有点蒙

    作者回复: 可以先看第四章,但是直接看,就算是demo,缺乏很多背景知识也难懂,所以才把相关知识放前面了,你可以结合着看看,现在都更新完了。谢谢

    
    
  • polk
    2019-12-04
    讲那四个参数,打开画图或者notepad写两个例子不就一目了然了,光对着源码我又得看很多遍

    作者回复: 因为他的源码那个注释很详细,里面也有图(虽然不太好看),所以对着源码说了,哈

    
    
  • 陆凌枫
    2019-11-02
    老师,课程看得很吃力,特别是一讲源码。想问下学习Netty之前,需要先补下nio相关知识点吗?或者是其它相关知识点?

    作者回复: 推荐一本 java tcp ip socket网络编程,默认很多没有讲的前提性的基础知识可以看看这本。

    
    
  • reed7
    2019-10-28
    Netty 在运行时是依据什么信息决定使用哪个 decoder 的?

    作者回复: 自己代码指定的,也就是你定义了你的传输信息结构,或者说叫pdu后,你就确定了你用那种解码了,然后你就找哪些支持了,显示设置下,找不到就只能自己写了。就是你告诉他怎么解他才知道,它自己不自动判断

    
    
  • NoBody
    2019-10-27
    老师你好,对于java网络编程没有实际经验只有了解的情况下的开发人员来说。我觉得这样的课程安排其实有点欠妥。源码层面是否应该在掌握了一些基本概念和基本使用的情况下去认识呢?

    作者回复: 这是两种学习方法,但是netty的使用真的很简单,所以才把这个顺序掉过来了😂,你可以尝试换个方法看,从后往前看,然后再反过来看下。

    
    
  • WING
    2019-10-24
    老师,这节课中提到内存复制和非内存复制,后面有两节课讲内存的,会不会设计到这方面?很想了解netty作者在这方面的巧妙之处。

    作者回复: 后面确实有一节提及内存相关了,主要说的是堆外内存、内存池等相关的。

    
    
  • 偶然~zZ
    2019-10-17
    希望老师多一点实战教学 一边实战 一边解读 光讲源码 映像不是很熟深刻

    作者回复: 这个是安排在第四章和第五章,先大体看下源码有个印象,再实战可能效果好点,所以才这么安排的

    
    
  • 加载中……
    2019-10-16
    老师好,请教个问题。
    对于Netty来说,如果一次解码,因为长度不够没解出来,上层的处理代码是不是永远也感知不到这部分数据?

    作者回复: 不知道您这里说的上层是指什么?如果是业务层,确实是的,它先把不够数据屯起来,所以不会往外传,传也没用,因为不完整

    
    
我们在线,来聊聊吧