Netty4自学笔记 (2) - Java NIO

Netty 权威指南笔记(二):Java NIO 和 Netty 对比 Netty 是业界流行的 NIO 框架之一,它的健壮性、功能、性能、可定制性和可扩展性在同类框架中都说首屈一指的,也已经得到了成百上千商用项目的验证。Netty 框架都有什么优点呢? 1. API 使用简单,开发门槛低。 2. 功能强大,预置多种编解码功能,支持多种主流协议。 3. 定制能力强,可以通过 ChannelHandler 对通信框架灵活扩展。 4. 性能高。 5. 成熟稳定,社区活跃,已经修复了 Jav 阅读详情

全文详见个人独立博客:Netty4自学笔记 (2) - Java NIO

Netty4自学笔记 (2) - Java NIO距离上一篇博文已经过去了半个多月。这期间有一周多的时间用在了准备单位举办的英语竞赛上。余下的时间沉迷于陪孩子玩耍和睡觉,日复一日。 当然,我也抽空学习了Java NIO(None-Blocking / New IO) 一些知识,现总结如下。 Java的非阻塞IO的原理是采用了操作系统的多路复用器机制,即在一个通道(channel)上,注册一个事件选择器(selector)及各种事件(读、写等),当有事件到达时,事件选择器返归对应的事件,然后可对事件进行处理,这样即可实现在单一线程上对来自不同客户的请求进行交替处理,服务端处理返回后即可处理下一事件,而不会受制于客户端的响应速度,提高了并发访问的效率。 Java NIO的样例代码如下: 服务端 package com.coderli.nettylab.nio; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.Iterator; /** * @author lihongzhe 2018/7/11 10:59 */ public class NioServer { public static void main(String[] args) { try { ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.bind(new InetSocketAddress("127.0.0.1", 7090)); serverSocketChannel.configureBlocking(false); Selector selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); for (; ; ) { selector.select(); Iterator<SelectionKey> keysItor = selector.selectedKeys().iterator(); while (keysItor.hasNext()) { SelectionKey selectionKey = keysItor.next(); keysItor.remove(); if (selectionKey.isAcceptable()) { ServerSocketChannel ssChannel = (ServerSocketChannel) selectionKey.channel(); SocketChannel socketChannel = ssChannel.accept(); socketChannel.configureBlocking(false); ByteBuffer buffer = ByteBuffer.allocate(17); socketChannel.read(buffer); System.out.println("Receive msg from client:" + new String(buffer.array())); socketChannel.write(ByteBuffer.wrap(new String("Server: op_accept").getBytes())); } } } } catch (IOException e) { e.printStackTrace(); } } } 客户端 package com.coderli.nettylab.nio; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.util.Iterator; /** * @author lihongzhe 2018/7/12 15:54 */ public class NioClient { public static void main(String[] args) { try { SocketChannel socketChannel = SocketChannel.open(); socketChannel.configureBlocking(false); socketChannel.connect(new InetSocketAddress("127.0.0.1", 7090)); Selector selector = Selector.open(); socketChannel.register(selector, SelectionKey.OP_CONNECT); selector.select(); Iterator<SelectionKey> itor = selector.selectedKeys().iterator(); while (itor.hasNext()) { SelectionKey key = itor.next(); if (key.isConnectable()) { System.out.println("Connectable..."); while (socketChannel.isConnectionPending()) { socketChannel.finishConnect(); socketChannel.register(selector, SelectionKey.OP_READ); } SocketChannel channel = (SocketChannel) key.channel(); channel.write(ByteBuffer.wrap("I am client".getBytes())); } } for (; ; ) { selector.select(); Iterator<SelectionKey> keyIterator = selector.selectedKeys().iterator(); while (keyIterator.hasNext()) { SelectionKey key = keyIterator.next(); if (key.isConnectable()) { System.out.println("Connectable..."); } if (key.isReadable()) { SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(17); channel.read(buffer); System.out.println("Receive msg from server:" + new String(buffer.array())); keyIterator.remove(); } } } } catch (IOException e) { e.printStackTrace(); } } } 上述代码谈不上合理与严谨,仅是我实验中的代码,但可表述出Java NIO中的channel、select、selectionKey(事件)等基本要素,仅供参考。 对代码做一简单说明: 服务端将监听端口绑定在7090上,并在通道上注册了OP_ACCEPT事件; 客户端通过connect方法连接到服务端的该端口上,同时服务端监听到该事件,selector.select方法返回; 客户端首先监听了OP_CONNECT事件,在开始与服务端建立连接后,客户端获取到该事件并处理该事件,由于是非阻塞异步连接,因此需要通过socketChannel.isConnectionPending()来判断是否连接完成,并手动通过socketChannel.finishConnect();方法完成连接,然后注册OP_READ事件,用于监听服务端传输的信息; 客户端和服务端之间通过ByteBuffer作为载体传输数据; 客户端监听的OP_READ事件后,当服务端向channel写入数据后,客户端select到该事件,并读取信息。 对比BIO(OIO)来看,如要实现并发,BIO模式下的每一个客户端请求需要用一个线程与之对应,显然无法实现大规模并发;而NIO模式下,因为是事件驱动,一个selector可以处理所有客户端的事件,只有当有事件到达时才会返回处理,只需要启动一定数量的事件处理线程去异步处理客户端事件即可。因此,NIO模式从理论上具备应对高并发的条件。 至此,我暂不再去深究操作系统层面epoll等技术细节,带着对Java BIO、NIO的初步认识,下一步打算去了解一下使用Netty如何去创建和访问一个BIO、NIO的服务以及Netty带给我们的封装和基本的设计思想。icon-default.png?t=N7T8https://www.coderli.com/netty4-java-nio/欢迎加入群聊,一起交流探讨:【Java学习交流(982860385)】

