Netty4自学笔记 (1) - Java BIO

Netty4学习笔记(一) 基础篇 在开始学习Netty之前,我们先对Unix系统常用的I/O模型进行介绍,然后对Java的I/O历史演进历史进行简单的说明。Linux 网络I/O模型简介Linux内核将所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个 file descriptor(fd,文件描述符)。而对一个socket的读写也会有相应的描述符,称为 socket fd(socket描述符) 阅读详情

全文详见个人独立博客:Netty4自学笔记 (1) - Java BIO

Netty4自学笔记 (1) - Java BIO2012年,由于项目的需要我第一次接触到了Netty,当时Netty还处于3.x版本。我用十几篇博文记录了自己自学Netty的过程,虽然内容浅薄,但没想到被各处转载,我想主要是因为当时Netty的资料确实较少的缘故。 五六年过去了,Netty早已发展到了4.x系列,好奇也好,求知也罢,我打算重学Netty,虽然严格来说,我已不是IT从业人员,但我仍希望保留对技术的热爱与追求。 学习Netty,就免不了先去了解Java中的几种通信模型。我不想先去学习很多概念,单刀直入,就先从最容易理解的BIO(阻塞I/O)学起。 阻塞I/O,顾名思义,就是服务端在接受到客户端的请求时,在当前线程下是阻塞执行的。只有当一个客户端请求关闭后,才能接受其他客户端的请求。阻塞I/O的JDK原生实现代码如下: 服务端 package com.coderli.nettylab.bio; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; /** * @author lihongzhe 2018-06-19 11:06 */ public class BioServer { public static void main(String[] args) throws IOException { ServerSocket socketServer = new ServerSocket(); socketServer.bind(new InetSocketAddress("127.0.0.1", 7080)); for (; ; ) { Socket socket = socketServer.accept(); System.out.println("接收到新的连接请求。"); InputStream is = socket.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String line = reader.readLine(); System.out.println(line); socket.getOutputStream().write("Hello, I'm server.".getBytes()); socket.shutdownOutput(); } } } 客户端 package com.coderli.nettylab.bio; import java.io.*; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketImpl; /** * @author lihongzhe 2018-06-21 23:24 */ public class BioClient { public static void main(String[] args) throws IOException { Socket socket = new Socket(); socket.connect(new InetSocketAddress("127.0.0.1", 7080)); OutputStream os = socket.getOutputStream(); InputStream is = socket.getInputStream(); os.write("Hello, I'm client.".getBytes()); socket.shutdownOutput(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); System.out.println(br.readLine()); socket.close(); } } 简单解释一下上述代码: 服务端,通过 socketServer.bind() 绑定到指定的端口; 服务端,通过 socketServer.accept() 开启监听,等待客户端连接。当没有客户端连接时,代码阻塞在此处; 客户端,先构造一个Socket实例,然后通过socket.connect()函数连接到刚服务端绑定的端口上。此时,若成果连接,则服务端代码继续执行; 服务端,socketServer.accept() 函数返回一个Socket实例,在实例中可以得倒输入(InputStream)/输出(OutputStream)流,用于与客户端之间读取/写入数据; 由于底层依赖的协议并没有要求数据流必须一次传输完成,实际上对于要传输的数据,可多次调用 socket.getOutputStream().write()函数写入数据。因此,必须有明确的手段标明一次数据传输的结束, socket.shutdownOutput()函数的作用正是如此。 由此可见,服务端同一时刻、同一线程只能处理来自一个客户端的请求,显然这种连接模式的并发效率并不能令人满意。 我暂不深究更多的细节,接下来先去了解一下Java NIO模式的特点和开发方式。icon-default.png?t=N7T8https://www.coderli.com/netty4-java-bio/欢迎加入群聊,一起交流探讨:【Java学习交流(982860385)】

2012年,由于项目的需要我第一次接触到了Netty,当时Netty还处于3.x版本。我用十几篇博文记录了自己自学Netty的过程,虽然内容浅薄,但没想到被各处转载,我想主要是因为当时Netty的资料确实较少的缘故。

五六年过去了,Netty早已发展到了4.x系列,好奇也好,求知也罢,我打算重学Netty,虽然严格来说,我已不是IT从业人员,但我仍希望保留对技术的热爱与追求。

学习Netty,就免不了先去了解Java中的几种通信模型。我不想先去学习很多概念,单刀直入,就先从最容易理解的BIO(阻塞I/O)学起。

