netty03-netty基础

本文介绍Netty服务端的基本实现与架构设计,包括可扩展的事件模型、统一的通讯API、零拷贝的Buffer支持等核心特性。同时详细展示了Netty的主从多线程Reactor模式,并通过实例代码解释了如何使用Netty搭建服务端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

what

 

netty架构

 

  • Extensible Event Model-可扩展的事件模型
  • Universal Communication API-统一的通讯API
  • Zero-Copy-Capable Rich Byte Buffer-零拷贝的Buffer
  • Transport Services-传输层服务
  • Protocol Support-应用层协议支持

Netty模块/组件

  • bootstrap  Netty服务端及客户端启动类
  • buffer  缓冲相关,对NIO Buffer做了一些优化、封装
  • channel 处理客户端与服务端之间的连接通道
  • container 连接其他容器的代码,例如Spring
  • handler 实现协议编解码等附加功能,
  • logging 日志
  • util工具类

Netty主从多线程Reactor模式

 

对应关系:

MainReactor = NioServerBoss

 

SubReactor = NioWorker

 

 

Neety服务端基本实现

package com.hotpot.netty03;

 

import java.net.InetSocketAddress;

import java.util.concurrent.ExecutorService;

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.nio.NioServerSocketChannelFactory;

import org.jboss.netty.handler.codec.string.StringDecoder;

import org.jboss.netty.handler.codec.string.StringEncoder;

 

/**

 * 描述:netty服务端

 * @author: myx

 * @date: 2018/2/7 0007

 * Copyright © 2018-ganinfo. All rights reserved.

 */

public class Server {

   public static void main(String[] args) {

      // 服务类

      ServerBootstrap bootstrap = new ServerBootstrap();

      

      // boss线程,主要监听端口和获取worker线程及分配socketChannel给worker线程

      ExecutorService boss = Executors.newCachedThreadPool();

      // worker线程负责数据读写

      ExecutorService worker = Executors.newCachedThreadPool();

      

      // 设置niosocket工厂

      bootstrap.setFactory(new NioServerSocketChannelFactory(boss, worker));

      

      // 设置管道的工厂

      bootstrap.setPipelineFactory(new ChannelPipelineFactory() {

         

         @Override

         public ChannelPipeline getPipeline() throws Exception {

            ChannelPipeline pipeline = Channels.pipeline();

            // 管道过滤器

            pipeline.addLast("decoder", new StringDecoder());

            pipeline.addLast("encoder", new StringEncoder());

            pipeline.addLast("myServerMessageHandler", new MyServerMessageHandler());

            return pipeline;

         }

      });

      // 服务类绑定端口

      bootstrap.bind(new InetSocketAddress(7777));

      System.out.println("服务端启动...");

   }

}

package com.hotpot.netty03;

 

import org.jboss.netty.channel.ChannelHandlerContext;

import org.jboss.netty.channel.ChannelStateEvent;

import org.jboss.netty.channel.ExceptionEvent;

import org.jboss.netty.channel.MessageEvent;

import org.jboss.netty.channel.SimpleChannelHandler;

/**

 * 描述:消息处理类

 * @author: myx

 * @date: 2018/2/7 0007

 * Copyright © 2018-ganinfo. All rights reserved.

 */

public class MyServerMessageHandler extends SimpleChannelHandler {

   /**

    * 接收消息

    */

   @Override

   public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {

      System.out.println("messageReceived");

      

      String s = (String) e.getMessage();

      System.out.println("服务端收到数据:"+s);

      

      //回写数据给客户端

      ctx.getChannel().write("hello...");

      super.messageReceived(ctx, e);

   }

 

   /**

    * 异常处理

    */

   @Override

   public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {

      System.out.println("exceptionCaught");

      super.exceptionCaught(ctx, e);

   }

 

   /**

    * 获取新连接事件

    */

   @Override

   public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {

      System.out.println("channelConnected");

      super.channelConnected(ctx, e);

   }

 

   /**

    * 关闭通道的时候触发 (必须是链接已经建立)

    */

   @Override

   public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {

      System.out.println("channelDisconnected");

      super.channelDisconnected(ctx, e);

   }

 

   /**

    * 通道关闭的时候触发

    */

   @Override

   public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {

      System.out.println("channelClosed");

      super.channelClosed(ctx, e);

   }

}

boss、worker处理流程

1. 标记nio selector唤醒状态(wakeUp状态位)

2. Selector(注册)

3. 处理任务队列

4. 处理自己的业务(客户端的读写请求等)

代码抽象:

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值