距离上一篇博文已经过去了半个多月。这期间有一周多的时间用在了准备单位举办的英语竞赛上。余下的时间沉迷于陪孩子玩耍和睡觉,日复一日。

当然,我也抽空学习了Java NIO(None-Blocking / New IO) 一些知识,现总结如下。

Java的非阻塞IO的原理是采用了操作系统的多路复用器机制,即在一个通道(channel)上,注册一个事件选择器(selector)及各种事件(读、写等),当有事件到达时,事件选择器返归对应的事件,然后可对事件进行处理,这样即可实现在单一线程上对来自不同客户的请求进行交替处理,服务端处理返回后即可处理下一事件,而不会受制于客户端的响应速度,提高了并发访问的效率。

Java NIO的样例代码如下:

 全文详见个人独立博客:Netty4自学笔记 (2) - Java NIO

Netty与NIO BIO,NIO,Netty简介,BIO,AIO,NIO的区别,NIO的Buffer缓冲区,通道,以及处理java.nio.BufferOverflowException异常!欢迎指出错误! 阅读详情

相关推荐

Java NIO与Netty网络编程

Java NIO和Netty都是网络编程中的重要技术。Java NIO提供了非阻塞I/O操作的能力,使得开发高性能网络应用成为可能;而Netty则是一个基于Java NIO的高性能网络应用框架,它封装了Java NIO的复杂性,提供了更易于使用的API和丰富的功能。在实际应用中,应根据具体需求和项目特点选择合适的技术,并结合最佳实践进行优化和实现。

shejizuopin的博客 1143

netty4 核心原理-基础篇

