Netty Socket


version: 4.1.72.Final

netty优点:高度可自定义化的网络编程

本质为一个可配置的多reactor多线程模型,由一个accept线程在接收socket channel后交由worker线程去监听新连接事件,再由worker去做数据交互等工作。

测试代码

public static void main(String[] args) throws Exception {//创建两个线程组 boosGroup、workerGroupEventLoopGroup bossGroup = new NioEventLoopGroup(); // 默认为Math.max(1, SystemPropertyUtil.getInt("io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2));EventLoopGroup workerGroup = new NioEventLoopGroup();try {//创建服务端的启动对象,设置参数ServerBootstrap bootstrap = new ServerBootstrap();//设置两个线程组boosGroup和workerGroupbootstrap.group(bossGroup, workerGroup)//设置服务端通道实现类型,netty实现的,非jdk.channel(NioServerSocketChannel.class)//设置线程队列得到连接个数.option(ChannelOption.SO_BACKLOG, 128)//设置保持活动连接状态.childOption(ChannelOption.SO_KEEPALIVE, true)//使用匿名内部类的形式初始化通道对象.childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {//给pipeline管道设置处理器socketChannel.pipeline().addLast(new MyServerHandler());}});//给workerGroup的EventLoop对应的管道设置处理器System.out.println("java技术爱好者的服务端已经准备就绪...");//绑定端口号,启动服务端ChannelFuture channelFuture = bootstrap.bind(6666).sync();//对关闭通道进行监听channelFuture.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}
}

bossgroup 配置数量是否有用

bossgroup是accept线程池,由于服务只监听一个端口,所以有也只有一个线程。

何时创建 ServerSocketChannel 并监听 Accept 事件

