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 -- 启动时如何注册,io读写

NioEventLoop提供注册入口(将channel注册到多路复用选择器中) 1.这个channel被注册过,就抛出异常 2.如何注册的以后再说...

两种 NIO 实现:Selector 与 Epoll

【总结】两种 NIO 实现:Selector 与 Epoll 时间2012-11-17 08:38:42 开源中国新闻 原文  http://my.oschina.net/ielts0909/b...

Java NIO实例-ServerSocketChannel实现Socket传输

参考网上的资料: 服务端用java实现,客户端用android实现 功能:实现了手机端发送消息到服务端,服务端成功接收 服务端 package cn; import java.io.IOExce...
  • foart
  • foart
  • 2015年08月13日 16:45
  • 30989

使用spring容器管理和配置netty

使用spring容器管理和配置netty 为了使程序达到方便配置和管理,spring的ioc容器是特效药之一。本文将使用ioc来管理和配置netty服务器服务端使用Reactor多线程模型,详见 ...

java netty之ChannelInitializer

这篇文章来分析一个比较简单的handler--ChannelInitializer,这个在我们创建serverbootstrap的时候会经常用到,它用于对刚刚接收的channel进行初始化。。。Ser...

netty之事件驱动原理

Netty使用了异步的事件驱动模型,来触发网络I/O的各种操作,其在socket层上面封装一层异步事件驱动模型,使得业务代码不需要关心网络底层,就可以编写异步的无网络I/O阻塞的代码。 ...

netty5笔记-总体流程分析4-NioSocketChannel之服务端视角

NioSocketChannel之服务端视角 上篇文章对NioServerSocketChannel进行了分析,了解了一个客户端连接在netty中是如何接收的。本篇我们将详细的了解服务端收到的连接的...

netty5.0之server端NioServerSocketChannel的bind分析

上一篇我们说到dobind作为一个task加入taskQueue等待SingleThreadventExecutor执行,那么它是如何触发的呢?bind准备工作对channelpipeline和cha...

windows IOCP完成端口原理详解

开篇之前先放上本次讲的IOCP project github地址:https://github.com/GTHubT/GTSever.git 。这个project中包含了IOCP和select,各自封...

IOCP 完成端口

什么是IOCP 实现方法 实现代码什么是IOCP先让我们看看对IOCP的评价I/O完成端口可能是Win32提供的最复杂的内核对象。[Advanced Windows 3rd] Jeffrey Rich...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:netty NioServerSocketChannel注册流程一
举报原因:
原因补充:

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