學習書籍:Netty權威指南

多種IO方式的比較:

1、BIO(同步阻塞IO)

使用ServerSocket綁定IP地址和監聽端口,客戶端發起連接,通過三次握手建立連接,用socket來進行通信,通過輸入輸出流的方式來進行同步阻塞的通信

每次客戶端發起連接請求,都會啟動一個線程

線程數量:客戶端並發訪問數為1:1,由於線程是JAVA虛擬機中非常寶貴的資源,一旦線程數急劇增加,系統性能會急劇下降,導致線程棧溢出,創建新的線程失敗,並最終導致宕機

所以在JDK1.4之前,人們想到了一種方法,即PIO方式

2、PIO(偽異步阻塞IO)

使用線程池來處理客戶端的請求

客戶端個數:線程池最大線程數=M:N,其中M遠大於N

在read和write的時候,還是IO阻塞的,只是把每個線程交由線程池來控制管理

3、NIO(異步阻塞IO)

用NIO方式處理IO

使用多路復用器Selector來輪詢每個通道Channel,當通道中有事件時就通知處理,不會阻塞

使用相當復雜

4、AIO(真正的異步非阻塞IO)

NIO2.0引入了新的異步通道的概念,不需要使用多路復用器(Selector)對注冊通道進行輪詢即可實現異步讀寫,從而簡化了NIO編程模型

使用Netty框架進行編程步驟

1、構建事件處理池

2、使用引導程序關聯事件處理池、通道、事件處理器

3、綁定端口服務

4、等待操作完成

5、關閉事件處理池

幾種IO的功能和特性對比

按照書上的例子碼了一遍:

服務端:

import io.netty.bootstrap.ServerBootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.ChannelOption;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioServerSocketChannel;

public class NettyServer {

public void bind(int port) throws Exception {

EventLoopGroup bossGroup = new NioEventLoopGroup();

EventLoopGroup workGroup = new NioEventLoopGroup();

try {

ServerBootstrap b = new ServerBootstrap();

b.group(bossGroup, workGroup).channel(NioServerSocketChannel.class)

.option(ChannelOption.SO_BACKLOG, 1024)

.childHandler(new ChildChannelHandler());

// 綁定端口,同步等待成功

ChannelFuture f = b.bind(port).sync();

// 等待服務端監聽端口關閉

f.channel().closeFuture().sync();

} catch (Exception e) {

// TODO: handle exception

} finally {

// 優雅退出,釋放線程池資源

bossGroup.shutdownGracefully();

workGroup.shutdownGracefully();

}

}

private class ChildChannelHandler extends ChannelInitializer {

@Override

protected void initChannel(SocketChannel ch) throws Exception {

ch.pipeline().addLast(new NettyServerHandle());

}

}

public static void main(String[] args) throws Exception {

int port = 8080;

if (args != null && args.length > 0) {

try {

port = Integer.valueOf(args[0]);

} catch (Exception e) {

e.printStackTrace();

}

}

new NettyServer().bind(port);

}

}

服務端處理器:

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelHandlerAdapter;

import io.netty.channel.ChannelHandlerContext;

public class NettyServerHandle extends ChannelHandlerAdapter {

public void channelRead(ChannelHandlerContext ctx, Object msg)

throws Exception {

ByteBuf buf = (ByteBuf) msg;

byte[] req = new byte[buf.readableBytes()];

buf.readBytes(req);

String body = new String(req, "UTF-8");

System.out.println("The time server receive order:" + body);

String currentTime = "QUERY TIME ORDER".equalsIgnoreCase(body) ? new java.util.Date(

System.currentTimeMillis()).toString() : "BAD ORDER";

ByteBuf resp = Unpooled.copiedBuffer(currentTime.getBytes());

ctx.write(resp);

}

public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

ctx.flush();

}

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {

ctx.close();

}

}

客戶端:

import io.netty.bootstrap.Bootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.ChannelOption;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioSocketChannel;

public class NettyClient {

public void connect(int port, String host) throws Exception {

// 1、創建線程池

EventLoopGroup group = new NioEventLoopGroup();

try {

// 2、使用引導器關聯線程池、通道、通達處理器、設置執行參數

Bootstrap b = new Bootstrap();

b.group(group).channel(NioSocketChannel.class)

.option(ChannelOption.TCP_NODELAY, true)

.handler(new ChannelInitializer() {

@Override

protected void initChannel(SocketChannel ch)

throws Exception {

ch.pipeline().addLast(new NettyClientHandle());

}

});

// 發起異步連接操作 3、綁定端口同步操作

ChannelFuture f = b.connect(host, port).sync();

// 4、監聽端口關閉

f.channel().closeFuture().sync();

} catch (Exception e) {

// TODO: handle exception

} finally {

// 優雅退出,釋放NIO線程組 5、釋放資源

group.shutdownGracefully();

}

}

public static void main(String[] args) throws Exception {

int port = 8080;

if (args != null && args.length > 0) {

try {

port = Integer.valueOf(args[0]);

} catch (Exception e) {

e.printStackTrace();

}

}

new NettyClient().connect(port, "127.0.0.1");

}

}

客戶端處理器:

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelHandlerAdapter;

import io.netty.channel.ChannelHandlerContext;

import java.util.logging.Logger;

