Netty 源码阅读入门实战(二)-Netty 基本组件1 一个简单的socket例子2 Netty对于socket的抽象3 Netty组件简单介绍

1 一个简单的socket例子

  • 无 netty 前编写的代码

传统的HTTP服务器的原理创建一个ServerSocket

  • 监听并绑定一个端口一系列客户端来请求这个端口服务器使用Accept,获得一个来自客户端的Socket连接对象
  • 启动一个新线程处理连接读Socket,
    • 得到字节流解码协议
    • 得到Http请求对象处理Http请求
    • 得到一个结果
    • 封装成一个HttpResponse对象编码协议
    • 将结果序列化字节流写Socket,
    • 将字节流发给客户端
  • 继续循环步骤3
  • 流程
    • 服务端监听端口
    • 客户端会连接服务端
    • 客户端每次都会写数据,间歇5s
    • 服务端收到并写回客户端

    启动服务端

    启动客户端

    流程图示

2 Netty对于socket的抽象

3 Netty组件简单介绍

3.1 NioEventLoop

Server 端的

Client 端的

这些 while(true)就对应一个 run 方法

NioEventLoop#run

netty里有不同的io编程模型实现,以Nio为例,对io事件的处理是在NioEventLoop里做的,事件的注册,是下面的这个方法

不同的事件调用unsafe的不同方法,netty对底层socket的操作都是通过unsafe来做的 unsafe主要由两种不同的实现

  • NioMessageUnsafe
  • NioByteUnsafe

NioServerSocketChannel使用的是NioMessageUnsafe来做socket操作 NioSocketChannel使用NioByteUnsafe来做socket操作

处理每一个连接

3.2 Channel

  • 以服务端的NioMessageUnsafe为例来看下read()方法的实现,对应是否有新连接进来的情况

AbstractNioMessageChannel#doReadMessages

NioServerSocketChannel#doReadMessages 直接把底层的 channel 封装成 NioSocketChannel

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏lgp20151222

Tomcat出现validateJarFile-jar not loaded问题

validateJarFile(...\WEB-INF\lib\servlet-api.jar)-jar not loaded. See Servlet Spe...

1291
来自专栏康怀帅的专栏

Laravel 环境变量

不同环境加载不同的 .env 文件。 开发: development 测试: testing 预上线: staging 正式环境: producti...

3644
来自专栏康怀帅的专栏

Travis CI 使用详解

本文列举了使用 Travis CI 可能遇到的问题及其解决方法。 官方网站:https://travis-ci.org 官方文档:https://docs.tr...

5994
来自专栏实战docker

极速体验编译openjdk8(docker环境)

本文不讲解编译openjdk8的过程,而是专注于用最少的步骤把openjdk8源码编译构建成jdk。 进行本文的实践有个前提:请读者们先在电脑上安装docker...

2816
来自专栏Pythonista

centos7安装python3 以及tab补全功能

网址:https://www.python.org/downloads/release/python-362/

1432
来自专栏Pythonista

mysql+centos7+主从复制

1353
来自专栏IT综合技术分享

在Ubuntu18.04 Server中安装jetty,非apt版

本教程安装环境为 1、Ubuntu18.04 Server系统 2、JDK1.8 这里提一下,在Ubuntu中是可以sudo apt-get instal...

812
来自专栏lgp20151222

consul怎么在windows下安装

1.去官网下载:https://www.consul.io/downloads.html 2.解压:

1664
来自专栏DT乱“码”

gitHub基本命令

一.要提交文件到github 必须配置本地配置文件 .git文件夹的 config ? 在config文件末尾加上 [user]     name=XXX ...

3686
来自专栏程序员同行者

Linux非root用户如何使用80端口启动程序

3025

扫码关注云+社区