浅谈Java的IO与Netty

news2024/12/23 22:39:35

一、Java的IO((Input/Output))模型

传统IO和Java NIO最大的区别是传统的IO是面向流,NIO是面向Buffer
Socket之间建立链接及通信的过程!实际上就是对TCP/IP连接与通信过程的抽象:
1.服务端Socket会bind到指定的端口上,Listen客户端的”插入”
2.客户端Socket会Connect到服务端
3.当服务端Accept到客户端连接后
4.就可以进行发送与接收消息了
5.通信完成后即可Close

1、BIO(阻塞)

1.socketServer的accept方法是阻塞的;
2.获得连接的顺序是和客户端请求到达服务器的先后顺序相关;
3.适用于一个线程管理一个通道的情况;因为其中的流数据的读取是阻塞的;
4.适合需要管理同时打开不太多的连接,这些连接会发送大量的数据。

BIO模型

 

客户端代码
    //Bind,Connect
    Socket client = new Socket("127.0.0.1",7777);
    //读写
    PrintWriter pw = new PrintWriter(client.getOutputStream());
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    pw.write(br.readLine());
    //Close
    pw.close();
    br.close();

服务端代码
    Socket socket;
    //Bind,Listen
    ServerSocket ss = new ServerSocket(7777);
    while (true) {
    //Accept
    socket = ss.accept();
    //一般新建一个线程执行读写
    BufferedReader br = new BufferedReader(
       new InputStreamReader(socket .getInputStream()));
       System.out.println("you input is : " + br.readLine());
    }

2、NIO(非阻塞)

1.基于事件驱动,当有连接请求,会将此连接注册到多路复用器上(selector);
2.在多路复用器上可以注册监听事件,比如监听accept、read;
3.通过监听,当真正有请求数据时,才来处理数据;
4.会不停的轮询是否有就绪的事件,所以处理顺序和连接请求先后顺序无关,与请求数据到来的先后顺序有关;
5.优势在于一个线程管理多个通道;但是数据的处理将会变得复杂;
6.适合需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据。

NIO模型

 

IO复用模型
NIO客户端
//连接
    //获取socket通道
    SocketChannel channel = SocketChannel.open();
    channel.configureBlocking(false);
    //获得通道管理器
    selector=Selector.open();
    channel.connect(new InetSocketAddress(serverIp, port));
    //为该通道注册SelectionKey.OP_CONNECT事件
    channel.register(selector, SelectionKey.OP_CONNECT);
//监听
    while(true){
        //选择注册过的io操作的事件(第一次为SelectionKey.OP_CONNECT)
        selector.select();
        while(SelectionKey key : selector.selectedKeys()){
            if(key.isConnectable()){
                SocketChannel channel=(SocketChannel)key.channel();
                if(channel.isConnectionPending()){
                    channel.finishConnect();//如果正在连接,则完成连接
                }
                channel.register(selector, SelectionKey.OP_READ);
            }else if(key.isReadable()){ //有可读数据事件。
                SocketChannel channel = (SocketChannel)key.channel();
                ByteBuffer buffer = ByteBuffer.allocate(10);
                channel.read(buffer);
                byte[] data = buffer.array();
                String message = new String(data);
                System.out.println("recevie message from server:, size:" + buffer.position() + " msg: " + message);
            }
        }
    }

服务端
//连接
    //获取一个ServerSocket通道
    ServerSocketChannel serverChannel = ServerSocketChannel.open();
    serverChannel.configureBlocking(false);
    serverChannel.socket().bind(new InetSocketAddress(port));
    //获取通道管理器
    selector = Selector.open();
    //将通道管理器与通道绑定,并为该通道注册SelectionKey.OP_ACCEPT事件,
    serverChannel.register(selector, SelectionKey.OP_ACCEPT);

