课件和 Demo 地址
https://gitee.com/geektime-geekbang/geek_netty
作者回复: 可持续发展……
作者回复: 会做的,他会把那个不完整的数据先存起来,等待完整了,再合并起来。然后再往下一级channel handler处理器上传。
作者回复: 先是一次性收到了ABC\tBCD\tADC\t,然后传给DelimiterBasedFrameDecoder,就会解出三个对象,然后传递给下一级处理器了。所以所以对于下一级来说,它不需要再拆分了。
作者回复: netty解码上,会捕获throwable错误,然后转成exceptionCauget方法调用让你去处理,所以上层怎么处理完全你自己决定了:比如直接把连接断了,让它去重连。另外,设置编解码有个最大长度控制参数,控制了,没那么容易挂
作者回复: 1 一个是编码,一个是解码,相当于一个发一个收,编解码的区别主要看输入和输出是什么 2 也可以理解成线程池,他的本质是多个event loop,而一个evnt loop里面只有一个线程,来做绑定到这个event loop里面的多路复用器上发生的事,你看到的每个阶段不是重新注册,是判断每个处理器有没有指定自己的执行器,没有就用最开始选择的那个。如果有,就执行线程切换
作者回复: 1 空间固定的场景应该极少吧,否则都不需要补0了; 2 加分隔符而言,如果内容都不需要转义,那不管长度是否符合要求确实一点不浪费空间,但是你说的也是对的,就是有转义的话,是有一点点浪费的,但是换个角度想,如果有那么多都需要转义,说明你的分隔符有点普通了。 3 比如你的内容是100字节的,所以定义了一个长度字段(比如2个字节),存上数字100,那这样的话,读取的时候,每次都是读那个长度字节(固定2个字节)看看后面的内容长度是多少,比如100,那接下来你就知道要去读100字节了,而不是101什么的。
作者回复: java网络编程,tcp ip协议,主要就这些领域知识
作者回复: 一般都不会收到了,就算收到也没有用,组装不回原来的完整的消息(重启了,所以之前存在内存的半包数据丢了),这种情况,都是需要依赖客户端重试那完成失败的请求。
作者回复: 补充:http协议里面的content length字段又融合了解length的方式。
作者回复: 简单说,就是一个长度字段,然后后面跟着内容,那个长度字段是固定的,比如2个字节,存的就是后面跟着内容的长度,所以读取这个数据的时候,先读固定的那2个字节,拿到长度信息,然后就根据这个长度字节读取后面那么长的数据就行了。