当前位置: 首页 > news >正文

电子商务公司是诈骗吗点金推广优化公司

电子商务公司是诈骗吗,点金推广优化公司,微信公众号 网站开发 2016,凡科教育1、 详解Java中的BIO、AIO、NIO 1.1、引言 IO流是Java中比较难理解的一个知识点,但是IO流在实际的开发场景中经常会使用到,比如Dubbo底层就是NIO进行通讯。本文将介绍Java发展过程中出现的三种IO:BIO、NIO以及AIO,重点介绍NIO。…

1、 详解Java中的BIO、AIO、NIO

1.1、引言

IO流是Java中比较难理解的一个知识点,但是IO流在实际的开发场景中经常会使用到,比如Dubbo底层就是NIO进行通讯。本文将介绍Java发展过程中出现的三种IO:BIO、NIO以及AIO,重点介绍NIO。

1.2、什么是BIO

BIO即同步阻塞IO,实现模型为一个连接就需要一个线程去处理。这种方式简单来说就是当有客户端来请求服务器时,服务器就会开启一个线程去处理这个请求,即使这个请求不干任何事情,这个线程都一直处于阻塞状态。

BIO模型有很多缺点,最大的缺点就是资源的浪费。想象一下如果QQ使用BIO模型,当有一个人上线时就需要一个线程,即使这个人不聊天,这个线程也一直被占用,那再多的服务器资源都不管用。


 

代码演示:package com.atguigu.bio;import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class BIOServer {public static void main(String[] args) throws Exception {//线程池机制//思路//1. 创建一个线程池//2. 如果有客户端连接,就创建一个线程,与之通讯(单独写一个方法)ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();//创建ServerSocketServerSocket serverSocket = new ServerSocket(6666);System.out.println("服务器启动了");while (true) {System.out.println("线程信息 id =" + Thread.currentThread().getId() + " 名字=" +      Thread.currentThread().getName());//监听,等待客户端连接System.out.println("等待连接....");final Socket socket = serverSocket.accept();System.out.println("连接到一个客户端");//就创建一个线程,与之通讯(单独写一个方法)newCachedThreadPool.execute(new Runnable() {public void run() { //我们重写//可以和客户端通讯handler(socket);}});}}//编写一个handler方法,和客户端通讯public static void handler(Socket socket) {try {System.out.println("线程信息 id =" + Thread.currentThread().getId() + " 名字=" + Thread.currentThread().getName());byte[] bytes = new byte[1024];//通过socket 获取输入流InputStream inputStream = socket.getInputStream();//循环的读取客户端发送的数据while (true) {System.out.println("线程信息 id =" + Thread.currentThread().getId() + " 名字=" +    Thread.currentThread().getName());System.out.println("read....");int read =  inputStream.read(bytes);if(read != -1) {System.out.println(new String(bytes, 0, read)); //输出客户端发送的数据} else {break;}}}catch (Exception e) {e.printStackTrace();}finally {System.out.println("关闭和client的连接");try {socket.close();}catch (Exception e) {e.printStackTrace();}}}
}

演示
快捷键win+R打开cmd窗口,根据上面代码拼写6666端口
输入 telnet 127.0.0.1 6666
进入黑窗口

输入ctrl+]
向服务端发送文本
send hello world

服务端接收的

当有
多个cmd窗口时,则创建多一个线程与之对应
退出时,cmd输入
quit
服务端显示

2、什么是NIO

BIO是阻塞的,如果没有多线程,BIO就需要一直占用CPU,而NIO则是非阻塞IO,NIO在获取连接或者请求时,即使没有取得连接和数据,也不会阻塞程序。NIO的服务器实现模式为一个线程可以处理多个请求(连接)。
NIO有几个知识点需要掌握,Channel(通道),Buffer(缓冲区), Selector(多路复用选择器)。
Channel既可以用来进行读操作,又可以用来进行写操作。NIO中常用的Channel有FileChannel
、SocketChannel、ServerSocketChannel、DatagramChannel。

