Java NIO框架Netty(一) – 原理和使用-Hello world
来源:互联网 发布:cpa软件是什么意思啊 编辑:程序博客网 时间:2024/06/08 13:58
1,Netty原理和使用
Netty是一个高性能 事件驱动的异步的非堵塞的IO(NIO)框架,用于建立TCP等底层的连接,基于Netty可以建立高性能的Http服务器。支持HTTP、 WebSocket 、Protobuf、 Binary TCP |和UDP,Netty已经被很多高性能项目作为其Socket底层基础,如HornetQ Infinispan Vert.x
Play Framework Finangle和 Cassandra。其竞争对手是:Apache MINA和 Grizzly。
传统堵塞的IO读取如下:
InputStream is = new FileInputStream(“input.bin”);
int byte = is.read(); // 当前线程等待结果到达直至错误
而使用NIO如下:
while (true) {
selector.select(); // 从多个通道请求事件
Iterator it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectorKey key = (SelectionKey) it.next();
handleKey(key);
it.remove();
}
}
堵塞与非堵塞原理
传统硬件的堵塞如下,从内存中读取数据,然后写到磁盘,而CPU一直等到磁盘写完成,磁盘的写操作是慢的,这段时间CPU被堵塞不能发挥效率。
使用非堵塞的DMA如下图:CPU只是发出写操作这样的指令,做一些初始化工作,DMA具体执行,从内存中读取数据,然后写到磁盘,当完成写后发出一个中断事件给CPU。这段时间CPU是空闲的,可以做别的事情。这个原理称为Zero.copy零拷贝。
Netty底层基于上述Java NIO的零拷贝原理实现:
2,Hello world
程序员们习惯的上手第一步,自然是”Hello world”,不过Netty官网的例子却偏偏抛弃了”Hello world”。那我们就自己写一个最简单的”Hello world”的例子,作为上手。
编写服务端代码
/** * Netty 服务端代码 * * @author lichch */ public class HelloServer { public static void main(String args[]) { // Server服务启动器 ServerBootstrap bootstrap = new ServerBootstrap( new NioServerSocketChannelFactory( Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); // 设置一个处理客户端消息和各种消息事件的类(Handler) bootstrap .setPipelineFactory(new ChannelPipelineFactory() { @Override public ChannelPipeline getPipeline() throws Exception { return Channels .pipeline(new HelloServerHandler()); } }); // 开放8000端口供客户端访问。 bootstrap.bind(new InetSocketAddress(8000)); } private static class HelloServerHandler extends SimpleChannelHandler { /** * 当有客户端绑定到服务端的时候触发,打印"Hello world, I'm server." * * @author lichch */ @Override public void channelConnected( ChannelHandlerContext ctx, ChannelStateEvent e) { System.out.println("Hello world, I'm server."); } } } **客户端代码**
/**
* Netty 客户端代码
*
* @author lichch
*/ public class HelloClient { public static void main(String args[]) { // Client服务启动器 ClientBootstrap bootstrap = new ClientBootstrap( new NioClientSocketChannelFactory( Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); // 设置一个处理服务端消息和各种消息事件的类(Handler) bootstrap.setPipelineFactory(new ChannelPipelineFactory() { @Override public ChannelPipeline getPipeline() throws Exception { return Channels.pipeline(new HelloClientHandler()); } }); // 连接到本地的8000端口的服务端 bootstrap.connect(new InetSocketAddress( "127.0.0.1", 8000)); } private static class HelloClientHandler extends SimpleChannelHandler { /** * 当绑定到服务端的时候触发,打印"Hello world, I'm client." * * @author lichch */ @Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) { System.out.println("Hello world, I'm client."); } } }
“`
小结
Netty中,需要区分Server和Client服务。所有的Client都是绑定在Server上的,他们之间是不能通过Netty直接通信的。(自己采用的其他手段,不包括在内。)。白话一下这个通信过程,Server端开放端口,供Client连接,Client发起请求,连接到Server指定的端口,完成绑定。随后便可自由通信。其实就是普通Socket连接通信的过程。
Netty框架是基于事件机制的,简单说,就是发生什么事,就找相关处理方法。就跟着火了找119,抢劫了找110一个道理。所以,这里,我们处理的是当客户端和服务端完成连接以后的这个事件。什么时候完成的连接,Netty知道,他告诉我了,我就负责处理。这就是框架的作用。Netty,提供的事件还有很多,以后会慢慢的接触和介绍。
- Java NIO框架Netty(一) – 原理和使用-Hello world
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- Java NIO框架Netty教程(一) – Hello Netty
- 关于代码编写的习惯
- scull字符设备源代码完全解析
- Java简单猜数字代码
- Ceph基于不同性能磁盘创建Pool
- mongodb入门增删改查建立索引
- Java NIO框架Netty(一) – 原理和使用-Hello world
- FIDO UAF 结构概述 v1.1
- MySQL使用SQL语句从数据库表中随机获取数据
- opencv源码解析之(6):hog源码分析
- Mac 的 入门
- 驱动模块Makefile解析
- JN项目-封面管理增加下拉场馆选项
- 图像处理(四):边缘检测(一):
- Unity打安卓包常见错误