## 1 检测新连接 ![](https://img-blog.csdnimg.cn/img_convert/46697efa98936b080bcc501bfe543ac8.png) ![打断点](https://img-blog.csdnimg.cn/img_convert/230c5726ce68af5d0a639b7209c1eccd.png) telnet 此机地址,引起连接建立 ![执行到此,进入查看](https://img-blog.csdnimg.cn/img_convert/002ef797349dc5e34bbd19db30c6f9a3.png) ![](https://img-blog.csdnimg.cn/img_convert/b8150e9f7441d49617b42f563b6c483c.png) ![](https://img-blog.csdnimg.cn/img_convert/b6611aade7fc9ba7f5e78e4b2d914d81.png) ![以上即对应 read 方法](https://img-blog.csdnimg.cn/img_convert/3c45bdd820ef353e713addc976590bb0.png) ![](https://img-blog.csdnimg.cn/img_convert/6b66f1768be5fd6c2004d4c704156e0e.png) ![](https://img-blog.csdnimg.cn/img_convert/44a4202fcd0782bc76a6cfffc69292cc.png) ![](https://img-blog.csdnimg.cn/img_convert/93c6a9c976d26bfb5c24f75b98ad1a64.png) ![](https://img-blog.csdnimg.cn/img_convert/1ffcca95c36dec4bce1aee06074aeffb.png) 继续返回原先位置 ## 2 创建NioSocketChannel ![](https://img-blog.csdnimg.cn/14433cae59a54c5ebee99f1391d5803a.png) ![](https://img-blog.csdnimg.cn/img_convert/5a605e7680efa38e46b503e5b1c4a5df.png) ![](https://img-blog.csdnimg.cn/img_convert/4f1ab234d200a7728439715a7c79c881.png) ![](https://img-blog.csdnimg.cn/img_convert/1feddd209b67f82255efc02a001b2c1e.png) ![](https://img-blog.csdnimg.cn/img_convert/6ebd084078e4eb4212c7e5f393a9dce8.png) ![](https://img-blog.csdnimg.cn/img_convert/dbff4c9c61721898ffec0e8fbed51d91.png) ![](https://img-blog.csdnimg.cn/img_convert/dee9566c5478aed567b77ae59ed7745a.png) ![](https://img-blog.csdnimg.cn/img_convert/68f75f3459edb4f192dfa94a2237add8.png) 禁止小包组成大包再发送方法 ![](https://img-blog.csdnimg.cn/img_convert/55e116e8275976216d8b72ede3f9660d.png) ![](https://img-blog.csdnimg.cn/img_convert/9d4980f5dee0059911dd821fa6ba71ae.png) 静态变量: ![](https://img-blog.csdnimg.cn/img_convert/6d647ef4de4fd389751de87511221f15.png) ![](https://img-blog.csdnimg.cn/img_convert/6eb73e471dd1131e657495e44319f009.png) ![](https://img-blog.csdnimg.cn/img_convert/31d2e5995057a03117edbc4cf7849980.png) ![](https://img-blog.csdnimg.cn/img_convert/514d340395c4a81ce8df8adad6052a70.png) 由于 netty 常部署在服务端,所以默认启动TCP无延时 ![](https://img-blog.csdnimg.cn/img_convert/1f045c986c25e81729b036d354a09dcc.png) ![](https://img-blog.csdnimg.cn/img_convert/7105afc998fe380784b2e715270d05d6.png) ![](https://img-blog.csdnimg.cn/img_convert/be44383c1155ba590a5a5e00385263c1.png) ## 3 Channel的分类 - NioServerSocketChannel - NioSocketChannel - Unsafe ![](https://img-blog.csdnimg.cn/img_convert/2f520f44b64aa53a0b780c8a1db8a0f8.png) 顶层框架 Channel: ![](https://img-blog.csdnimg.cn/img_convert/700f0a7e6547bc8e90ddd24a3035eac9.png) 网络 Socket 读写绑定的一种抽象: ![](https://img-blog.csdnimg.cn/img_convert/5c3b905aa92e572c30b8ca2bb8983f00.png) ![作为骨架,保存了很多基础且重要的信息](https://img-blog.csdnimg.cn/img_convert/8aa44c928c48140c6a8d50728f3e9e5c.png) ![](https://img-blog.csdnimg.cn/img_convert/0ef7e856b65bbe032fc4df035bf0e5f9.png) ![](https://img-blog.csdnimg.cn/img_convert/ced4a59cfb6b2ecdaf108d6a1e63893b.png) 使用选择器监听 IO 事件的一个抽象类。保存了 JDK 底层的一个 Channel: ![开启非阻塞模式](https://img-blog.csdnimg.cn/img_convert/9e02223d4011415cc2227cf4d9a1e44d.png) ![](https://img-blog.csdnimg.cn/img_convert/6111ded1e7cdd0db7849791726471538.png) ![](https://img-blog.csdnimg.cn/img_convert/74e6e5aaf3b052efc0a3260173fc289d.png) ![](https://img-blog.csdnimg.cn/img_convert/fc481b0246bb9c4b9290789fa1603cba.png) ![回到了抽象类,即保存了一个ACCEPT 事件](https://img-blog.csdnimg.cn/img_convert/87c36d163acbd29ca77c5b5a004d6479.png) 看过服务 Channel 后,再看 ## 客户端 Channel ![](https://img-blog.csdnimg.cn/img_convert/72978bb979da0b02fc20e6a2056ab23c.png) ![](https://img-blog.csdnimg.cn/img_convert/f40399f08e7daecbd843e2f90852c9b5.png) ![](https://img-blog.csdnimg.cn/img_convert/8591303ac78446a0b02cee936f4bac0b.png) ![](https://img-blog.csdnimg.cn/img_convert/ba97157f387cbb1fcd0e6acdbf5afebb.png) ![](https://img-blog.csdnimg.cn/img_convert/d25ff0ee8e17386b977468fbef58b6a3.png) ## 客户端 V.S 服务端Channel ### unsafe 类不同 客户端 Chanel ![](https://img-blog.csdnimg.cn/img_convert/f62cc7b2f719fcf40e2fa259f8caf458.png) ![](https://img-blog.csdnimg.cn/img_convert/7150ff0fb370b96189a89235fc60acde.png) 服务端 Chanel: ![](https://img-blog.csdnimg.cn/img_convert/94d61caedaf9723930ab7d921d06871c.png) 用于某种 Chanel 的读写情况 ![主要负责读事件](https://img-blog.csdnimg.cn/img_convert/19c4ca7f0c21dc8d260f82e78ed621c6.png) ![读字节](https://img-blog.csdnimg.cn/img_convert/564bcf9eebb91811261e26f95ce0c0c6.png) 不同端配置项也不同 ![](https://img-blog.csdnimg.cn/img_convert/fca433ecffe126666c6c87d7c02e3163.png) ## 4 新连接NioEventLoop的分配和selector注册 ![](https://img-blog.csdnimg.cn/img_convert/8ebab8403185fbe8b01f42a2dffedf97.png) ![](https://img-blog.csdnimg.cn/img_convert/818c895c5c606843cdcd6168d0aec113.png) ![](https://img-blog.csdnimg.cn/img_convert/e9f1e4512009ebede62f13250354bbe5.png) ![](https://img-blog.csdnimg.cn/img_convert/70189901966585feca2d92cc2b4f6faf.png) 即为此处调用: ![](https://img-blog.csdnimg.cn/img_convert/c0cb0657f93387482759361b716adc5e.png) ![](https://img-blog.csdnimg.cn/img_convert/251ea3956d755133db160a192873fcf9.png) ![回调之后,最终都会删除自身](https://img-blog.csdnimg.cn/img_convert/3198582c46f03f39a4af2b5d938f873c.png) ![](https://img-blog.csdnimg.cn/img_convert/c2bb950d1c29bc947730884cdd36d587.png) ![](https://img-blog.csdnimg.cn/img_convert/d56b1db94b5c0d378f5ce4dfa54fa0db.png) ![](https://img-blog.csdnimg.cn/img_convert/9318efecc65e71afe8e1e5931a950a55.png) ![](https://img-blog.csdnimg.cn/img_convert/6ef55db083c314f9c85b0a85a96ba06c.png) ![](https://img-blog.csdnimg.cn/img_convert/bcc6359bc6324b076d1bbe549a362c50.png) ![](https://img-blog.csdnimg.cn/img_convert/6e9578f67aaff1e834390534b18090cd.png) ![](https://img-blog.csdnimg.cn/img_convert/60ce2a711341c7e3e3fcbb3bd31e3061.png) ![](https://img-blog.csdnimg.cn/img_convert/7af0a232305a350f425cb0df1ad38e41.png) ![](https://img-blog.csdnimg.cn/img_convert/785b365cde8ca39e50e594e9b58977fb.png) ![](https://img-blog.csdnimg.cn/img_convert/f27d42562be38b57cb31641eca5334a5.png) ![](https://img-blog.csdnimg.cn/img_convert/001c50c9048d9688136ae5bb77103252.png) 回去看看 register 方法 ![](https://img-blog.csdnimg.cn/img_convert/6399381947bd0ff4d94774e2cd6c9c34.png) ![](https://img-blog.csdnimg.cn/img_convert/e41ca6af55e24909535621c6e9fcdda0.png) ![](https://img-blog.csdnimg.cn/img_convert/42602be8e7d1c1b03211e27da772ee51.png) ![](https://img-blog.csdnimg.cn/img_convert/48713d00cdf9a9b4c5a5eafa14424ddb.png) ![](https://img-blog.csdnimg.cn/img_convert/0a9848ee4dd0be532e464aa820596184.png) ![](https://img-blog.csdnimg.cn/img_convert/64cbb4464925c4868b65fc7e80892601.png) ## 5 NioSocketChannel读事件的注册 ![](https://img-blog.csdnimg.cn/img_convert/1c5fee2b86dc179dabb1de9d5307c9ee.png) ![](https://img-blog.csdnimg.cn/img_convert/991d533bb800015825643d946fd488bf.png) ![](https://img-blog.csdnimg.cn/img_convert/30bc08e4ae21595acc8a702eff8cc379.png) ![](https://img-blog.csdnimg.cn/img_convert/1f3122f536922585a4b33bfa3350ed83.png) ![](https://img-blog.csdnimg.cn/img_convert/1f63a6a811789e9c57d2a97bc509de17.png) ![](https://img-blog.csdnimg.cn/img_convert/80819daef2637d9bdc47900e76ceb236.png) ![](https://img-blog.csdnimg.cn/img_convert/4f1a5180d92ede97b160a66316ad2866.png) ![](https://img-blog.csdnimg.cn/img_convert/ec820acb2e90e173006936a2c213a4ce.png) ![](https://img-blog.csdnimg.cn/img_convert/609c52d0c90e7a21eb1b3c8f6dd2ddb4.png) ![](https://img-blog.csdnimg.cn/img_convert/4ea921f43c5333df515587d27c78c1ea.png) ![](https://img-blog.csdnimg.cn/img_convert/657b2e48865b1668ce8d3b204cc7eb59.png) 可以开始接收数据了 ![](https://img-blog.csdnimg.cn/img_convert/ac5082fadbf77657ae537d75938f3cad.png) ![](https://img-blog.csdnimg.cn/img_convert/cb28668114189d6984d2f040dde3f27a.png) 回顾一下创建 ![](https://img-blog.csdnimg.cn/img_convert/e8891d05036c83dc2e79c179dc751595.png) ![](https://img-blog.csdnimg.cn/img_convert/dc6f73ae8d0ec36eae099c23e1854afa.png) ![](https://img-blog.csdnimg.cn/img_convert/273c4aa95cef7ef9eb19a4949e7c48f3.png) ## 6 新连接接入总结 ### Netty是在哪里检测有新连接接入的? - boss线程的第一个过程:轮询Accept事件 - boss线程第二个过程:通过JDK底层的channel的accept方法创建该连接。 ### 新连接是怎样注册到NioEventLoop线程的? 新连接NioEventLoop的分配和selector注册可以回答。boss线程调用chooser的next方法,拿到一个NioEventLoop,然后将这条连接注册到NioEventLoop的selector上面。