如果你现在还在写着操作socket的代码,也许不能说你落伍,但至少也不能说你做的工作很超前。因为现在有很多的网络通信框架已经把底层的东东封装的很完善,今天要说的Netty也算是一款不错的产品了。
突然半路进来看Netty其实是最近看HornetQ的缘故,HornetQ的底层传输的实现就是借助了Netty。按照官方的解释,Netty是一个异步的事件驱动的网络应用框架,它使得我们关于客户端服务器协议的开发变得更加的方便,维护更容易,扩展性更好。它极大的简化了我们的网络编程。更为难得的是Netty顺便打包了一堆很好的例子,对于快速入门的人来说能够很短的时间内就对其有了感官上的认识。我们就从一个例子开始吧。
package org.jboss.netty.example.discard;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.oio.OioServerSocketChannelFactory;
public class DiscardServer {
public static void main(String[] args) throws Exception {
// Configure the server.
ServerBootstrap bootstrap = new ServerBootstrap(
new OioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
// Set up the pipeline factory.
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
return Channels.pipeline(new DiscardServerHandler());
}
});
// Bind and start to accept incoming connections.
bootstrap.bind(new InetSocketAddress(8080));
}
}
上面的程序主要是用来启动了一个服务器端的服务,这个服务会监听本机的8080端口,也就是说你可以通过客户端来访问8080端口了。 ServerBootstrap 类作为一个工具类,用来启动服务器程序。这段程序主要就是做了三件事:
- 设置ChannelFactory,也就是要设置服务器通信的方式,例子就是借助socket的通信,当然你也可以设置成基于nio形式或者数据报形式的。
- 设置PipelineFactory,其实是为了设置一组Handler,这组Handler会对这个通信的过程进行处理,比如说解码,然后业务处理,然后编码数据。
- bootstrap.bind(new InetSocketAddress(8080)); 就是来启动服务。很多猫腻就是出现在这。
介绍完上面的例子,我们来说Netty代码中几个关键类型的类。
Channel Channel是Netty中数据流转的通道,它对底层的数据传输比如socket等进行了封装,我们可以借助于Channel来完成数据的读写,通道的打开和关闭等操作。Channel可以分为服务器的Channel和于客户端进行通信的Channel。
ChannelEvent 定义了一系列的事件类型,比如说Conenct,Receive,Write的等等。这符合Command模式,肯定会有某个地方来对这些命令做不同的处理
ChannelHandler可以看成是Interceptor,也就是说ChannelHandler会针对发生在Channel中的一些事件进行特定的动作处理。ChannelHandler可以分成ChannelUpstreamHandler和ChannelDownstreamHandler两种 ,顾名思义,就是说这两种handler会对不同流向的事件发挥作用。
ChannelPipeline Netty是基于事件驱动的,归根结底就是通过ChannelPipeline来控制事件流。我们通过在ChannelPipeline上注册一系列ChannelHandler来处理事件。ChannelPipeline内部维护了一个ChannelHandlerContext的集合,每个ChannelHandlerContext都会维护前后是那个ChannelHandlerContext,类似一个双向的链表。上面说到ChannelHandler分为Up和Down两个方向,那么如何理解Up和Down?其实,Up就是说流入的事件,Down就是流出的事件。对于客户端,读到客户端程序写入的数据就是流入,而返回数据也就是将数据写回到客户端就属于流出的事件。发生流入的事件时,只有属于ChannelUpstreamHandler才有资格处理。而对于流出的时间,则ChannelDownstreamHandler才有资格处理。对于一个ChannelPipeline上注册的多个Handler,他们注册的顺序决定了他们处理的顺序。那么对于流出的事件来说,所有的handler都处理完毕之后,需要有一个类真正的服务将数据写回到客户端,这个类就是下面所说的ChannelSink.
ChannelSinkchannelPipline完成所有的DownHandler后通过 ChannelSink来进行底层通信的处理。
XIOWorker 负责与底层通信,如数据的写入输出。X根据协议的不同而不同。
下面说一下Netty中服务器端的工作原理,本图引自边城客栈
http://www.kafka0102.com,如果图的作者对于本文中的引用有意见可以给我留言,我会删除此图。
如图所示,服务器端通过mainReactor来处理客户端的连接请求(ChannelSink的Boss内部类充当的就是mainReactor的角色),每建立一个连接后,就会从连接池中获取或者新建一个subReactor(XIOWorker,X根据协议的不同而不同)来专门处理与某个客户端的通信工作。
类图:
不知不觉已经十二点多了,就此打住了。欢迎朋友们多多交流。
- 大小: 90 KB
- 大小: 36.1 KB
分享到:
相关推荐
### Netty实现原理浅析 #### 一、总体结构概览 Netty是一个高性能的Java NIO框架,由JBoss出品。它不仅提供了一套完整的客户端和服务端开发工具集,而且具备高度可定制化的特点,使得开发者能够轻松构建出可靠且...
### Netty实现原理浅析 #### 一、总体结构 Netty是一款由JBoss推出的高效且功能丰富的Java NIO框架,旨在简化网络编程并提高性能。为了更好地理解Netty的工作原理,我们首先需要了解它的整体架构。Netty的总体结构...
这些设计使得Netty成为了Java平台上的首选网络编程框架之一,广泛应用于高并发、低延迟的系统,如分布式计算、实时通信、游戏服务器等场景。通过深入理解Netty的实现原理,开发者能够更好地利用其特性,优化自己的...
在Netty中,可以通过自定义的 `ChannelInboundHandler` 或 `ChannelOutboundHandler` 来实现特定的数据解码和编码逻辑。例如,可以创建一个 `HexDecoder` 和 `HexEncoder`,分别处理从16进制字符串到字节的转换和...
springboot集成netty实现代理服务器,实现http和https请求的代理功能
在本项目中,“netty5实现的websocket服务器”利用了Netty 5版本的特性来构建WebSocket服务端,旨在为Android和iOS的APP提供长连接功能,从而增强应用的实时响应能力。 WebSocket 协议是一种在TCP基础上建立持久...
本话题将探讨如何使用C++客户端与Java(通过Netty框架)服务器端实现TCP通讯,并涉及数据序列化工具Protocol Buffers(protobuf)在两者之间的交互。 首先,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节...
随着物联网的发展,随之出现了各种传感器监测数据的实时发送,需要和netty服务器通讯,netty和传感器之间需要保持长连接(换句话说,netty和gateway之间都会主动给对方发送消息) 碰到的问题: netty作为服务器端如何...
netty服务器通讯说明: 服务器条件NETTY框架编程: 服务器IP:192.168.2.106 端口8810 数据传输的方式:从串口接收到一条完整的协议数据,计算出数据字节长度,打包成HtAlingProtocol类,并发送给服务器; package ...
在本文中,我们将深入探讨如何利用 Netty 4 实现多线程的消息分发,这对于构建分布式系统、游戏服务器或者任何需要高效处理并发连接的应用尤其重要。 一、Netty 框架简介 Netty 是由 JBoss 提供的一个开源项目,它...
本文将深入探讨如何使用Java的Netty框架实现一个基于DTU(Data Transfer Unit)的TCP服务器,该服务器具备多端口通信和多协议解析的能力。 首先,DTU是一种专门用于远程数据传输的设备,它能够通过GPRS、3G/4G等...
在Android开发中,有时我们需要实现一个客户端应用与服务器进行高效、稳定的通信,这时Netty作为一个高性能、异步事件驱动的网络应用程序框架就显得尤为重要。本文将深入探讨如何在Android平台上利用Netty构建客户端...
在本文中,我们将深入探讨如何利用 Netty 4.0.23 版本来实现文件的传输,这包括客户端和服务器端的交互过程。 1. **Netty 基本概念** - **BossGroup 和 WorkerGroup**:Netty 中的核心概念,BossGroup 负责接收新...
Java物联网的Netty服务器是一种基于Java的高性能网络应用框架,主要应用于开发高并发、低延迟的网络服务。Netty由JBOSS组织开发并维护,是Java生态系统中的一个强大工具,广泛用于物联网(IoT)场景,如设备通信、数据...
当客户端通过RTSP协议将流文件上传到服务器时,你需要在Netty的服务器端实现文件接收和存储逻辑。这可能涉及到创建一个特殊的Handler来处理上传请求,将接收到的数据写入到磁盘,并保持文件系统的同步。 6. 播放...
在本文中,我们将深入探讨如何使用 Netty 5 实现一个 Socket 服务器,以及它在公司实际项目中的应用,特别是为 APP 提供长连接功能。 首先,我们需要了解 Socket 基础。Socket 是一种网络通信机制,它允许两个网络...
5. **客户端实现**:对于硬件设备端,可以使用 Netty 的 `Bootstrap` 类创建一个客户端实例,配置相应的 `ChannelInitializer`,并指定服务器的地址和端口。连接成功后,同样通过 `ChannelHandlerContext` 进行数据...
Netty基于NIO(非阻塞I/O)模型,实现了低延迟、高吞吐量的网络通信框架。 二、Netty的主要特性 1. **异步事件驱动**:Netty的事件驱动架构允许它以非阻塞的方式处理I/O操作,提高了系统的并发性能。 2. **零拷贝**...
Netty是Java领域的一款异步事件驱动的网络应用框架,适用于开发可维护的高性能协议服务器和客户端。 Netty5(请注意,实际最新稳定版本可能高于5,此处假设为5)引入了许多改进和优化,以提高网络通信的效率和稳定...