承接上文:https://blog.csdn.net/hxcaifly/article/details/85274664

前言

单纯地使用Java JDK来实现网络NIO是一件开发成本非常高的事情。然而,Netty 为它所有的传输实现提供了一个通用API,这使得这种转换比你直接使用JDK所能够达到的简单得多。所产生的代码不会被实现的细节所污染,而你也不需要在你的整个代码库上进行广泛的重构。简而言之,你可以将时间花在其他更有成效的事情上。

1. Netty实现OIO

Netty实现OIO代码:

package chx.net.demo;import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.oio.OioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.oio.OioServerSocketChannel;import java.net.InetSocketAddress;
import java.nio.charset.Charset;public class NettyOioServer {public void server(int port)throws Exception {final ByteBuf buf =Unpooled.unreleasableBuffer(Unpooled.copiedBuffer("Hi!\r\n", Charset.forName("UTF-8")));EventLoopGroup group = new OioEventLoopGroup();try {// 1.创建 ServerBootstrapServerBootstrap b = new ServerBootstrap();b.group(group)// 2.使用 OioEventLoopGroup以允许阻塞模式(旧的I/O).channel(OioServerSocketChannel.class).localAddress(new InetSocketAddress(port))// 3.指定 ChannelInitializer,对于每个已接受的连接都调用它.childHandler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch)throws Exception {ch.pipeline().addLast(// 4.添加一个 ChannelInboundHandlerAdapter以拦截和处理事件new ChannelInboundHandlerAdapter() {@Overridepublic void channelActive(ChannelHandlerContext ctx)throws Exception {ctx.writeAndFlush(buf.duplicate()).addListener(//5.将消息写到客户端,并添加 ChannelFutureListener,以便消息一被写完就关闭连接ChannelFutureListener.CLOSE);}});}});// 6.绑定服务器以接受连接ChannelFuture f = b.bind().sync();f.channel().closeFuture().sync();} finally {// 7.释放所有的资源group.shutdownGracefully().sync();}}
}

接下来,我们使用Netty 和非阻塞I/O 来实现同样的逻辑。

2. 非阻塞的Netty 版本

package chx.net.demo;import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;import java.net.InetSocketAddress;
import java.nio.charset.Charset;public class NettyNioServer {public void server(int port) throws Exception {final ByteBuf buf =Unpooled.unreleasableBuffer(Unpooled.copiedBuffer("Hi!\r\n",Charset.forName("UTF-8")));// 1.为非阻塞模式使用NioEventLoopGroupNioEventLoopGroup group = new NioEventLoopGroup();try {// 2.创建ServerBootstrapServerBootstrap b = new ServerBootstrap();b.group(group).channel(NioServerSocketChannel.class).localAddress(new InetSocketAddress(port))// 3.指定 ChannelInitializer,对于每个已接受的连接都调用它.childHandler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch)throws Exception {ch.pipeline().addLast(// 3.添加 ChannelInboundHandlerAdapter以接收和处理事件new ChannelInboundHandlerAdapter() {@Overridepublic void channelActive(// 4.将消息写到客户端,并添加ChannelFutureListener,// 5.以便消息一被写完就关闭连接ChannelHandlerContext ctx) throws Exception {ctx.writeAndFlush(buf.duplicate()).addListener(ChannelFutureListener.CLOSE);}});}});// 6.绑定服务器以接受连接ChannelFuture f = b.bind().sync();f.channel().closeFuture().sync();} finally {// 7.释放所有的资源group.shutdownGracefully().sync();}}
}

可以看出,Netty实现OIO和NIO的代码很类似,主要是EventLoopGroup不同。Netty自己内部做的逻辑封装减去了我们很大的开发成本。

【Java网络编程】:Netty实现OIO和NIO相关推荐

  1. NIO详解(一):java网络编程IO总结(BIO、NIO、AIO)

    1.基本概念 在Java网络通信中,最基本的概念就是Socket编程了.Socket又称"套接字" 向网络发出请求或者应答网络请求. Socket 和ServerSocket类库位 ...

  2. Java网络编程 — Netty入门

    认识Netty Netty简介 Netty is an asynchronous event-driven network application framework for rapid develo ...

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

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

  4. Java网络编程:socket与Netty

    Java网络编程:socket与Netty Java网络编程:socket与Netty TCP/IP介绍 简介 数据传输 TCP粘包和黏包 现象 为什么出现 如何解决 Socket介绍 介绍 功能开发 ...

  5. Java网络编程与NIO学习总结

    #Java网络编程与NIO学习总结 这篇总结主要是基于我之前Java网络编程与NIO系列文章而形成的的.主要是把重要的知识点用自己的话说了一遍,可能会有一些错误,还望见谅和指点.谢谢 #更多详细内容可 ...

  6. Java 网络编程系列之 NIO

    Java 网络编程系列之 NIO 第 1 章Java NIO 概述 1.1 IO 概述 IO 的操作方式 1.2 阻塞 IO (BIO) 1.3 非阻塞 IO(NIO) 1.4 异步非阻塞 IO(AI ...

  7. Java网络编程(6)NIO - Channel详解

    前言 NIO的三个核心组件:Buffer.Channel.Selector Java网络编程(4)NIO的理解与NIO的三个组件完成了大概的了解 Java网络编程(5)NIO - Buffer详解详细 ...

  8. Java网络编程和NIO详解开篇:Java网络编程基础

    老曹眼中的网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为我们拥有网络.网络是一个神奇的东西,它改变了你和我的 ...

  9. python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...

    Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...

最新文章

  1. java 程序架构知识
  2. Web 前端技术图谱-菜鸟教程
  3. java deque.pop_Java ArrayDeque pop()方法
  4. 智能小车二十《摄像头和路由器装上小车》
  5. 输入问题C++字符数组越界问题的一个案例分析
  6. 这些神经网络调参细节,你都了解了吗
  7. IPFS python api 示例
  8. 银行卡号与开户行对照文档
  9. Mac 使用U盘重装系统
  10. cortex-m3/m4栈回溯
  11. 六星经典CSAPP笔记(2)信息的操作和表示
  12. python3.5变化(String)
  13. 深入理解Camera基础知识点
  14. 安全多方计算-入门学习笔记(三)
  15. 使用NFC模拟校园卡门禁功能 【Mac, Windows, Android, 手环】
  16. [PHP]进阶教程:将wav文件转换成图像文件并在页面中显示
  17. QGIS 添加国内地图提供商(高德/百度/必应/腾讯)卫星及路网图
  18. 微博十年:坐看江湖,搅动风云
  19. Q1 不同企业的竞争优势(待完成)
  20. excel 两组数据交点_如何在百万级的数据里找到别人正在赚钱的项目?【实操长文】...

热门文章

  1. python实现最小二乘法
  2. macOS SwiftUI 进度指示器组件规范之 02 确定进度指标 Determinate Progress Indicators
  3. 在群晖上搭建基于 PostgreSQL 的 Joplin Server
  4. 大数据资源争夺战此起彼伏 对用户而言是福是祸?
  5. MODIS数据之HEG拼接重采样批处理(Python_MacOS)
  6. 一个简单的集合并级取反问题 !A or !B == !(A and B)
  7. 为什么我的燃尽图没更新?
  8. 壹度同城新零售系统v4.1.23 社交电商 同城商城
  9. IT行业为何如此吃香?2019学习IT就业前景分析
  10. html给页面整体添加左右边距_css div 网页的页面边距怎么控制