`
潜心修炼
  • 浏览: 18962 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Netty的服务器实现浅析

阅读更多
    如果你现在还在写着操作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
2
0
分享到:
评论

相关推荐

    Netty实现原理浅析.pdf

    ### Netty实现原理浅析 #### 一、总体结构概览 Netty是一个高性能的Java NIO框架,由JBoss出品。它不仅提供了一套完整的客户端和服务端开发工具集,而且具备高度可定制化的特点,使得开发者能够轻松构建出可靠且...

    Netty实现原理浅析

    ### Netty实现原理浅析 #### 一、总体结构 Netty是一款由JBoss推出的高效且功能丰富的Java NIO框架,旨在简化网络编程并提高性能。为了更好地理解Netty的工作原理,我们首先需要了解它的整体架构。Netty的总体结构...

    Netty实现原理浅析.docx

    这些设计使得Netty成为了Java平台上的首选网络编程框架之一,广泛应用于高并发、低延迟的系统,如分布式计算、实时通信、游戏服务器等场景。通过深入理解Netty的实现原理,开发者能够更好地利用其特性,优化自己的...

    netty服务器解析16进制数据

    在Netty中,可以通过自定义的 `ChannelInboundHandler` 或 `ChannelOutboundHandler` 来实现特定的数据解码和编码逻辑。例如,可以创建一个 `HexDecoder` 和 `HexEncoder`,分别处理从16进制字符串到字节的转换和...

    springboot集成netty实现代理服务器

    springboot集成netty实现代理服务器,实现http和https请求的代理功能

    netty5实现的websocket服务器

    在本项目中,“netty5实现的websocket服务器”利用了Netty 5版本的特性来构建WebSocket服务端,旨在为Android和iOS的APP提供长连接功能,从而增强应用的实时响应能力。 WebSocket 协议是一种在TCP基础上建立持久...

    c++客户端和java(Netty)服务器端tcp通讯

    本话题将探讨如何使用C++客户端与Java(通过Netty框架)服务器端实现TCP通讯,并涉及数据序列化工具Protocol Buffers(protobuf)在两者之间的交互。 首先,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节...

    Netty 实现scoket 主动推送数据到服务和服务端实现方式

    随着物联网的发展,随之出现了各种传感器监测数据的实时发送,需要和netty服务器通讯,netty和传感器之间需要保持长连接(换句话说,netty和gateway之间都会主动给对方发送消息) 碰到的问题: netty作为服务器端如何...

    netty服务器通讯说明: 服务器条件NETTY框架编程: 服务器IP:192.168.2.106 端口8810

    netty服务器通讯说明: 服务器条件NETTY框架编程: 服务器IP:192.168.2.106 端口8810 数据传输的方式:从串口接收到一条完整的协议数据,计算出数据字节长度,打包成HtAlingProtocol类,并发送给服务器; package ...

    使用Netty4实现多线程的消息分发

    在本文中,我们将深入探讨如何利用 Netty 4 实现多线程的消息分发,这对于构建分布式系统、游戏服务器或者任何需要高效处理并发连接的应用尤其重要。 一、Netty 框架简介 Netty 是由 JBoss 提供的一个开源项目,它...

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

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

    Android与Netty服务器连接

    在Android开发中,有时我们需要实现一个客户端应用与服务器进行高效、稳定的通信,这时Netty作为一个高性能、异步事件驱动的网络应用程序框架就显得尤为重要。本文将深入探讨如何在Android平台上利用Netty构建客户端...

    用netty实现文件传输

    在本文中,我们将深入探讨如何利用 Netty 4.0.23 版本来实现文件的传输,这包括客户端和服务器端的交互过程。 1. **Netty 基本概念** - **BossGroup 和 WorkerGroup**:Netty 中的核心概念,BossGroup 负责接收新...

    java物联网的netty服务器

    Java物联网的Netty服务器是一种基于Java的高性能网络应用框架,主要应用于开发高并发、低延迟的网络服务。Netty由JBOSS组织开发并维护,是Java生态系统中的一个强大工具,广泛用于物联网(IoT)场景,如设备通信、数据...

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

    当客户端通过RTSP协议将流文件上传到服务器时,你需要在Netty的服务器端实现文件接收和存储逻辑。这可能涉及到创建一个特殊的Handler来处理上传请求,将接收到的数据写入到磁盘,并保持文件系统的同步。 6. 播放...

    netty5实现的socket服务器

    在本文中,我们将深入探讨如何使用 Netty 5 实现一个 Socket 服务器,以及它在公司实际项目中的应用,特别是为 APP 提供长连接功能。 首先,我们需要了解 Socket 基础。Socket 是一种网络通信机制,它允许两个网络...

    netty实现sdtp协议

    5. **客户端实现**:对于硬件设备端,可以使用 Netty 的 `Bootstrap` 类创建一个客户端实例,配置相应的 `ChannelInitializer`,并指定服务器的地址和端口。连接成功后,同样通过 `ChannelHandlerContext` 进行数据...

    Netty服务器与客户端

    Netty基于NIO(非阻塞I/O)模型,实现了低延迟、高吞吐量的网络通信框架。 二、Netty的主要特性 1. **异步事件驱动**:Netty的事件驱动架构允许它以非阻塞的方式处理I/O操作,提高了系统的并发性能。 2. **零拷贝**...

    cmpp3 java netty 5实现

    Netty是Java领域的一款异步事件驱动的网络应用框架,适用于开发可维护的高性能协议服务器和客户端。 Netty5(请注意,实际最新稳定版本可能高于5,此处假设为5)引入了许多改进和优化,以提高网络通信的效率和稳定...

Global site tag (gtag.js) - Google Analytics