阻塞I/O,顾名思义,就是服务端在接受到客户端的请求时,在当前线程下是阻塞执行的。只有当一个客户端请求关闭后,才能接受其他客户端的请求。阻塞I/O的JDK原生实现代码如下:

服务端

package com.coderli.nettylab.bio;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author lihongzhe 2018-06-19 11:06
 */
public class BioServer {

    public static void main(String[] args) throws IOException {
        ServerSocket socketServer = new ServerSocket();
        socketServer.bind(new InetSocketAddress("127.0.0.1", 7080)); 
        for (; ; ) {
            Socket socket = socketServer.accept();
            System.out.println("接收到新的连接请求。");
            InputStream is = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            String line = reader.readLine();
            System.out.println(line);
            socket.getOutputStream().write("Hello, I'm server.".getBytes());
            socket.shutdownOutput();
        }
    }

}

客户端

 全文详见个人独立博客:Netty4自学笔记 (1) - Java BIO

 欢迎加入群聊,一起交流探讨:【Java学习交流(982860385)】

【Netty框架01】简介及BIO编程 Netty简介,IO模型,Java BIO 阅读详情

相关推荐

netty案例,netty4.1基础入门篇零《初入JavaIO之门BIO、NIO、AIO实战练习》

前言介绍 在Java中,提供了一些关于使用IO的API,可以供开发者来读写外部数据和文件,我们称这些API为Java IO。IO是Java中比较重要知识点,且比较难学习的知识点。并且随着Java的发展为提供更好的数据传输性能,目前有三种IO共存;分别是BIO、NIO和AIO。 Java BIO[Blocking I/O] | 同步阻塞I/O模式 BIO 全称Block-IO 是一种同步且阻塞...

bugstack虫洞栈 2846

netty4 核心原理-基础篇

