【Netty】读书笔记 - 跟闪电侠学

1. 内容概要

1 服务端启动最小化代码

启动服务器步骤

  • Step1:线程模型,服务器引导类ServerBootstrap
  • Step2:IO 模型
  • Step3:IO 处理逻辑
  • Step4:绑定本地端口,启动服务
public class NettyServer {private static final int BEGIN_PORT = 8000;public static void main(String[] args) {//boosGroup :监听端口,接收新连接的线程组//workerGroup :处理每一个连接的数据读写的线程组NioEventLoopGroup boosGroup = new NioEventLoopGroup();NioEventLoopGroup workerGroup = new NioEventLoopGroup();final ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(boosGroup, workerGroup)//Step1:线程模型.channel(NioServerSocketChannel.class)//Step2:IO模型.childHandler(new ChannelInitializer<NioSocketChannel>() {protected void initChannel(NioSocketChannel ch) {//Step3:连接读写处理逻辑System.out.println(ch.attr(clientKey).get());}});//Step4:绑定本地端口,启动服务serverBootstrap.bind(8000);}
}

2 自动绑定递增端口

绑定监听器,监听端口是否绑定成功,不成功继续绑定下一个端口port+1

public class NettyServer {private static final int BEGIN_PORT = 8000;public static void main(String[] args) {NioEventLoopGroup boosGroup = new NioEventLoopGroup();NioEventLoopGroup workerGroup = new NioEventLoopGroup();final ServerBootstrap serverBootstrap = new ServerBootstrap();final AttributeKey<Object> clientKey = AttributeKey.newInstance("clientKey");serverBootstrap.group(boosGroup, workerGroup).channel(NioServerSocketChannel.class).attr(AttributeKey.newInstance("serverName"), "nettyServer").childAttr(clientKey, "clientValue").option(ChannelOption.SO_BACKLOG, 1024).childOption(ChannelOption.SO_KEEPALIVE, true).childOption(ChannelOption.TCP_NODELAY, true).childHandler(new ChannelInitializer<NioSocketChannel>() {protected void initChannel(NioSocketChannel ch) {System.out.println(ch.attr(clientKey).get());}});bind(serverBootstrap, BEGIN_PORT);}private static void bind(final ServerBootstrap serverBootstrap, final int port) {serverBootstrap.bind(port).addListener(future -> {if (future.isSuccess()) {System.out.println("端口[" + port + "]绑定成功!");} else {System.err.println("端口[" + port + "]绑定失败!");bind(serverBootstrap, port + 1);}});}
}

3 服务端启动的其他方法

如 serverBootstrap.childHandler()

方法名 是否常用 描述
handler() 用于指定在服务器启动过程中的一些逻辑
childHandler() 用于指定处理新连接数据的读写处理逻辑
attr() 给服务端Channel指定自定义属性,通过channel.attr()取出属性
childattr() 给每一个连接指定自定义属性,通过channel.attr()取出属性
option()

serverBootstrap
        .option(ChannelOption.SO_BACKLOG, 1024)

给服务器设置一些TCP参数,最常见的是so_backlog

so_backlog:临时存放已完成三次握手的请求队列的最大长度,服务器创建新连接较慢,可以调大这个参数

childoption()

serverBootstrap
        .childOption(ChannelOption.SO_KEEPALIVE, true)//默认:false
        .childOption(ChannelOption.TCP_NODELAY, true)//默认:false

ChannelOption.SO_KEEPALIVE:是否开启TCP底层心跳机制,true:开启

ChannelOption.TCP_NODELAY:是否开启Nagle算法,true:关闭,false: 开启

通俗讲,要求高实时性,有数据马上发送就设置true:关闭

【闪电侠学netty】第4章 服务端启动流程相关推荐

  1. Netty实战 IM即时通讯系统(四)服务端启动流程

    ## Netty实战 IM即时通讯系统(四)服务端启动流程 零. 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 实战: 客户端和服务端双向通信 数据传输载体ByteBuf ...

  2. 《netty入门与实战》笔记-02:服务端启动流程

    为什么80%的码农都做不了架构师?>>>    1.服务端启动流程 这一小节,我们来学习一下如何使用 Netty 来启动一个服务端应用程序,以下是服务端启动的一个非常精简的 Demo ...