//监听
    while(true){
        //当有注册的事件到达时,方法返回,否则阻塞。
        selector.select();
        for(SelectionKey key : selector.selectedKeys()){
            if(key.isAcceptable()){
                ServerSocketChannel server = (ServerSocketChannel)key.channel();
                SocketChannel channel = server.accept();
                channel.write(ByteBuffer.wrap(
                new String("send message to client").getBytes()));
                //在与客户端连接成功后,为客户端通道注册SelectionKey.OP_READ事件。
                channel.register(selector, SelectionKey.OP_READ);
            }else if(key.isReadable()){ //有可读数据事件
                SocketChannel channel = (SocketChannel)key.channel();
                ByteBuffer buffer = ByteBuffer.allocate(10);
                int read = channel.read(buffer);
                byte[] data = buffer.array();
                String message = new String(data);
                System.out.println("receive message from client, size:" + buffer.position() + " msg: " + message);
            }
        }
    }

二、Netty的IO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/654168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何迁移现有应用和数据到阿里云服务器?有哪些迁移工具和方法?

如何迁移现有应用和数据到阿里云服务器?有哪些迁移工具和方法?   随着云计算技术的不断发展,越来越多的企业和个人开始将应用和数据迁移到云服务器上。阿里云作为国内领先的云服务提供商,为用户提供了一系列方便可靠的应用和数据…

2023开放原子全球开源峰会参会感受:英特尔开源技术合作与产品创新

2023开放原子全球开源峰会参会感受:英特尔开源技术合作与产品创新 文章目录 2023开放原子全球开源峰会参会感受:英特尔开源技术合作与产品创新一. 引言二. 6.11参会感受2.1 英特尔基础软件开放生态合作2.2 Celadon加速安卓在英特尔架构上的产品创新2.3 面…

ASEMI代理光宝高速光耦LTV-5341参数,LTV-5341应用

编辑-Z LTV-5341参数描述: 型号:LTV-5341 储存温度Tstg:-55~125℃ 工作温度Topr:-40~110℃ 总输出电源电压(VCC –VEE):35V 平均正向输入电流IF:20mA 峰值瞬态输入电流IF(TRAN):1A 输入…

【面试中的网络知识】DNS原理-如何实现域名和IP地址的查询转换

接上一篇,理解 浏览器是如何生成HTTP消息的 ,最好是按照顺序来读。  从上一篇博客我们得知浏览器是如何生成了HTTP消息了,但是浏览器作为应用程序,是不具备向网络中发送请求的能力,而是需要委托给操作系统的内核协议栈…

淘宝详情页分发推荐算法总结:用户即时兴趣强化

转子:https://juejin.cn/post/6992169847207493639 商品详情页是手淘内流量最大的模块之一,它加载了数十亿级商品的详细信息,是用户整个决策过程必不可少的一环。这个区块不仅要承接用户对当前商品充分感知的诉求,同时也要能肩负起…

必学KVM技术详解包括所有技能

KVM虚拟化进阶学习 一,KVM命令行安装 图形化安装教程:https://blog.csdn.net/weixin_53678904/article/details/125950867?spm1001.2014.3001.5501 1.存储池管理 ​ KVM必须要配置⼀个⽬录当作他存储磁盘镜像(存储卷)的⽬录,我们称这个⽬…

通达信筹码单峰密集选股公式,突破筹码密集区发出信号

筹码密集是相对筹码发散而言的,筹码分布在宽广的价格区间,这种状态就是筹码发散(如下图),而且筹码峰像群山一样,有多个高峰,属于多峰形态。 与之相对的,筹码分布在比较窄的价格区间&…

Armbian安装1panel教程

文章目录 一 1panel简介二 检测是否安装1Panel三 环境要求四 安装操作指导4.1 确定系统类型4.2 执行安装命令4.3 访问1panel面板4.4 设置1panel访问配置4.5 查看访问1panel面板入口 五 常用命令总结 一 1panel简介 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 二…

New Bing使用教程