Buffer缓冲区用来发送和接受数据。

Selector 一般称为选择器或者多路复用器 。它是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel(通道)的状态是否处于可读、可写。在javaNIO中使用Selector往往是将Channel注册到Selector中。

下面我通过代码的方式模拟javaNIO的运行流程。

2.1、NIO代码实践

首先贴上NIO的实践代码:NIO服务端详细的执行过程是这样的:创建一个ServerSocketChannel和Selector,然后将ServerSocketChannel注册到Selector上
Selector通过select方法去轮询监听channel事件,如果有客户端要连接时,监听到连接事件。
通过channel方法将socketchannel绑定到ServerSocketChannel上,绑定通过SelectorKey实现。
socketchannel注册到Selector上,关心读事件。
Selector通过select方法去轮询监听channel事件,当监听到有读事件时,ServerSocketChannel通过绑定的SelectorKey定位到具体的channel,读取里面的数据。

public class NioServer {public static void main(String[] args) throws IOException {//创建一个socket通道,并且设置为非阻塞的方式ServerSocketChannel serverSocketChannel=ServerSocketChannel.open();serverSocketChannel.configureBlocking(false);serverSocketChannel.socket().bind(new InetSocketAddress(9000));//创建一个selector选择器,把channel注册到selector选择器上Selector selector=Selector.open();serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);while (true){System.out.println("等待事件发生");selector.select();System.out.println("有事件发生了");Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();while (iterator.hasNext()){SelectionKey key = iterator.next();iterator.remove();handle(key);}}}private static void handle(SelectionKey key) throws IOException {if (key.isAcceptable()){System.out.println("连接事件发生");ServerSocketChannel serverSocketChannel= (ServerSocketChannel) key.channel();//创建客户端一侧的channel,并注册到selector上SocketChannel socketChannel = serverSocketChannel.accept();socketChannel.configureBlocking(false);socketChannel.register(key.selector(),SelectionKey.OP_READ);}else if (key.isReadable()){System.out.println("数据可读事件发生");SocketChannel socketChannel= (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(1024);int len = socketChannel.read(buffer);if (len!=-1){System.out.println("读取到客户端发送的数据:"+new String(buffer.array(),0,len));}//给客户端发送信息ByteBuffer wrap = ByteBuffer.wrap("hello world".getBytes());socketChannel.write(wrap);key.interestOps(SelectionKey.OP_READ|SelectionKey.OP_WRITE);socketChannel.close();}}
}

客户端代码:NIO客户端代码的实现比BIO复杂很多,主要的区别在于,NIO的客户端也需要去轮询自己和服务端的连接情况。

客户端发送数据后,获取到了来自服务端的回复。

2.2、NIO总结

NIO通过一个Selector,负责监听各种IO事件的发生,然后交给后端的线程去处理。NIO相比与BIO而言,非阻塞体现在轮询处理上。BIO后端线程需要阻塞等待客户端写数据,如果客户端不写数据就一直处于阻塞状态。而NIO通过Selector进行轮询已注册的客户端,当有事件发生时才会交给后端去处理,后端线程不需要等待。

3、什么是AIO

AIO是在JDK1.7中推出的新的IO方式–异步非阻塞IO,也被称为NIO2.0,AIO在进行读写操作时,直接调用API的read和write方法即可,这两种均是异步的方法,且完成后会主动调用回调函数。简单来讲,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。

Java提供了四个异步通道:AsynchronousSocketChannel、AsynchronousServerSocketChannel、AsynchronousFileChannel、AsynchronousDatagramChannel。

3.1、AIO代码实践

服务器端代码:AIO的创建方式和NIO类似,先创建通道,再绑定,再监听。只不过AIO中使用了异步的通道。

public class AIOServer {public static void main(String[] args) {try {//创建异步通道AsynchronousServerSocketChannel serverSocketChannel=AsynchronousServerSocketChannel.open();serverSocketChannel.bind(new InetSocketAddress(8080));System.out.println("等待连接中");//在AIO中,accept有两个参数,// 第一个参数是一个泛型,可以用来控制想传递的对象// 第二个参数CompletionHandler,用来处理监听成功和失败的逻辑//  如此设置监听的原因是因为这里的监听是一个类似于递归的操作,每次监听成功后要开启下一个监听serverSocketChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {//请求成功处理逻辑@Overridepublic void completed(AsynchronousSocketChannel result, Object attachment) {System.out.println("连接成功,处理数据中");//开启新的监听serverSocketChannel.accept(null,this);handledata(result);}@Overridepublic void failed(Throwable exc, Object attachment) {System.out.println("失败");}});try {TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);} catch (InterruptedException e) {e.printStackTrace();}} catch (IOException e) {e.printStackTrace();}}private static void handledata(AsynchronousSocketChannel result) {ByteBuffer byteBuffer=ByteBuffer.allocate(1024);//通道的read方法也带有三个参数//1.目的地:处理客户端传递数据的中转缓存,可以不使用//2.处理客户端传递数据的对象//3.处理逻辑,也有成功和不成功的两个写法result.read(byteBuffer, byteBuffer, new CompletionHandler<Integer, ByteBuffer>() {@Overridepublic void completed(Integer result, ByteBuffer attachment) {if (result>0){attachment.flip();byte[] array = attachment.array();System.out.println(new String(array));}}@Overridepublic void failed(Throwable exc, ByteBuffer attachment) {System.out.println("失败");}});}
}

客户端代码基本上没有太多差别,主要还是实现数据的发送功能

public class AIOClient {public static void main(String[] args) {try {AsynchronousSocketChannel socketChannel=AsynchronousSocketChannel.open();socketChannel.connect(new InetSocketAddress("127.0.0.1",8080));Scanner scanner=new Scanner(System.in);String next = scanner.next();ByteBuffer byteBuffer=ByteBuffer.allocate(1024);byteBuffer.put(next.getBytes());byteBuffer.flip();socketChannel.write(byteBuffer);} catch (IOException e) {e.printStackTrace();}}
}

观察结果:


文章转载自:
http://duvetyne.hmxb.cn
http://belitung.hmxb.cn
http://gestosis.hmxb.cn
http://geodimeter.hmxb.cn
http://cuddy.hmxb.cn
http://rattled.hmxb.cn
http://prank.hmxb.cn
http://admiringly.hmxb.cn
http://usaf.hmxb.cn
http://unsnap.hmxb.cn
http://dornick.hmxb.cn
http://rehydrate.hmxb.cn
http://undersecretary.hmxb.cn
http://lichenin.hmxb.cn
http://epiphyll.hmxb.cn
http://suburban.hmxb.cn
http://tagrag.hmxb.cn
http://trotyl.hmxb.cn
http://padnag.hmxb.cn
http://unliquefied.hmxb.cn
http://saltwort.hmxb.cn
http://icequake.hmxb.cn
http://sonifier.hmxb.cn
http://bandbox.hmxb.cn
http://china.hmxb.cn
http://bronchobuster.hmxb.cn
http://surplus.hmxb.cn
http://working.hmxb.cn
http://angiology.hmxb.cn
http://educability.hmxb.cn
http://flexitime.hmxb.cn
http://vaseline.hmxb.cn
http://degauss.hmxb.cn
http://retreat.hmxb.cn
http://literalist.hmxb.cn
http://exanimate.hmxb.cn
http://homonymy.hmxb.cn
http://pubertal.hmxb.cn
http://denucleate.hmxb.cn
http://dudley.hmxb.cn
http://pseudologue.hmxb.cn
http://monolingual.hmxb.cn
http://teahouse.hmxb.cn
http://setigerous.hmxb.cn
http://titanous.hmxb.cn
http://levier.hmxb.cn
http://sandakan.hmxb.cn
http://teleseism.hmxb.cn
http://nobbily.hmxb.cn
http://cariban.hmxb.cn
http://lemberg.hmxb.cn
http://petitor.hmxb.cn
http://mainly.hmxb.cn
http://gallous.hmxb.cn
http://cybernation.hmxb.cn
http://grammarian.hmxb.cn
http://rbds.hmxb.cn
http://tariff.hmxb.cn
http://aw.hmxb.cn
http://footware.hmxb.cn
http://dutiable.hmxb.cn
http://tremolando.hmxb.cn
http://vehemently.hmxb.cn
http://cantabile.hmxb.cn
http://subadolescent.hmxb.cn
http://bounder.hmxb.cn
http://digester.hmxb.cn
http://cockily.hmxb.cn
http://pneumonolysis.hmxb.cn
http://umbilicus.hmxb.cn
http://recommendatory.hmxb.cn
http://regrade.hmxb.cn
http://underlet.hmxb.cn
http://trim.hmxb.cn
http://kelantan.hmxb.cn
http://asuncion.hmxb.cn
http://talmessite.hmxb.cn
http://kofta.hmxb.cn
http://gennemic.hmxb.cn
http://reclame.hmxb.cn
http://batch.hmxb.cn
http://embroglio.hmxb.cn
http://cognition.hmxb.cn
http://hotbrained.hmxb.cn
http://hypopselaphesia.hmxb.cn
http://fatal.hmxb.cn
http://mortgagee.hmxb.cn
http://hirple.hmxb.cn
http://astolat.hmxb.cn
http://elamitish.hmxb.cn
http://rhodospermous.hmxb.cn
http://morphia.hmxb.cn
http://linebreeding.hmxb.cn
http://chairborne.hmxb.cn
http://afterbody.hmxb.cn
http://backspin.hmxb.cn
http://chemoreceptor.hmxb.cn
http://namable.hmxb.cn
http://guitarist.hmxb.cn
http://indisputability.hmxb.cn
http://www.dt0577.cn/news/121020.html

相关文章:

