netty NioServerSocketChannel注册流程一

原创 2016年08月28日 16:03:07

  netty server端启动一般用以下代码:

	ServerBootstrap bootstrap = new ServerBootstrap();
		NioEventLoopGroup boss = new NioEventLoopGroup(1);
		NioEventLoopGroup work = new NioEventLoopGroup(2 * Runtime.getRuntime().availableProcessors());
		bootstrap.group(boss, work);
		bootstrap.channel(NioServerSocketChannel.class);
		bootstrap.localAddress("localhost", 8081);
		bootstrap.childHandler(new ChannelInitializer<Channel>() {
			@Override
			protected void initChannel(Channel ch) throws Exception {
				ch.pipeline().addLast(new DelimiterBasedFrameDecoder(1024, Delimiters.lineDelimiter()));
				ch.pipeline().addLast(new StringDecoder(StandardCharsets.UTF_8));
				ch.pipeline().addLast(new EchoHandlerTest());
			}
		});

		try {
			// 开始绑定server,阻塞直到绑定成功
			ChannelFuture channelFuture = bootstrap.bind().sync();
			
			System.out.println(">server started");
			
			//阻塞直到关闭成功
			channelFuture.channel().closeFuture().sync();
			
			System.out.println(">server close");
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			// 关闭资源,boss线程组及work线程组
			boss.shutdownGracefully();
			work.shutdownGracefully();
		}


    而核心流程是bootstrap.bind() 绑定流程。简单来讲,主要是:

    1.创建NioServerSocketChannel

    2.向操作系统申请socket文件句柄

    3.初始化NioServerSocketChannel的pipeLine及相应属性

    4.分配个boss线程,并启动它,由它来完成以下事情

    5.将该channel注册到selector上。底层看是epoll还是其它reactor技术实现。做的事情就是将该channel对应socket文件句柄关心的事件注册到操作系统。这里为0,先不注册感兴趣事件。

   6.调用socket bind方法,让操作系统开启一条tcp连接。

   7.如果autoRead属性为true(默认为true)则马上将accept事件注册到selector上。

   执行完这些步骤后,boss线程就不断轮循,看是否有感兴趣事件发生,这里为连接事件。

   流程图如下:

  


  

    

Netty系列之Netty 服务端创建

背景 1.1. 原生NIO类库的复杂性在开始本文之前,我先讲一件自己亲身经历的事:大约在2011年的时候,周边的两个业务团队同时进行新版本开发,他们都需要基于NIO非阻塞特性构建高性能、异步和高可靠性...
  • limuzi13
  • limuzi13
  • 2016年05月21日 20:02
  • 1254

Netty -- 启动时如何注册,io读写

NioEventLoop提供注册入口(将channel注册到多路复用选择器中) 1.这个channel被注册过,就抛出异常 2.如何注册的以后再说...
  • liyue1090041509
  • liyue1090041509
  • 2017年02月28日 20:11
  • 202

Netty In Action中文版 - 第十六章:从EventLoop取消注册和重新注册

本章介绍
  • abc_key
  • abc_key
  • 2014年08月11日 14:25
  • 3406

Netty4学习笔记(8)-- Channel接口

转自:http://blog.csdn.net/zxhoo/article/details/17920907 Channel接口 Channel是Netty4最核心的接口之一,拥有将近...
  • xiaoxufox
  • xiaoxufox
  • 2016年01月04日 11:14
  • 1917

netty5笔记-总体流程分析3-NioServerSocketChannel

前面我们讲了server的启动过程,同时介绍了其中非常重要的几个概念,ChannelPipeline,ChannelHandlerContext等。接下来我们看看server启动起来以后是如何运转的。...
  • youaremoon
  • youaremoon
  • 2016年01月09日 15:23
  • 1777

Netty学习:搭建一个简单的Netty服务(JAVA NIO 类库的异步通信框架)

http://wosyingjun.iteye.com/blog/2303296 Netty学习:搭建一个简单的Netty服务 Netty 是一个基于 JAVA NIO 类库的异步通信框架...
  • zzy7075
  • zzy7075
  • 2016年08月02日 16:54
  • 14543

两种 NIO 实现:Selector 与 Epoll

【总结】两种 NIO 实现:Selector 与 Epoll 时间2012-11-17 08:38:42 开源中国新闻 原文  http://my.oschina.net/ielts0909/b...
  • xyls12345
  • xyls12345
  • 2014年05月22日 12:28
  • 4799

【Netty4 简单项目实践】七、上线前准备--内存泄漏监控、系统监控

一、内存泄漏 Netty4的内存泄漏监控默认是没有的,需要手动设置。 它的内存泄漏只是针对Bytebuf,这也暗示着使用Bytebuf能提高系统性能降低GC的影响。 配置很简单,就是设置运行变量...
  • arctan90
  • arctan90
  • 2016年05月24日 14:04
  • 2421

nio client和netty server实例

花了一周时间,研究了java里面的nio和netty,其实nio很好理解,用过c语言的,都应该知道select和epoll,nio和select和epoll非常类似,使用方法和解决的问题也都是一样的。...
  • beginning1126
  • beginning1126
  • 2015年05月09日 16:01
  • 9309

《Java 源码分析》:Java NIO 之 ServerSocketChannel

《Java 源码分析》:Java NIO 之 ServerSocketChannel在上两篇博文中,主要从源码的角度粗略的介绍了Selector.open()和selector.select()方法...
  • u010412719
  • u010412719
  • 2016年10月19日 20:46
  • 1519
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:netty NioServerSocketChannel注册流程一
举报原因:
原因补充:

(最多只允许输入30个字)