`
情情说
  • 浏览: 38927 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Netty事件监听和处理(上)【有福利】

阅读更多

陪产假结束了,今天又开始正常上班了,正好赶上米粉节活动,又要忙上一阵了,米粉节活动时间为4.03 - 4.10,有不少优惠,感兴趣的可以关注mi.com或小米商城app。

今天给大家送了福利:小爱音箱F码,据说卖的比较好,不太好抢到,借着这次公司福利,分享给大家,以表大家的支持和鼓励。

掘金的运营真的很贴心,主动找到我说:我的福利文章不是技术型文章,不能推送到信息流,只能在个人主页看到,为了让更多的人参与这次抽取,建议写一篇技术文章,末尾加上送福利的内容。再次感谢掘金运营小哥「刺客」的贴心和建议。

RabbitMQ实战的后续章节还没来得及看,这篇就总结下之前在项目组分享过的技术点:Netty事件监听和处理。

通过介绍,你会了解到:

  • 事件监听、NIO、线程模型等相关概念;
  • Netty总体结构;
  • 事件监听和处理;
  • 项目实践总结;

本篇先介绍下前两节,下一篇介绍后两节。

本篇最后会说明下福利的抽取规则,大家积极参与 >_<

相关概念

Netty是一个NIO框架,它将IO通道的建立、可读、可写等状态变化,抽象成事件,以责任链的方式进行传递,可以在处理链上插入自定义的Handler,对感兴趣的事件进行监听和处理。

所以,先介绍下事件监听、责任链模型、socket接口和IO模型、线程模型等基本概念,对后面理解Netty的事件监听和处理有很大帮助。

事件监听

JDK监听器模式主要包含以下元素:

  • EventObject 事件对象
  • EventListener 事件监听接口
  • 自定义事件源
  • 事件触发

模式很简单,用户可以自定义事件源,保存触发对象的相关数据,事件被触发后,传递给注册事件的处理者。事件监听接口是为了统一处理者方法。

举个比较好理解的按钮单击事件,其中ActionListener是事件监听器,ActionEvent是事件对象,包含了事件源:

实现一套事件监听的具体过程:

  • 确定事件源;
  • 明确可能产生的事件,定义成不同的事件对象或事件方法;
  • 提供一个存储结构,用于保存监听事件的对象,当事件发生时,会通知监听者;
  • 执行回调方法,进行业务处理;

事件监听

责任链模式

主要是说事件处理者的组织方式,通过责任链模式,可以在任何处理节点,添加自定义处理器,很方便。

关于责任链概念,这里再简单说下:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。

责任链模式

socket

一般说NIO,主要是针对网络IO,从网卡中读取数据,向网卡中写入数据,这就是监听器模式的数据源。

网络编程主要通过操作系统提供的socket接口进行,通过了解socket接口可以总结出有哪些事件。

socket是用户进程和内核网络协议之间的统一接口。
socket也是一种特殊的文件,网络通信可以看作是对文件的读取,使得对网络的控制和对文件的控制一样方便。

sokcet接口

NIO和IO模型

NIO是指非阻塞IO,我们一般说的IO都是阻塞IO,想全面了解这些概念,又会说的很多,这里就简单概括下。

一个进程所占的内存包括用户态和内核态,为了安全,用户代码是不能直接操作内核态内存的,通过系统调用进行交互,比如读取网络数据,交互过程如下:

同步阻塞

用户线程发起read请求后,需要等待数据到达才能返回,在这期间,用户线程不能做任何事情,如果是网络编程,可能有很多Socket对象进行监听,会创建大量线程被阻塞,造成资源浪费,性能下降。

针对这种情况,出现了IO模型的概念,有几种方式:

  • 同步非阻塞IO;
  • IO多路复用;
  • 异步IO;

具体介绍,网上有很多资料,就不详细说了,这里只提下IO多路复用,说说我的理解,我们项目中就是使用这种方式。

所谓多路复用,主要是操作系统提供给我们这种开发模式:可以把感兴趣的IO事件(建立、可读、可写等)提前注册,而且多个socket对象可以注册到一个selector选择器上,这样就可以多个socket对象使用一个用户线程进行监听,当事件发生时,会查找对应的socket进行读、写等操作。

之前做过NIO开发的朋友,可以看下面的示例回顾下整个过程:

java NIO示例

线程模型

上面说了我对多路复用的理解,提到了一个线程监听多个socket,但如果socket很多,一个线程是处理不过来的。另外,事件的接收和判断 与 数据的读取、处理、写入,可以在不同线程进行。

这就引出了线程模型的概念,比如Reactor和Proactor模型,具体细节就不介绍了,网上有很多资料,最终目的都是为了提高IO事件处理的性能。

Netty总体结构

这部分主要是了解下Netty,对其实现原理先不做深究。

概述

Netty 是一个异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端;
它驾驭了 Java 高级 API 的能力,并将其隐藏在一个易于使用的 API 之后;

Netty总体结构

  • Core(核心部分),是底层的网络通讯的一些通用抽象,这部分内容是关键。
  • Transport Services(传输服务),具体的网络传输能力的定义以及一些实现。
  • Protocol Support(协议支持),netty 对于一些通用协议的编码解码实现。
零拷贝

广义的零拷贝是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。Linux中的sendfile()以及 Java NIO 中的FileChannel.transferTo()方法都实现了零拷贝的功能,而在 Netty 中也通过在FileRegion中包装了 NIO 的FileChannel.transferTo()方法实现了零拷贝。

Netty中所指零拷贝,完全在用户态,更偏向于优化数据操作。Netty允许我们将多段数据合并为一整段虚拟数据供用户使用,而不需要对数据进行拷贝操作。

Netty零拷贝

统一的通讯模型

传统的JAVA IO API 在应对不同的传输协议时,需要使用不同的类型和方法,例如:java.net.Socket和java.net.DatagramSocket,它们并不具有相同的超类型;Java新的IO API与原有的阻塞式IO API也不兼容;

Netty提供了统一的API编程接口,抽象了所有点对点通信操作,仅调整几行代码,便可切换不同的传输实现:

  • 基于NIO的TCP/IP传输
  • 基于OIO的TCP/IP传输
  • 基于OIO的UDP/IP传输
  • 本地传输
事件模型

也就是要说的事件监听和处理,提供了很好的方式去处理各种事件。

Netty事件模型

大致处理过程如上图,具体将在下一篇介绍。


福利说明

最后,说下福利:小爱音箱F码。

准备了2份,主要为了感谢「微信公众号」和「掘金社区」的朋友,每一份包括1个小爱音箱F码和1个小爱音箱 mini F码。

小米手机F码源自于英文单词”Friend”,是小米公司提供给小米核心用户及为小米做出贡献的网友的优先购买权,如果您有小米F码的话无需等待即可直接利用小米F码购买相关产品!

简单来说,F码就是不用抢了,可以直接购买 ~

抽奖截止时间

4月9号中午12点

抽奖规则
掘金社区
  • 需要关注我的掘金账号才有效,个人主页

  • 使用微信抽奖助手随机抽取for掘金社区;
    掘金抽奖

微信公众号
  • 需要关注我的微信公众号才有效;
    情情说

  • 使用微信抽奖助手随机抽取for微信公众号;
    微信公众号抽奖

1
0
分享到:
评论

相关推荐

    java应用netty服务端和客户端

    Java应用程序中的Netty框架是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty广泛应用于分布式系统、云计算、大数据处理等领域,它的核心特性包括非阻塞I/O、...

    使用netty实现TCP长链接消息写入kafka以及kafka批量消费数据

    在IT行业中,网络通信和大数据处理是两个至关重要的领域,Netty和Kafka分别是这两个领域的佼佼者。Netty是一个高性能、异步事件驱动的网络应用程序框架,常用于开发高并发、低延迟的网络应用,如TCP服务器。而Kafka...

    Android使用Netty网络框架实践(客户端、服务端)

    Netty的核心是其EventLoopGroup(事件循环组),它负责处理I/O事件,并将它们分发到相应的ChannelHandlerContext(通道上下文)中。Channel(通道)是连接到特定I/O资源的对象,而Pipeline(管道)则是一系列处理器...

    Netty简介 Netty线程模型和EventLoop Codec编码与解码 ByteBuf容器

    Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。它提供了丰富的API,支持多种传输类型,如TCP、UDP和HTTP等,使得开发者能够方便地构建网络应用程序。Netty在Java...

    Java采用Netty实现基于DTU的TCP服务器 + 多端口 + 多协议

    本文将深入探讨如何使用Java的Netty框架实现一个基于DTU(Data Transfer Unit)的TCP服务器,该服务器具备多端口通信和多协议解析的能力。 首先,DTU是一种专门用于远程数据传输的设备,它能够通过GPRS、3G/4G等...

    Netty服务端和客户端调用demo

    Netty是一个高性能、异步事件驱动的网络应用框架,适用于开发服务器和客户端的Java应用。这个demo包含了Netty服务器(NettyServer)和Netty客户端(NettyClient),下面我们将详细探讨这两个组件以及它们如何协同...

    安卓基于netty4.x心跳,断线重连,状态监听,数据发送

    安卓基于netty4.x心跳,断线重连,状态监听,数据发送

    Netty4事件处理传播机制,java高级开发工程师要求(csdn)————程序.pdf

    在 Netty 中,`ChannelPipeline` 是一个关键的概念,它负责事件的处理和传播。本文将深入探讨 Netty4 中的事件处理传播机制以及如何构建事件链。 首先,每个 `Channel` 对应一个 `ChannelPipeline`。`...

    netty搭建TCP、UDP服务

    使用Netty,你可以创建服务器Bootstrap,配置监听端口,然后绑定一个ChannelHandler来处理接收到的连接和数据。客户端则通过ClientBootstrap建立到服务器的连接,同样可以设置ChannelHandler来处理响应。 在UDP...

    使用netty进行rtsp服务端开发.zip

    Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨如何使用Netty进行RTSP(Real Time Streaming Protocol)服务端的开发,以及如何处理H264...

    Netty 消息接收和线程处理模型

    在串行模式中,消息接收和处理都是在同一个线程中完成的,而在并行模式中,消息接收和处理是分离的,处理部分被投递到后台线程池中执行。 从性能角度来看,串行模式由于不存在线程上下文切换,因此处理效率更高。...

    Netty 使用Disruptor机制的处理源代码

    4. **启动 Disruptor**:启动 Disruptor,它将开始接收和处理事件。 5. **发布事件**:在 Netty 的 ChannelHandlerContext 中,使用 Disruptor 的发布方法将事件放入环形缓冲区。 文件名 "trapos-master" 可能是指...

    Netty5.0架构剖析和源码解读.pdf

    此外,Pipeline(管道)组件是Handler链的容器,负责事件的传播和处理,它使得Netty具有高度的可扩展性和灵活性。 另外,Netty的零拷贝特性也是其性能优秀的重要原因。通过利用Java NIO的FileChannel.transferTo()...

    Netty数据转发工具

    总的来说,Netty数据转发工具的实现涉及到对Netty框架的深入理解和灵活运用,包括服务器的启动、通道的创建、事件的处理以及异常的管理等多个方面。掌握这些技能,不仅有助于构建高效的数据转发服务,也能为更复杂的...

    整合netty实时通讯

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨 Netty 实时通讯的原理与应用,以及如何利用它构建 WebSocket 服务。 WebSocket 是...

    Netty一个端口支持tcp和websocket

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨如何利用 Netty 实现一个端口同时支持 TCP 和 WebSocket,从而减少资源消耗并简化...

    netty-socketio api接口文档.7z

    5. **SocketIO事件**:文档会详细介绍SocketIO的各种事件,如连接建立、断开、消息接收和发送等,以及如何注册监听器来处理这些事件。 6. **数据编码与解码**:Netty-SocketIO提供了编码器和解码器来处理SocketIO的...

    netty案例,netty4.1中级拓展篇十《Netty接收发送多种协议消息类型的通信处理方案》源码

    netty案例,netty4.1中级拓展篇十《Netty接收发送多种协议消息类型的通信处理方案》源码 ...

    netty-netty-4.1.19.Final.zip_netty_netty学习_rocketmq

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在深入探讨Netty与RocketMQ的关联之前,我们先来详细了解一下Netty的基本概念和核心特性。 Netty的核心设计...

    netty权威指南和源码

    1. **事件驱动模型**:Netty采用的是一种反应式编程模型,通过EventLoop(事件循环)和ChannelHandler(通道处理器)处理网络事件,如连接建立、数据读写、异常发生等。 2. **NIO基础**:Netty基于Java NIO(非阻塞...

Global site tag (gtag.js) - Google Analytics