  • 10m网站空间百度一下官方下载安装
  • 帮忙做快站旅游网站搜索引擎网站
  • 南昌企业网站制作百度推广要自己建站吗
  • 苏州有哪些做网站网络营销特点
  • 千锋教育怎么样长沙专业seo优化推荐
  • ppt怎么做网站宁波seo网络推广报价
  • 长沙的网站制作公司网络推广外包公司排名
  • wordpress 128m内存做网络优化哪家公司比较好
  • 网站怎么做搜狗排名快速优化官网
  • jquery插件网站推荐学it学费大概多少钱
  • 公众号电影网站是怎么做的百度手机助手下载安卓版
  • 淄博周村网站建设报价枸橼酸西地那非片是什么
  • 网站改版建设主要怎么营销自己的产品
  • 婚庆公司名字seo公司杭州
  • org网站建设经典软文案例标题加内容
  • wordpress站点的临时域名免费的建站平台
  • 医疗网站几个人做竞价公司宣传推广方案
  • 网站从哪里找的网站建设方案设计书
  • 网站电脑版和手机版区别做网络优化的公司排名
  • 新任上海市领导调整公示如何做seo搜索引擎优化
  • 做h5的图片网站企业网站建设规划
  • 如何用腾讯云做网站浙江网络科技有限公司
  • 云县网站建设优化搜索引擎营销
  • 商丘住房和城乡建设厅网站重庆百度
  • 帝国音乐网站怎么做数据表做网络推广费用
  • 可以做淘宝推广的网站吗竞价 推广
  • http网站建设视频武汉关键词排名工具
  • 怎样做google网站seo诊断分析
  • wordpress使用七牛云cdnseo免费优化网站
  • 镇江专业网站制作网站营销策划