public class NettyClientHandle extends ChannelHandlerAdapter {

private static final Logger logger = Logger

.getLogger(NettyClientHandle.class.getName());

private final ByteBuf firstMessage;

public NettyClientHandle() {

byte[] req = "QUERY TIME ORDER".getBytes();

firstMessage = Unpooled.buffer(req.length);

firstMessage.writeBytes(req);

}

public void channelActive(ChannelHandlerContext ctx) {

ctx.writeAndFlush(firstMessage);

}

public void channelRead(ChannelHandlerContext ctx, Object msg)

throws Exception {

ByteBuf buf = (ByteBuf) msg;

byte[] req = new byte[buf.readableBytes()];

buf.readBytes(req);

String body = new String(req, "UTF-8");

System.out.println("Now is:" + body);

}

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {

// 釋放資源

logger.warning("Unexpected exception from downstream:"

+ cause.getMessage());

ctx.close();

}

}

java io nio pio_Netty之BIO(同步阻塞IO)、PIO(偽異步阻塞IO)、NIO(異步非阻塞IO)、AIO(異步非阻塞IO)、Netty...相关推荐

  1. 面试必会系列 - 5.1 网络BIO、NIO、epoll,同步/异步模型、阻塞/非阻塞模型,你能分清吗?

    本文已收录至 Github(MD-Notes),若博客中图片模糊或打不开,可以来我的 Github 仓库,包含了完整图文:https://github.com/HanquanHq/MD-Notes,涵 ...

  2. java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之OS_Part_2整起~IO们那些事【包括五种IO模型:(BIO、NIO、IO多路复用、信号驱动、AIO);零拷贝、事件处理及并发等模型】

    PART0.前情提要: 通常用户进程的一个完整的IO分为两个阶段(IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者!):[操作系统和驱动程序运行在内核空间,应用程序运行在用户空间, ...

  3. Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式

    本文介绍了Java中的四种I/O模型,同步阻塞,同步非阻塞,多路复用,异步阻塞.同时将NIO和BIO进行了对比,并详细分析了基于NIO的Reactor模式,包括经典单线程模型以及多线程模式和多Reac ...

  4. 以Java的视角来聊聊BIO、NIO与AIO的区别

    说一说I/O 首先来说一下什么是I/O? 在计算机系统中I/O就是输入(Input)和输出(Output)的意思,针对不同的操作对象,可以划分为磁盘I/O模型,网络I/O模型,内存映射I/O, Dir ...

  5. 网络IO发展历程:BIO、NIO、多路复用器、epoll

    网络侧IO,通过网络来通信(偏向内核方面) C10K问题:http://www.kegel.com/c10k.html#frameworks BIO NIO 多路复用器 什么是NIO 操作系统角度:N ...

  6. Java面试常考的 BIO,NIO,AIO 总结

    文章转载自:JavaGuide 目录: 1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 1.4 总结 2. NIO (New I/O) 2.1 ...

  7. 结合代码详细聊聊 Java 网络编程中的 BIO、NIO 和 AIO

    本文从操作系统的角度来解释BIO,NIO,AIO的概念,含义和背后的那些事.本文主要分为3篇. 第一篇 讲解BIO和NIO以及IO多路复用 第二篇 讲解磁盘IO和AIO 第三篇 讲解在这些机制上的一些 ...

  8. Java并发编程:线程的同步

    <?xml version="1.0" encoding="utf-8"?> Java并发编程:线程的同步 Java并发编程:线程的同步 Table ...

  9. [转]关于java中的 sychronized 同步方法 与 同步块的理解

    首先,需要说明一点,也是最重要的一点,无论是同步方法 还是 同步块 都是只针对同一个对象的多线程而言的,只有同一个对象产生的多线程,才会考虑到 同步方法 或者是 同步块,如果定义多个实例的同步,可以考 ...

最新文章

  1. 自然语言处理工具类数地工厂
  2. 数据分析师+做过名企项目+懂运营+985毕业=跳槽失败?
  3. 找不到天隆虚拟机_玩转虚拟机,教你如何装系统
  4. 西欧八国调查:25%受访者宁要AI政府也不要民选政治家
  5. 作者:高丰,英国南安普敦大学计算机博士,现为开放数据与创新独立咨询顾问,兼复旦大学数字与移动治理实验室特邀研究员。...
  6. MATLAB中移动平均滤波器smooth函数的用法
  7. python学了有什么用-python学来有什么用
  8. MySQL 5.7安装(多实例)最佳实践
  9. codevs1958 刺激
  10. CSDN创始人董事长蒋涛对话阿里云张献涛:距离云计算终极目标还有多远?
  11. unix下的softlink和hardlink
  12. 稠密检索模型的zero-shot能力究竟如何?
  13. 解决网页中一直点击出现蓝色背景问题
  14. 无线/移动通信网络基本概念整理
  15. 南非NRCS认证简介
  16. 小米计算机无法清除,小米蓝牙怎么删除不常用设备
  17. 中国大学MOOC数据库系统概论中国人民大学实验三 触发器
  18. 毕设 深度学习图像风格迁移
  19. python常遇错误-IndexError: list index out of range
  20. PHP基础学习(1)

热门文章

  1. Ubuntu 16.04服务器 配置
  2. RequestsLibrary库入门介绍
  3. 禁止微信浏览器的下拉滑动
  4. C#笔记17 DataTime类型、断言、internal关键字、GUID、Excel操作、正则表达式、访问剪贴板、设计模式、版本控制
  5. 学会asp后再学php,九天学会ASP 之 第二天
  6. OpenCV读取视频并获得相关属性信息
  7. verilog实现多周期处理器之——(六)简单算数操作指令的实现
  8. 修复android下webView控件的总结
  9. 如何安装vscode网页版_如何让用编辑器编写EverNote?
  10. 想“跟”在后面?不是那么简单的事情