  3. Netty 源码解析系列-服务端启动流程解析

    netty源码解析系列 Netty 源码解析系列-服务端启动流程解析 Netty 源码解析系列-客户端连接接入及读I/O解析 五分钟就能看懂pipeline模型 -Netty 源码解析 1.服务端启动 ...

  4. 服务端_说说Netty服务端启动流程

    点击上方☝SpringForAll社区 轻松关注!及时获取有趣有料的技术文章 本文来源:http://yeming.me/2016/03/12/netty1/ netty服务端代码分析 服务端启动配置 ...

  5. redis server服务端启动流程分析(一)

    1.server.c main()服务启动的入口 下面是redis启动的入口程序server.c,简单列了主程序中比较关键的一些点. ## server.c int main(int argc, ch ...

  6. Gaea源码阅读(三):服务端启动流程

    转载地址:http://blog.csdn.net/m_vptr/article/details/9163319 相对于客户端,服务器端工作就比较多了.服务器端需要load jar包,利用fliter ...

  7. 【Netty】读书笔记 - 跟闪电侠学netty

    前言:本篇只是笔者的读书总结,推荐结合原书观看(推荐指数:5星) 上篇 入门实战 第1章 即时聊天系统简介 第2章 Netty是什么 第3章 Netty开发环境配置 第4章 服务端启动流程 第5章 客 ...

  8. 原理剖析-Netty之服务端启动工作原理分析(上)

    一.大致介绍 1.Netty这个词,对于熟悉并发的童鞋一点都不陌生,它是一个异步事件驱动型的网络通信框架: 2.使用Netty不需要我们关注过多NIO的API操作,简简单单的使用即可,非常方便,开发门 ...

  9. 【闪电侠学netty】第6章 客户端与服务端双向通信

    [Netty]读书笔记 - 跟闪电侠学netty 1. 内容概要 1.1 本节实现功能 客户端:连接服务器,之后向服务器发送数据 服务端:接收数据后打印,并向客户端发送数据 1.2 本节知识点 1.2 ...

最新文章

  1. AbstractFactory抽象工厂模式(创建型模式)
  2. jQuery Mobile 教程
  3. php删除垃圾文件,Python删除windows垃圾文件的方法
  4. 如何:添加缺少的 ContentPlaceHolder
  5. session的简介
  6. WORD如何关闭标题段落分页功能?
  7. Python函数默认值参数的2个坑
  8. Bootstrap框架(基础篇)之列表,表格,表单
  9. cobbler报错:No such command: --get-loaders解决方案
  10. php 监听模式,总结Laravel事件系统用法(监听事件,观察者模式)
  11. 2022张宇考研基础30讲 第八讲 一元函数积分学的概念与计算
  12. 软件测试环境有几种,什么是软件测试环境_软件测试环境有哪几种_做软件测试要用到什么工具...
  13. java 首字母小写转换_java实现将字符串中首字母转换成大写,其它全部转换成小写的方法示例...
  14. 用几行代码写的bat小病毒
  15. 中兴b860a拆机_【中兴ZXV10B860A魔盒外观展示】接口|线材|插线_摘要频道_什么值得买...
  16. 微软卸载工具msicuu2(附带资源)
  17. 去中心化存储的QoS是什么?
  18. 多种代码生成炫酷代码雨(推荐)
  19. 使用POJO对象绑定请求参数
  20. 安卓SoundPool播放声音(及具体参数解析)

热门文章

  1. Hololens开发环境配置
  2. OpenVP* 设置账号密码登陆
  3. px4+vins+ego单机鲁棒飞行四(PX4飞控日志分析篇)
  4. php双分支条件语句格式,if条件语句---双分支/多分支
  5. 网络编程-----OSI七层模型、TCP/IP模型
  6. 市场上流行的BI前端展示工具或产品有哪些?
  7. 各种排序算法的稳定性分析
  8. 关于RN项目APP名称设置为中文在虚拟机里面闪退的问题;
  9. 美国HW演习怎么搞:Hack the Building
  10. mysql 默认插入值_MySQL插入默认字段值方法大全