开篇题 新入职一家公司,工作节奏较快,没有过多属于自己的时间,时间管理方面必须将时间颗粒度划分的更细点,努力挤出点属于自己的时间,学习和巩固下相关知识。netty目前计划规划三遍,基础篇,核心理论篇,实战篇,现在开始netty学习之旅。 1.什么是netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty 是一个广泛使用的 Java 网络编程框架(Netty 在 2011 年获得了Duke's ...

jackwang91的博客 1561

Socket,NIO,Netty介绍

1. Socket回顾与I/0模型 1.1 Socket网络编程回顾 1.1.1 Socket概述 Socket,套接字就是两台主机之间逻辑连接的端点。TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。 Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。 它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远程主机的IP地址、远程进程的协议端口。 1.1.2

kitty_hi的博客 1257

Java NIO框架Netty教程(十七) Netty4 Hello world

最近很多人问我有没有Netty4的Hello World样例,很早之前知道Netty要出4,当时只知道4的包名完全边了,因为Netty从JBoss中独立出来了,并采用了新的netty.io的域名,但是没想到代码也有这么大的调整。 既然答应了别人,就抽时间看一下Netty4,也顺便补充一下自己的知识。还是先从最简单的Hello world开始吧。下面代码基于最近版的Netty4,netty4.

jackwu_2015的博客 768

netty4完整配置及实例

由于netty各个版本之间差异较大,这里整理了一下各个版本的包及样例,使用了maven工程,将各个版本需要的最简jar文件已配置完全,可以在些基础上进行正式项目的开发。

Netty4 使用

本资料是使用netty4来进行对象的传输的demo ,并对这个通信做了封装,方便用户的使用。

java nio netty_Java NIO框架--Netty4的简单示例

简介相比Netty3, Netty4有很多显著的变化:NioEventLoopGroup 是一个处理I/O操作的多线程事件环。即为Netty4里的线程池,在3.x里,一个Channel是由ChannelFactory创建的,同时新创建的Channel会自动注册到一个隐藏的I/O线程。 4.0使用新的名为EventLoopGroup的接口来替换ChannelFactory,它由一个或多个EventL...

weixin_28836507的博客 213

netty4与spring集成

netty4与spring集成;客户端服务端代码实现。netty4与spring集成。

Netty4.X 学习过程(一)

最近有做过关于mina的开发,感觉开发起来不是很方便,便问了一下组长有没有什么其他的IO框架,便来了解了一下netty,结果网上的人都说这个框架的性能不错。慢慢的使用的人也越来越多了,再这里记录我学习的过程,争取每天抽点时间来学习这个框架! Netty的官网:netty官网首先看官网快速开发的教程:4.x的官网快速开发文档前面的都是说这个框架的有什么好处,可以解决那些现在存在的什么问题。我们直接从编

327

基于Java语言的Netty4框架的实用设计源码示例

本项目是一个基于Java语言的Netty4框架的实用设计源码示例,包含223个文件,其中Java源文件63个,Shell脚本3个,JavaScript和CSS文件各3个,HTML文件1个,并附有130个GIF动画、7个XML配置、4个PNG图片、4个JPG图片、2个批处理文件、2个属性文件和1个Markdown文档。

GPS从入门到放弃(一) --- GPS基础原理

GPS从入门到放弃(一) — GPS基础原理 GPS,全称Global Positioning System,已经广泛应用于我们的日常生活中了,现在的智能手机 里都会自带GPS定位功能。这是一个美国的全球定位系统,虽然我们现在也有北斗了,但毕竟GPS搞的早,所以先从它开始研究起。 整个GPS系统分三大部分: 地面站 卫星 接收机 地面站负责监控。它们通过接收、测量各个卫星信号,计算卫星的运行轨...

tyst08的专栏 2万+

【Netty4核心原理③】【 Netty 与 NIO 之前世今生】

本系列内容为阅读《Netty4 核心原理》一书内容总结,内容存在个人删改,仅做个人笔记使用。第三章 Netty 与 NIO 之前世今生</</</</TODO。

猫吻鱼的博客 1327

01. VBA从入门到精通——录制宏、窗口、快捷键

excel表功能区右击→常用→选择显示开发工具选项→确定Visual Basic:打开VBA窗口宏:查看要录制的宏录制宏:准备录制宏使用相对引用:录制宏的时候对单元格的引用做一个设置宏安全性:对宏的使用做安全设置,一般设置为禁用所有宏,并发出通知,此时打开带有宏代码的工作薄时会出现警告标记,如果宏可信就选择启动。

weixin_43812198的博客 1696

Netty4自学笔记 (3) - Netty NIO Server和Client 样例说明

更新节奏缓慢,因为每晚学习注意力不够集中,学习进展缓慢。本还给自己找了一大堆其他理由,但摸着良心问自己,似乎只有这个理由说的通。

CoderCoding的博客 1174

Cursor生成JAVA相关的关键词提示规则

你是 Java 编程、Spring Boot、Spring Framework、Maven、JUnit 及相关 Java 技术的专家。在项目根目录创建一个.curstorrules文件(注意有个小数点),之后在该文件内填入下面内容。始终遵循 SOLID 原则,保持高内聚低耦合的 Spring Boot 应用设计。Java 和 Spring Boot 使用规范。Spring Boot 具体规范。

kitonGao的博客 2116

杂记 | 使用keycloak实现SSO单点登录(新手向,概念、原理、逻辑、详细步骤、难点解释)

使用keycloak实现SSO单点登录(概念、原理、逻辑、详细步骤、难点解释)

野生猿林仔的博客 2万+

Java NIO与Netty

Java 网络IO模型(BIO NIO AIO) BIO同步并阻塞(传统阻塞型):一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。 NIO同步非阻塞:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O 请求时才启动一个线程进行处理。 AIO异步非阻塞:一个有效请求一个线程,客户端的 I/O 请求都是由 OS 先完成了再通知服务器应用去 启动线程进行处理。 BIO与NIO的区别 BIO 是面向流的,NIO 是面向缓冲区的或者

九曜 4117

【GeoDa实用技巧100例】024:geoda计算全局(局部)莫兰指数Moran‘s I,LISA聚类地图,显著性地图

【GeoDa实用技巧100例】024:geoda计算全局(局部)莫兰指数Moran's I,单变量莫兰指数,双变量莫兰指数计算,LISA聚类地图,显著性地图,Geoda双变量莫兰指数是一种强大的地理空间数据分析工具。

智慧空间实验室 6051

Netty——BIO、NIO 与 Netty

本文介绍了 BIO、NIO 与 Netty,并对比了 NIO 和 Netty 的区别。

qq_61350148的博客 1218

C语言设计模式全面解析:从理论到28个实战示例

本文系统介绍了23种经典设计模式在C语言中的实现方法。通过结构体、函数指针等技巧,C语言可以优雅地模拟面向对象特性,实现代码复用与解耦。文章分类详解了创建型、结构型、行为型三大类模式,并提供了28个完整代码示例,包括单例、策略、观察者等核心模式的精简实现。这些模式在嵌入式系统、操作系统内核等场景中广泛应用,如状态机、事件驱动等。学习C语言设计模式的关键在于理解模式意图,掌握函数指针和结构体组合等技巧,并在实际项目中灵活运用。本文为C语言开发者提供了全面的设计模式参考指南。

数字人生 364

AMD SDP 优快云 系列文章设计

摘要 本文档规划了7篇AMD SDP协议解析系列文章的技术博客设计方案。基于《Scalable Data Port (SDP) Specification》1.5.0版本(122页),面向SoC/NoC领域的RTL设计与验证工程师,构建从基础概念到验证实现的知识体系。 系列文章严格遵循协议规范边界,采用五类证据标签区分内容来源(规范原文、勘误、验证推导等),禁止补充未定义的实现细节。包含端口控制、事务传输、一致性协议等核心内容,最终落实到验证平台设计与覆盖率模型。 每篇文章采用统一模板:明确规范依据、问题导

元直的博客 162

netty系列之:NIO和netty详解

文章目录简介NIO常用用法NIO和EventLoopGroupNioEventLoopGroupSelectorProviderSelectStrategyFactoryRejectedExecutionHandlerEventLoopTaskQueueFactoryNioEventLoop总结 简介 netty为什么快呢?这是因为netty底层使用了JAVA的NIO技术,并在其基础上进行了性能的优化,虽然netty不是单纯的JAVA nio,但是netty的底层还是基于的是nio技术。 nio是JDK1.

程序那些事 6433

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java网络编程演进:从NIO到Netty的UDP实践全解析

通过对比NIO和Netty的实现,我们可以清楚地看到Netty在简化网络编程、提高开发效率和性能方面的优势。Netty不仅封装了复杂的NIO操作,还提供了丰富的功能和优化措施,使得开发高性能网络应用变得更加容易。随着技术的不断发展,保持学习和实践的态度,将帮助我们在网络编程领域不断提升。无论是使用NIO还是Netty,核心都是要理解网络编程的基本原理。

阿水的博客 3615

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

BIO、NIO、AIO及java中NIO 与netty的 IOCP区别联系

1 有人能说清楚JAVA7 NIO NETTY IOCP之间的联系吗? 原文链接:https://www.zhihu.com/question/20853629 不过这似乎是3年前的问题? 还没有找到答案吗? 那我说一下吧 iocp和poll/epoll这些是操作系统层面的东西 iocp是win,poll(linux和unix) 后者在linux上可以改成epoll,在mac或bs...

ice-wee的专栏 3316

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Netty之NIO

空转”指的是:Selector 频繁触发写事件,但你没有实际业务要处理(即没有数据需要写),这会造成CPU 空耗,浪费资源。本质上就是:写事件一直在通知你,但你啥也不用干,程序在“白忙活”。

qq_45101876的博客 1869
上一篇: Netty4自学笔记 (1) - Java BIO
下一篇: Netty4自学笔记 (3) - Netty NIO Server和Client 样例说明
CoderCodingNo
博客等级 码龄4年 2041粉丝 635原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值