// bind时候做了channel的初始化 io.netty.bootstrap.AbstractBootstrap#doBind
bootstrap.bind(prot)private ChannelFuture doBind(final SocketAddress localAddress) {final ChannelFuture regFuture = initAndRegister(); // 做连接的初始化final Channel channel = regFuture.channel();// 异常则直接返回if (regFuture.cause() != null) {return regFuture;}// 关闭事件监听if (regFuture.isDone()) {ChannelPromise promise = channel.newPromise();doBind0(regFuture, channel, localAddress, promise);return promise;} else {final PendingRegistrationPromise promise = new PendingRegistrationPromise(channel);regFuture.addListener(...);return promise;}
}final ChannelFuture initAndRegister() {Channel channel = null;try {// ReflectiveChannelFactory.newChannel() => NioServerSocketChannel, 既测试代码中配置的那样, // 这里初始化channel对象时,调用了 provider.openServerSocketChannel(); 和 channel.configureBlocking(false);channel = channelFactory.newChannel();init(channel); // 执行 io.netty.bootstrap.ServerBootstrap#init,对channel进行配置, 如pipeline, handler, options} catch (Throwable t) {...}ChannelFuture regFuture = config().group().register(channel); // 绑定到bossgroup的一个线程中,监听channel的accept事件, 这也就是为什么bossgroup配多个线程也只有一个有用的原因if (regFuture.cause() != null) {  // 异常处理...}return regFuture;
}

在发现一个新的连接时,是如何处理的

accept -> run workder -> handler -> pipeline

EventLoop 有什么用, NioEventLoop 又有什么作用

NioEventLoopGroup 是包含了一组的 NioEventLoop 的对象
NioventLoop 实现了 EventLoop,EventLoop 是个接口,定义了一个方法获取当前 NioEventLoop 所属的 EventLoopGroup。

io.netty.channel.nio.NioEventLoop#run
// 一直轮询自己的NIOEventLoop, 查看是否有新的事件发送,并执行taskQueue中的任务

Netty 学习之 Socket相关推荐

  1. Netty,Tcp,socket的java框架,netty学习

    最新更新,报文发送,机器终端(车)与服务端 先学习一下基本内容,以下是基于基本内容 互相转换:byte(字节,字节是数字单位,他的数组是十进制内容),bit(二进制内容,不用操心这部分),十六进制0x ...

  2. Netty学习笔记(二) 实现服务端和客户端

    在Netty学习笔记(一) 实现DISCARD服务中,我们使用Netty和Python实现了简单的丢弃DISCARD服务,这篇,我们使用Netty实现服务端和客户端交互的需求. 前置工作 开发环境 J ...

  3. Netty 学习和进阶策略

    https://www.infoq.cn/article/xt9*7K4fJktiuWTLYrZS 背景 Netty 框架的特点 Netty 的一个特点就是入门相对比较容易,但是真正掌握并精通是非常困 ...

  4. Netty学习笔记(六)Pipeline的传播机制

    前面简单提到了下Pipeline的传播机制,这里再详细分析下 Pipeline的传播机制中有两个非常重要的属性inbound和outbound(AbstractChannelHandlerContex ...

  5. Netty学习笔记(二)Netty服务端流程启动分析

    先贴下在NIO和Netty里启动服务端的代码 public class NioServer { /*** 指定端口号启动服务* */public boolean startServer(int por ...

  6. Netty 学习笔记(已完结)

    Netty 0代码示例 A.经典IO多线程 // 获取到的inputStream是SocketInputStream,这个类不是公开的,继承了FileInputStream, InputStream ...

  7. Netty学习开发之路

    Netty学习 前言简介 ======= 我们公司最近决定做个基于netty tcp的IM程序,由于最近项目比较紧张,所以没办法,只能我和另外一个做安卓的同事一起学习开发.在这里先说一句瓜皮呦!而且项 ...

  8. 04、Netty学习笔记—(黏包半包及协议设计解析)

    文章目录 一.粘包与半包 1.1.现象分析 1.1.1.粘包.半包情况分析 1.1.2.滑动窗口.MSS限制.Nagle算法介绍 1.2.粘包.半包现象复现 1.2.1.粘包复现 1.2.2.半包复现 ...

  9. Netty学习(一):初识Netty

    章节 1.Netty学习(一):初识Netty 2.Netty学习(二):Netty的核心组件 3.Netty学习(三):Netty的流程分析 4.Netty学习(四):Netty零拷贝(转载) 5. ...

最新文章

  1. 如何解决get和post乱码问题?
  2. 虚拟主机跟php,php虚拟主机和服务器(云服务器跟虚拟主机)
  3. 计划边际码(Scheduling Margin Key)
  4. connect连接oracle6,Oracle Connect By 使用实例
  5. 计算机主机箱前后都有什么,目前四种热门的主机机箱设计都有哪些优缺点?
  6. mysql防止数据查找不到_为了防止数据库崩溃使数据丢失的解决方案
  7. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第1节 基础加强_4_Junit_@Before@After...
  8. [转贴]杨式太极拳八十五式通释—2—王志远
  9. 《自控力》读书笔记思维导图
  10. VIO_FUSION
  11. 跟着团子学SAP PS:项目模版搭建 CJ91/CJ92/CJ93/CN01/CN02/CN03/CN11/CN12/CN13
  12. 页面自动获取导入excel内容
  13. 矩阵论理论知识(四)矩阵的分解
  14. 清华大学微积分教材之我见
  15. 《源码阅读》专栏系列开篇 - 当Java工程师的这几年
  16. VMware 12 下载 百度网盘
  17. 下列快捷键中能够中断python程序运行的是_例题学习
  18. python图片识别之 easyocr
  19. 如何在word2007中并排查看对比显示两个文档
  20. 7-1 哈利·波特的考试 (25分)

热门文章

  1. html简单打字游戏,javascript实现的简单打字游戏
  2. apache http server 停止工作_(二)http协议的网站装ssl升级成https
  3. Auto CAD硬件加速——运行效果瞬间起飞
  4. win 10 系统显示U盘隐藏文件
  5. 达芬奇无声音解决方案
  6. Online Collective Matrix Factorization Hashingfor Large-Scale Cross-Media Retrieval(OCMFH)--文献翻译
  7. 记录攻防世界WEB-002
  8. linux面试中级面试题
  9. Java支付宝即时到账
  10. PYTHON 100days学习笔记007-1:python数据类型补充(1)