Netty新连接接入

问题

1.Netty是在哪里检测有新连接接入的?

答:boss线程的第一个过程轮训处Accept事件,然后boss线程第二个过程通过jdk底层的channel的accept方法创建该连接。

2.新连接是怎样注册到NioEventLoop线程的?

答:新连接NioEventLoop的分配和selector注册可以回答。boss线程调用chooser的next方法,拿到一个NioEventLoop,然后将这条连接注册到NioEventLoop的selector上面。

Netty新连接接入处理逻辑

(1)检测新连接:新连接通过服务端Channel绑定的Selector轮询出Accept事件

(2)创建NioSocketChannel:基于jdkNio的channle创建出一个netty的NioSocketChannel,也就是客户端Channel

(3)分配线程及注册selector:netty给客户端Channel分配一个NioEventLoop,并且把这条Channel注册到该NioEventLoop对应的selector上,至此这条Channel后续的读写都由此NioEventLoop进行管理

(4)向selector注册读事件:注册的过程和服务端启动注册事件复用同一段逻辑。

(1)检测新连接

processSelectedKey(key,channel)[入口]:添加断点

  NioMessageUnsafe.read()

    doReadMessages()[while循环]

      javaChannel().accept()

  • 运行Server.java的main函数,启动服务端
  • 在terminal中输入 telnet 127.0.0.1 8888(如果出现telnet不是内部或外部命令...则在控制面板-程序-启用或关闭Windows功能,勾选Telnet客户端)
  • 一步一步断点调试

(2)创建NioSocketChannel

new NioSocketChannel(parent,ch)[入口]

  AbstractNioByteChannel(p,ch,op-read)

    configureBlocking(false)&save op

    create id,unsafe,pipeline

  new NioSocketChannelConfig()

    setTcpNoDelay(true)禁止Nagle算法,小的数据包会发出去,降低延迟

(3)分配线程及注册selector

服务端Channel的pipeline构成

Head—>ServerBootstrapAcceptor—>Tail

其中ServerBootstrapAcceptor做以下事情:

  • 添加childHandler
  • 设置options和attrs
  • 选择NioEventLoop并注册selector

(4)向selector注册读事件

Netty中Channel的分类

  • NioServerSocketChannel:服务端Channel
  • NioSocketChannel:客户端Channel
  • Unsafe

服务端Channel和客户端Channel的不同点:

(a)   客户端Channel(AbstractNioByteChannel)向AbstractNioChannel注册一个读事件

  服务端Channel(AbstractNioMessageChannel)向AbstractNioChannel注册一个accept事件

  服务端Channel和客户端Channel共同的部分都由AbstractNioChannel实现

(b)   这两种Channel底层对应的Unsafe不同

  客户端Channel对应NioByteUnsafe:读取IO数据

  服务端Channel对应NioMessageUnsafe:读一条连接

原文地址:https://www.cnblogs.com/chanaichao/p/9351488.html

时间: 2024-11-29 12:43:13

Netty新连接接入的相关文章

Netty源码 新连接处理

上文我们阐述了Netty的Reactor模型.在Reactor模型的第二阶段,Netty会处理各种io事件.对于客户端的各种请求就是在这个阶段去处理的.本文便来分析一个新的连接是如何被处理的. 代码的入口就从read方法开始.这里的unsafe的类型是NioMessageUnsafe,在服务端启动时就确定下来了. if ((readyOps & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0 || readyOps == 0) { un

Netty源码分析之处理新连接

Netty服务端处理新连接的流程: 1.检测新连接 2.基于NioServerSocketChannel创建客户端的NioSocketChannel 3.分配客户端channel的线程,注册线程所对应的selector 4.向selector注册读事件 新连接检测 服务端在创建完服务端的NioServerSocketChannel之后,绑定完端口号之后,会注册accept事件.当有新连接进入的时候,会触发accpet事件.之前博客有分析过EventLoop的thread的run方法会循环sele

教你正确地利用Netty建立连接池

一.问题描述 Netty是最近非常流行的高性能异步通讯框架,相对于Java原生的NIO接口,Netty封装后的异步通讯机制要简单很多. 但是小K最近发现并不是所有开发人员在使用的过程中都了解其内部实现机制,而是照着葫芦画瓢. 网上简单搜索下,在客户端使用Netty建立连接池的文章也是比较少.今天小K给大家简单介绍下使用Netty建立连接池的方法. 首先我们来看下Netty官方给出的客户端sample实例: //创建一个EventLoopGroup,可以简单认为是Netty框架下的线程池,默认最大

打开新连接的方式

打开新连接的方式有四种: 1.在当前页打开,可前进后退: HTML:<a href="http://www.baidu.com">在当前窗口打开,可后退</a> js:  window.open("href","target"); 一:Javascript中创建一个函数 function openUrl(){ //在当前浏览器中打开target=_self      window.open("www.baidu.

oracle 10G 表空间移动 , TNS 监听程序所有适用例程都无法建立新连接,service_died 12537, c3p0连接池参数

一次边学边干的oralce运维经历, 步步是坑啊 前几天经历了删除垃圾数据表.清理回滚表空间这些东西之后,又rebuild了索引, 感觉oracle的性能真是杠杠的. 系统又开始急速运行了. 客户经历了这事之后, 主动提出了把数据库切换到存储上面, 分配了200G. 开始干活啊, 1.先停止oracle 2.把你要移动的表空间文件复制到目的地例如:从d盘复制到E盘 3.登陆oracle sqlplus / as sysdba 4.然后执行 startup mount alter database

【Nginx】如何建立新连接

处理新连接事件的回调函数是ngx_event_accept,原型如下: void ngx_event_accept(ngx_event_t *ev) 具体流程如下: 1)首先调用accept方法试图建立新连接,如果没有准备好的新连接事件,ngx_event_accept方法会直接返回 2)设置负载均衡阀值ngx_accept_disabled,这个阀值是进程允许的总连接数的1/8减去空闲连接数 3)调用ngx_get_connection方法由连接池中获取一个ngx_connection_t连接

Netty 长连接服务

转自:https://www.dozer.cc/2014/12/netty-long-connection.html 推送服务 还记得一年半前,做的一个项目需要用到 Android 推送服务.和 iOS 不同,Android 生态中没有统一的推送服务.Google 虽然有 Google Cloud Messaging ,但是连国外都没统一,更别说国内了,直接被墙. 所以之前在 Android 上做推送大部分只能靠轮询.而我们之前在技术调研的时候,搜到了 jPush 的博客,上面介绍了一些他们的技

170122、Netty 长连接服务

推送服务 还记得一年半前,做的一个项目需要用到 Android 推送服务.和 iOS 不同,Android 生态中没有统一的推送服务.Google 虽然有 Google Cloud Messaging ,但是连国外都没统一,更别说国内了,直接被墙. 所以之前在 Android 上做推送大部分只能靠轮询.而我们之前在技术调研的时候,搜到了 jPush 的博客,上面介绍了一些他们的技术特点,他们主要做的其实就是移动网络下的长连接服务.单机 50W-100W 的连接的确是吓我一跳!后来我们也采用了他们

MySQL线程用完,新连接无法连接的问题笔记!

问题: MySQL服务器所支持的最大连接数是有上限的,每个连接都会占用一定的内存资源,因此当客户端访问MySQL服务器处理完相应的操作后,就应该断开连接释放内存资源. 如果服务器有大量的闲置连接,这样就会白白的浪费内存,且如果一直在累加而不断开的话,就会达到连接上限,报"too many connections"的错误.可通过命令"show process list"查看,若发现后台有大量的sleep线程,此时就需要调整上述参数了. 一些参数解释: show var