开篇题 新入职一家公司,工作节奏较快,没有过多属于自己的时间,时间管理方面必须将时间颗粒度划分的更细点,努力挤出点属于自己的时间,学习和巩固下相关知识。netty目前计划规划三遍,基础篇,核心理论篇,实战篇,现在开始netty学习之旅。 1.什么是netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 Netty 是一个广泛使用的 Java 网络编程框架(Netty 在 2011 年获得了Duke's ...

jackwang91的博客 1561

JAVA BIO、NIO、AIO详解(附代码实现)以及Netty的简介

这几天在看面试的东西,可能是自己比较笨,花了快两天的时间才理清楚。特此记录一下。 首先我们要理解的一个很重要概念是,客户端连接和传送数据是分开的,连接不代表立马会传输数据。 说说BIO,NIO,AIO到底是什么东西 BIO:同步堵塞 NIO:异步堵塞 AIO:异步非堵塞 看到这里你肯定一脸懵逼,这到底是什么意思,别急,慢慢看。 在JAVA里面IO分两块,一块是操作文件的,一块是操作网...

诺浅的专栏 2472

Netty4学习笔记 --- Netty入门

1、Netty介绍 2、Netty的应用场景    互联网行业: 在分布式系统中,各个节点之间需要远程服务调用,高性能的 RPC 框架必不可少,Netty 作为异步高性能的通信框架,往往作为基础通信组件被这些 RPC 框架使用。典型的应用有:阿里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通信,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现各进...

小道的博客 1056

Java BIO、NIO、AIO、Netty知识详解(值得珍藏)

Java中I/O是以流为基础进行数据的输入输出的,所有数据被串行化(所谓串行化就是数据要按顺序进行输入 输出)写入输出流。简单来说就是java通过io流方式和外部设备进行交互。 在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上 的数据传输流,字符串流,对象流等等等。

a342874650的专栏 1231

ICC2 实战秘籍:create_workspace 命令全解析

必选项:工作区名称,这可是创建工作区的 “身份证”,必不可少。技术数据选项匹配:优先考虑用 -technology 直接加载技术文件,这是获取最新、最准确技术数据的首选路径;要是已经有合适的技术库了,那 -use_technology_lib 引用现有技术库也能快速上手。精度设置优先规则:技术文件自动配置排在第一位,能自动适配就别手动操心;要是自动配置不理想,那就显式指定 scale_factor;实在没要求,就用默认配置,但得清楚它的精度限制。

weixin_50820814的博客 1124

netty4 详解---开发第一个Netty应用程序

既然是入门,那我们就在这里写一个简单的Demo,客户端发送一个字符串到服务器端,服务器端接收字符串后再发送回客户端。2.1、配置开发环境 1.安装JDK 2.去官网下载jar包 (或者通过pom构建) 2.2、认识下Netty的Client和Server 一个Netty应用模型,如下图所示,但需要明白一点的是,我们写的Server会自动处理多客户端请求,理论上讲,处理并发的能力决

weigao_easy的博客 1424

TMS-EEG数据预处理:eeglab工具包TESA(一)

b. 自动选择:Tools -> Reject data epochs -> Reject by probability,然后进行Plot -> channel,进行删除。TMS-EEG(经颅磁刺激-脑电图)是一种结合了TMS和EEG记录的技术,这种技术允许研究者在非侵入的情况下探测大脑环路,评估大脑的兴奋性和连通性等皮层特性。对移除脉冲伪迹的数据进行插值:Tools ->TESA -> Interpolate removed data;插值后,画图查看:数据会有数值;

weixin_43604817的博客 1494

Netty4框架原理

文章目录EventLoopGroup与ReactorChannel与ChannelPipelineChannelPipeline 的初始化ChannelHandler修改ChannelPipeline布局能力ChannelPipeline中的触发事件ChannelHandlerContext接口head 和 tail (ChannelHandler&ChannelHandlerContext)使用 ChannelHandlerContext为什么会想要从 ChannelPipeline 中的某个特定

weixin_35720385的博客 1935

SystemRDL:从寄存器描述到自动化生成的完整指南

本文详细介绍了SystemRDL如何通过“一份描述,多处生成”的理念,彻底解决芯片与FPGA设计中手动维护寄存器带来的不一致与低效问题。文章提供了从语言快速上手、核心组件讲解到使用PeakRDL工具链实现自动化代码与文档生成的完整实战指南,帮助硬件工程师构建高效、可靠的寄存器开发流程。

weixin_29243279的博客 659

OpenClaw 企业级自动化系统架构设计与实现

本文介绍基于 OpenClaw 构建的企业级自动化系统的完整架构设计、技术选型、实现细节和性能优化方案。

2604_95445636的博客 484

Netty——BIO、NIO 与 Netty

本文介绍了 BIO、NIO 与 Netty,并对比了 NIO 和 Netty 的区别。

qq_61350148的博客 1218

后仿真中《SDF反标必懂连载篇》之 <INTERCONNECT/IOPATH> 到底反标电路路径是哪里

对于SDF INTERCONNECT ENTRY 描述,我们在之前的文章有详解。读万卷书,行万里路。实践很重要。今天,搞一下SDF INTERCONNECT / IOPATH 延迟数据信息,究竟反标的是哪一路径延时?究竟在电路上一段段如何表现出延迟现象的呢?

那么菜的博客 2135

Netty实战专栏 | BIO详解

大家好,我是Leo哥🫣🫣🫣,上一篇博客我们主要大致了解了一下Java中IO的演变历程,大体分为基础IO–>BIO–>NIO–>AIO这几个阶段,分部逐层递进。下面几个章节我们就要来聊聊这个变化。本节主要讨论关于BIO的知识。好了,话不多说让我们开始吧😎😎😎。客户端向服务器端发出请求后,客户端会一直等待(不会再做其他事情),直到服务器端返回结果或者网络出现问题。服务器端同样的,当在处理某个客户端A发来的请求时,另一个客户端B发来的请求会等待,直到服务器端的这个处理线程完成上一个处理。

分享思想,留下痕迹。 1万+

YOLOv11改进策略【卷积层】| SPD-Conv 针对小目标和低分辨率图像的检测任务

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 4975

arcgis计算栅格平均值

打开FC栅格数据和非水体矢量数据 利用矢量数据提取对应栅格的非水体部分 2.1打开空间分析工具à提取分析à按掩膜提取 输入对应栅格数据和矢量数据 2.2提取结果如下 进行计算FC平均值 3.1打开空间分析工具à多元分析à波段集统计 输入对应栅格和输出路径 3.2统计结果如下 ...

Z_W_H_的博客 5371

BIO、NIO、Netty演化总结

1、采用reactor模型,所有的操作均采用事件通知机制来实现(包括连接和读写数据,基于jdk的future之上做了封装,运用观察者模式和装饰器模式,避免future.get带来的程序阻塞)其中bossGroup就是mainreactor,也就是负责接收客户端的连接的,workerGroup就是subreactor,也就是专门负责读写数据的。4、一个EventLoop(可以理解为其实就是一个线程),可以绑定多个socketchannel,也就是一个线程可以同时处理多个连接的数据的读写。

qq_17805707的博客 1581

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java面试——Netty

一个数据或者事件可能会被多个 Handler 处理,在这个过程中,数据或者事件经流 ChannelPipeline,由 ChannelHandler 处理。在这个处理过程中,一个 ChannelHandler 接收数据后处理完成后交给下一个 ChannelHandler,或者什么都不做直接交给下一个 ChannelHandler。

程序猿进阶 2142

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【Netty系列】Netty/BIO/NIO/AIO

Netty是一个开源的异步的事件驱动的网络应用框架,用于快速开发高性能的网络服务器和客户端。它主要用于构建可伸缩的网络应用程序,如协议服务器和客户端。Netty的设计目标是提供一个简单、快速、稳定的网络应用程序框架,同时保持灵活性和可扩展性。Netty基于NIO(非阻塞I/O)的事件驱动模型,使用了高效的线程池和优化的内存分配机制,使得它在处理大量并发连接时表现出色。Netty广泛用于构建各种类型的网络应用,包括Web服务器、游戏服务器、即时通讯系统等。

Love Peace 1440

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java中nio、bio和aio的区别

前言:IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。现在使用NIO的场景越来越多,很多网上的技术框架或逐渐使用NIO技术,譬如Tomcat、Jetty,还有基于nio的网络编程框架Netty。 一、什么是NIO? 1.1、高并发量引起的问题 一个使用传统阻塞I/O的系统,如果还是使用传统的一个请求对应一个线程这种模式,一旦有高并发的大量请求,就会有如下问题: 1、线程不够用, 就算使用了线程池复用线程也无济于事; 2、阻塞I/O模式下,会有大量的线程被阻塞,..

何哥的博客 1万+

Netty实战一 | Java BIO, NIO 及Netty简介

免责声明:本人最近在研读《Netty实战》书籍,对于里面内容颇感兴趣,本文旨在于技术学习交流,不存在盈利性目的。 Java 网络编程 BIO:block input output 早期的网络编程开发人员,需要花费大量的时间去学习复杂的 C 语言套接字库,去处理它们在不同的操作系统上出现的古怪问题。早期的 Java API(java.net)只支持由本地系统套接字库提供的所谓的阻塞函数。Java创建一个复杂的客户端/服务器协议需要大量的样板代码(以及相当多的底层研究才能使它整个流畅地运行起来)。早期.

KevinBrain的博客 504

谢飞机的Java面试奇遇:AIO、BIO、NIO与Netty深度解析

面试官:好了,今天的面试差不多了,你的表现还算不错,回去等通知吧。

wujie10的专栏 1923

从BIO到Netty的演变

从BIO到Netty的演变 前言 计算机网络可以说是每个学计算机的都绕不过去的一道坎。计算机网络到底有多么重要,你走到大学图书馆的计算机部分,翻开那些什么《从零开始:黑客XXX》,《黑客攻防从入门到放弃》等书籍,基本第一部分都是在谈论网络。你去一些X客论坛,上面的教程帖也基本都是从网络部分开始的。 相信每一位科班出身的,都学习过《计算机网络》这样书籍, 上过这样的课程。当然教师资源如何,我这里就不...

cureking的博客 687

【Netty】从 BIO、NIO 聊到 Netty

是什么? 有哪些特点? 有哪些应用场景? 有哪些成功使用的案例? … 为了让你更好地了解 Netty 以及它诞生的原因,先从传统的网络编程说起吧! 还是要从 BIO 说起 传统的阻塞式通信流程 早期的 Java 网络相关的 API(java.net包) 使用 Socket(套接字)进行网络通信,不过只支持阻塞函数使用。 要通过互联网进行通信,至少需要一对套接字: 运行于服务器端的 Server Socket。 运行于客户机端的 Client Socket Socket 网络通信过程如下图所示: 【.

LoveSummer 1708

BIO,NIO 以及netty

BIO NIO AIO三者的技术实现以及之间的区别 bio 阻塞io处理 在程序开发里面,java最小的处理单元就是线程,也就是说每一个线程可以进行IO的处理,在处理之中 该线程无法进行其他任何操作, tcp程序实现 代码的核心,Echo程序模型,通过网络实现基础的echo操作,多线程是不可能无限制创造的,如果产生的线程过多,那么直接问题在于,处理性能降低,响应速度变慢,需要去区分操作系统的线...

qq_38412637的博客 397
上一篇: Java NIO框架Netty教程(十七) - Netty4 Hello world
下一篇: Netty4自学笔记 (2) - Java NIO
CoderCodingNo
博客等级 码龄4年 2041粉丝 635原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值