nio

【NIO服务器代码-可测试】

蹲街弑〆低调 提交于 2020-03-14 18:14:27
1、目的:了解NIO服务的工作原理 2、代码: /** * @Author: Liu * @Descripition:NIO测试 * @Date; Create in 2020/3/14 16:10 **/ public class NIOServerDemo { private int port = 8080; private Selector selector; private ByteBuffer buffer = ByteBuffer.allocate(1024); //初始化完毕 public NIOServerDemo(int port) { this.port = port; try { ServerSocketChannel server = ServerSocketChannel.open(); server.bind(new InetSocketAddress(this.port)); //设置非阻塞 server.configureBlocking(false); selector = Selector.open(); server.register(selector, SelectionKey.OP_ACCEPT); } catch (IOException e) { e.printStackTrace(); } } public void listen()

Java NIO学习笔记之二-图解ByteBuffer

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-11 10:25:37
ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰。 《程序员的思维修炼》一本书讲过,主动学习,要比单纯看资料效果来的好,所以干脆写个详细点的文章来记录一下。 概述 ByteBuffer是NIO里用得最多的Buffer,它包含两个实现方式: HeapByteBuffer 是基于Java堆的实现,而 DirectByteBuffer 则使用了 unsafe 的API进行了堆外的实现。这里只说HeapByteBuffer。 使用 ByteBuffer最核心的方法是 put(byte) 和 get() 。分别是往ByteBuffer里写一个字节,和读一个字节。 值得注意的是,ByteBuffer的读写模式是分开的,正常的应用场景是:往ByteBuffer里写一些数据,然后flip(),然后再读出来。 这里插两个Channel方面的对象,以便更好的理解Buffer。 ReadableByteChannel 是一个从Channel中读取数据,并保存到ByteBuffer的接口,它包含一个方法: <!-- lang: java --> public int read(ByteBuffer dst) throws IOException; WritableByteChannel 则是从ByteBuffer中读取数据,并输出到Channel的接口: <!-- lang

备战金三银四,面试必问的性能优化你准备好了吗?(Java性能优化大全)

你离开我真会死。 提交于 2020-03-11 00:19:29
经历了这么长时间的等待,年后求职者的竞争应该还是不小的,而且不乏很多应届生或者工作经验两三年的职场新人。 我身边其实很多93后到95后的年轻小伙伴,就像大家调侃的那样,在Java后端开发的圈子里面,初入新人基本上都是CRUD、业务密集型为导向。 很多工作两三年的同行跟我说,认为性能调优没什么用。刚工作的时候我其实没有认识到这个东西的重要性,但后来我才知道我当时想法多么的天真。 曾经,我们的系统研发部门来了一位大神,为什么叫他大神?因为在他来公司的一年时间里只做了一件事, 就是把服务器的数量缩减了一半,系统的性能指标,反而还提升了。 我有一个在小厂的朋友跟我说,他们公司的系统从来没有经过性能调优,功能测试完成后就上线了,线上也没有出现过什么性能问题,为什么还要去做性能调优呢? 当时我就回答了他一句,如果你们公司做的是 12306 网站,不做系统性能优化就上线,试试看会是什么情况。 现在假设你的系统要做一次活动,产品经理告诉你预计有几十万的用户访问量,询问系统能否承受得住。如果你不清楚自己系统的性能情况,也只能战战兢兢地回答老板,应该没问题吧。 所有的系统在开发完之后,多多少少都会有性能问题,我们要做的就是想办法把问题暴露出来,例如进行 压力测试、模拟可能的操作场景等等,再通过性能调优去解决这些问题。 我们也可以再来看看2019百度、京东、腾讯、阿里巴巴等各大厂关于性能调优的面试题

基于AIO的聊天室 (全future版)

筅森魡賤 提交于 2020-03-10 13:54:22
Java网络通信中AIO使 用,既可以在并发情况下减少cpu对内存的占用(异步非阻塞的AIO某种程度可以替代多线程),又相对于传统NIO编程更容易上手。官方提供了两种方式实现AIO的 异 步通信代码风格,一种是回调方式,另种是future方式。本文针对后者提供一个聊天室的案例。因为全future模式相对于handler更加简单灵活。具体代码如下: 服务端代码如下: package com.itheima.SocketAioBroad; /* * aio聊天服务端代码,请先启动服务端的控制台,再启动客户端控制台, * Client,Client2,Client3均是客户端,模拟多人聊天室 */ import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousServerSocketChannel; import java.nio.channels.AsynchronousSocketChannel; import java.nio.charset.Charset; import java.util.concurrent.CopyOnWriteArrayList; import java.util

IO Unix IO BIO AIO NIO

走远了吗. 提交于 2020-03-10 12:57:08
IO: io流分为 字符 和 字节 两种,其实比较好认,一般字节的都是Stream结尾,字符的是Reader或Writer结尾,字符和字节转换用InputStreamReader 字符的用于读取纯文本格式,一次读一个字符,比如utf-8三个字节 字节用来读取二进制文件等,那种人看不懂的,包括图片 视频等 再者就是io流使用了典型的装饰者模式,等等我去偷张图,侵删。 可以清晰的看出FilterInputStream就是装饰者,再不改变原有类的情况下,下面三个Data/Buffered/PushbackInputStream附加实现了不同的功能,比如BufferedInputStream实现了缓冲的功能,如果想深入了解,个人建议去看 https://www.jianshu.com/p/4a530a3c70af 。 具体使用来个例子吧清晰一点: 复制文件 FileInputStream in = new FileInputStream(src); FileOutputStream out = new FileOutputStream(dist); byte [] buffer = new byte [ 1024 ]; // read() 最多读取 buffer.length 个字节 返回的是实际读取的个数 返回 -1 的时候表示读到 eof,即文件尾 while (in.read

2-Java NIO

谁都会走 提交于 2020-03-10 08:03:19
1、 Java NIO中主要组件是Selector、Channel、Buffer,看到Selector就知道Java NIO的IO模型多路复用。 2、 NIO的3个组件中用户编程最多的是Buffer,Buffer就是用户程序缓冲区的接口,背后他会与内核缓冲区进行数据交互,所以读、写操作就完全依赖Buffer的使用了。 3、创建Buffer时需要指定缓冲区的大小,这个大小最好比实际传输的消息大小略大一些。 4、Buffer有个flip()反转方法,用来反转Buffer的读、写状态,为什么需要这个方法?因为当你从Channel中读取数据时,对Buffer来说是写状态,Buffer被写完以后,需要从Buffer中读取到用户的业务程序中,这个时候对Buffer来说是读状态,需要调用flip()反转,所以由此看来,flip()方法一定不能少。 来源: CSDN 作者: 诗人不写诗 链接: https://blog.csdn.net/tales522/article/details/104750137

Windows环境中Tomcat优化

有些话、适合烂在心里 提交于 2020-03-09 21:44:25
  Tomcat优化   tomcat服务器在JavaEE项目中使用率非常高,所以在生产环境对tomcat的优化也变得非常重要了。   对于tomcat的优化,主要是从2个方面入手,一是,tomcat自身的配置,另一个是tomcat所运行的jvm虚拟机的调优。      1.解压Tomcat后进入解压目录下的bin目录双击启动      2.成功启动脚本效果      3. 进入解压目录下的conf目录下修改tomcat-users.xml文件,配置用户和角色信息    4.tomcat7当中配置了用户名和密码之后直接可以登陆,tomcat8则需要修改webapps/manager/MATE-INF/context.xml文件,将Value注释             5.访问Tomcat      6. 点击Server Status 弹出用户名和密码为刚刚设置的      6.1 优化方案一:禁用ajp服务(windows中的tomcat8版本 默认就是禁用的,linux需要手动禁止)所以当我登陆成功后是没有sjp的       我们一般是使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用    什么是AJP呢?     AJP(Apache JServer Protocol):AJPv13协议是面向包的

高性能Server---Reactor模型

浪子不回头ぞ 提交于 2020-03-08 18:16:43
无处不在的C/S架构 在这个充斥着云的时代,我们使用的软件可以说99%都是C/S架构的! 你发邮件用的Outlook,Foxmail等 你看视频用的优酷,土豆等 你写文档用的Office365,googleDoc,Evernote等 你浏览网页用的IE,Chrome等(B/S是特殊的C/S) …… C/S架构的软件带来的一个明显的好处就是:只要有网络,你可以在任何地方干同一件事。 例如:你在家里使用Office365编写了文档。到了公司,只要打开编辑地址就可以看到在家里编写的文档,进行展示或者继续编辑。甚至在手机上进行阅读与编辑。不再需要U盘拷来拷去了。 C/S架构可以抽象为如下模型: C就是Client(客户端),上面的B是Browser(浏览器) S就是Server(服务器): 服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务 C/S架构之所以能够流行的一个主要原因就是网速的提高以及费用的降低,特别是无线网络速度的提高。试想在2G时代,大家最多就是看看文字网页,小说什么的。看图片,那简直就是奢侈!更别说看视频了! 网速的提高,使得越来越多的人使用网络,例如:优酷,微信都是上亿用户量,更别说天猫双11的瞬间访问量了!这就对服务器有很高的要求!能够快速处理海量的用户请求!那服务器如何能快速的处理用户的请求呢? 高性能服务器 高性能服务器至少要满足如下几个需求:

[内功修神]Java NIO

微笑、不失礼 提交于 2020-03-07 23:46:48
个人博客文章地址 文章目录 1. 浅析I/O模型 1.1. 什么是同步?什么是异步? 1.2. 什么是阻塞?什么是非阻塞? 1.3. 什么是阻塞IO?什么是非阻塞IO? 1.4. 什么是同步IO?什么是异步IO? 1.5. 五种IO模型 1.5.1. 阻塞IO模型(BIO) 1.5.2. 非阻塞IO模型 1.5.3. 多路复用IO模型(NIO) 1.5.4. 信号驱动IO模型 1.5.5. 异步IO模型 (Asynchronous IO --- AIO) 1.6. 两种高性能IO设计模式 1.6.1. 传统的网络服务设计模式中,有两种比较经典的模式 1.6.2. Reactor模式 1.6.3. Proactor模式 2. Java NIO之Buffer(缓冲区) 3. Java NIO之通道(Channel) 4. 选择器(Selector) 1. 浅析I/O模型 1.1. 什么是同步?什么是异步? 同步:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行 会导致整个流程的暂时等待 ,这些事件没有办法并发地执行; 异步:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行 不会导致整个流程的暂时等待 。 1.2. 什么是阻塞?什么是非阻塞? 阻塞:当某个事件或者任务在执行过程中,它发出一个请求操作