• onlyone
    2019-10-29
    固定长度方式,如果一个数据包比较大,超过了缓存区大小,即使头部设置了长度大小,有一部分内容也会放在第二个包传进来,业务处理肯定要求是逻辑上完整的数据包,netty会自动做合包处理吗?

    作者回复: 会做的,他会把那个不完整的数据先存起来,等待完整了,再合并起来。然后再往下一级channel handler处理器上传。

    
     3
  • 小不点
    2019-10-16
    学习不是短时间的冲刺,而是有节制的坚持

    作者回复: 可持续发展……

    
     3
  • paradox
    2019-11-13
    请问老师,如果一次性读取了含有多个消息的byteBuf,如 ABC\tBCD\tADC\t,服务端DelimiterBasedFrameDecoder再按照\t接收是不是就是收到了ABC\tBCD\tADC?然后进一步拆分呢

    作者回复: 先是一次性收到了ABC\tBCD\tADC\t,然后传给DelimiterBasedFrameDecoder,就会解出三个对象,然后传递给下一级处理器了。所以所以对于下一级来说,它不需要再拆分了。

    
     2
  • Gary
    2019-10-16
    如何处理错误呢?比如对端不按TLV方式(第三种)传输,你会解析出一个很大的长度,导致内存溢出,服务崩溃

    作者回复: netty解码上,会捕获throwable错误,然后转成exceptionCauget方法调用让你去处理,所以上层怎么处理完全你自己决定了:比如直接把连接断了,让它去重连。另外,设置编解码有个最大长度控制参数,控制了,没那么容易挂

    
     1
  • delete is create
    2019-12-25
    老师您好,如果客户端向服务端发送数据 发生了半包问题,假设一共分了3个包, 服务端接收到一个包后 服务端就宕机重启了 那重启后还可以接收到其余的俩个包么

    作者回复: 一般都不会收到了,就算收到也没有用,组装不回原来的完整的消息(重启了,所以之前存在内存的半包数据丢了),这种情况,都是需要依赖客户端重试那完成失败的请求。

    
    
  • 冬渐暖
    2019-11-13
    半包的原因:发的数据太大装不下了。。。
    我感觉粘包和半包就是类似于平常的断点续传。。。。

    找到消息边界
    1.关于固定长度,这个我在之前和平安银行对接的时候,他就要求你没有的话就补0...很多老的存储过程也是这样子,这个比一个一个连接好多了。在空间固定的情况下算是不错的选择了。
    2.关于加分隔符,我刚参加公司的时候,因为没人带,所以对一些特殊的东西都喜欢加个标签来过滤,比如<wdd></wdd>截取中间的内容。因为多加了东西,这样个人感觉传的时候也是浪费空间,所以我对你说的空间不浪费有点感到疑惑。。。。。。以前是用这种方法,现在感觉好沙雕哈哈,传入解析都需要处理
    3.关于固定长度的
    我有点没听懂。。。。
    我能不能理解为
    ①先看这个传进来的有多长,类似于java的“”.length(); 然后再根据长度读这个数据
    ②还是先把数据收进来,然后自己想一个合理的长度。。。。。然后读
    感觉这个和固定长度差不多啊。。。也是浪费空间啊。。。
    我的网络知识比较薄弱。。。。希望老师能解答一下我的这些疑问。。。
    展开

    作者回复: 1 空间固定的场景应该极少吧,否则都不需要补0了;
    2 加分隔符而言,如果内容都不需要转义,那不管长度是否符合要求确实一点不浪费空间,但是你说的也是对的,就是有转义的话,是有一点点浪费的,但是换个角度想,如果有那么多都需要转义,说明你的分隔符有点普通了。
    3 比如你的内容是100字节的,所以定义了一个长度字段(比如2个字节),存上数字100,那这样的话,读取的时候,每次都是读那个长度字节(固定2个字节)看看后面的内容长度是多少,比如100,那接下来你就知道要去读100字节了,而不是101什么的。

     1
    
  • MAKE
    2019-10-31
    固定的分隔符-> http协议 以\n去判定一条一条的header以及requestLine netty对应的实现类io.netty.handler.codec.http.HttpObjectDecoder这里面有一个headerParser
    用长度去解析包-> RocketMQ自定义协议,以两个字节(还是四个字节的,忘了)为剩余有效包的长度去解析

    作者回复: 补充:http协议里面的content length字段又融合了解length的方式。

    
    
  • Ab
    2019-10-28
    老师的“hold 不住了”总结的太精辟了👍😄
    
    
  • 朱延云
    2019-10-24
    推荐+的这种方式,没有很理解,能举例说明下吗?

    作者回复: 简单说,就是一个长度字段,然后后面跟着内容,那个长度字段是固定的,比如2个字节,存的就是后面跟着内容的长度,所以读取这个数据的时候,先读固定的那2个字节,拿到长度信息,然后就根据这个长度字节读取后面那么长的数据就行了。

     1
    
  • zpzeng
    2019-10-19
    老师,我看SocketChannel注册到workerGroup,是在ServerBootstrap.ServerBootstrapAcceptor#channelRead 方法中,而这个方法调用是在ByteToMessageCodec,MessageToMessageCodec中,这两个和ByteToMessageDecoder,MessageToMessageDecoder有什么区别吗?

    然后我看执行过程好像是由pipeline定义的,然后我之前理解是,ServerSocketChannel创建socketChannel之后,是在一个线程里执行执行pipeline的不同阶段。但是现在看着好像是pipeline的每个阶段都要重新注册到group中,选择新的线程执行。是这样吗?能够简单说一下这个过程呢?

    eventLoopGroup是个什么概念,我现在理解是个线程池一样的东西。
    麻烦老师解答一下
    展开

    作者回复: 1 一个是编码,一个是解码,相当于一个发一个收,编解码的区别主要看输入和输出是什么
    2 也可以理解成线程池,他的本质是多个event loop,而一个evnt loop里面只有一个线程,来做绑定到这个event loop里面的多路复用器上发生的事,你看到的每个阶段不是重新注册,是判断每个处理器有没有指定自己的执行器,没有就用最开始选择的那个。如果有,就执行线程切换

    
    
  • 拾年
    2019-10-16
    老师可以说一些学习netty之前要系统的学习哪些相关知识吗,因为平常工作中接触不到这方面的

    作者回复: java网络编程,tcp ip协议,主要就这些领域知识

    
    
我们在线,来聊聊吧