New Bing使用教程 New Bing简介前提条件使用技巧 New Bing简介 New Bing是微软推出的一款基于GPT4模型的智能搜索引擎,它不仅可以提供高质量的搜索结果,还可以与用户进行自然语言交互。 用户只需安装Edge浏览器即可使用,但现实使用中会出现…

驱动操作 驱动移植试验和Source Insight添加项目

目录 驱动移植 》1.需要有一个驱动对应的 .c代码 》2.将.c文件放入到对应的文件夹内 》3.修改Makefile文件 》4.修改Kconfig菜单 》5.到顶层目录配置自己驱动 》6.编译成模块 》7.此时用的开发板上内核的编译器,安装得到开发板上进行安装 》8.在开发板上进…

标准IO和文件IO分别实现cp功能(嵌入式学习)

标准IO和文件IO分别实现cp功能 标准IO实现cp功能标准IO概念代码实现 文件IO实现cp功能文件IO概念代码实现 标准IO实现cp功能 标准IO概念 想了解标准IO的概念,请点击这里——》IO进程——标准IO(嵌入式学习) IO进程——标准IO(嵌…

【C语言】三子棋详解(包教包会的那种)

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 三子棋及五子棋详解 前言三子棋的实现1. 打印菜单2.初始化并打印棋盘棋盘初始化函数功能的实现打印棋盘 3.玩家下棋与模拟电脑下棋玩家下棋电脑下棋随机数的生成 4.判断输赢我们的game函数 源码game.hgame.ctest.c 总结 …

PMP课堂模拟题目及解析(第18期)

171. 一个项目已经结束,然而,项目经理和项目团队成员仍然被要求解决技术问题,进行一些变更,并评估新的需求。若要保证项目开发的产品或服务现在具有运营支持,项目经理应该执行下列哪些工作? (选…

Nacos配置中心交互模型是push还是pull?

对于Nacos大家应该都不太陌生,出身阿里名声在外,能做动态服务发现、配置管理,非常好用的一个工具。然而这样的技术用的人越多面试被问的概率也就越大,如果只停留在使用层面,那面试可能要吃大亏。 比如我们今天要讨论的…

44从零开始学Java之详解容易让初学者懵圈的abstract抽象类、抽象方法

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 经过前面几篇文章的讲解,我们现在已经对面向对象有了基本的认知,掌握了面向对…

基于Java员工信息管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

2.04_基于矩阵分解的协同过滤推荐

矩阵分解发展史 Traditional SVD: 通常SVD矩阵分解指的是SVD(奇异值)分解技术,在这我们姑且将其命名为Traditional SVD(传统并经典着)其公式如下: Traditional SVD分解的形式为3个矩阵相乘,中间矩阵为奇异值矩阵。如果想运用SVD分解的话,有一个前提是要求矩阵是稠密…

AAC ADTS格式分析

标题 1.AAC简介2. AAC ADTS格式分析2.1 adts_fixed_header详细介绍2.2 adts_variable_header详细介绍 1.AAC简介 AAC音频格式:Advanced Audio Coding(⾼级⾳频解码),是⼀种由MPEG-4标准定义的有损⾳频压缩格式,由Fraunhofer发展,Dolby, Sony…

[CISCN 2023 初赛]puzzle 解析

打开文件包给了一堆拼图碎片,由于文件数量高达2880张,这里不考虑gaps的方式进行修正拼图 (因为跑了也只会把gaps跑冒烟) tmp类型的拼图,因为tmp文件特性在文件头的位置会有其在原图片上的位置坐标 于是,我…

MyBatis-Plus一级缓存和二级缓存-redis解决缓存的脏数据

MyBatis-Plus一级缓存和二级缓存 文章目录 MyBatis-Plus一级缓存和二级缓存[TOC](文章目录) 基本缓存问题一级缓存-MyBatis默认打开一级缓存、不允许关闭二级缓存(默认是开启)注意:二级缓存的作用域不然更新了数据,还是使用查询到缓存的数据)操作演示第一…