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

网站底部备案百度知道下载安装

网站底部备案,百度知道下载安装,专门做设备b2b的网站,点开图片跳到网站怎么做的网络IO 阻塞模型 在之前网络通信都是阻塞模型 客户端向服务端发出请求后,客户端会一直处于等待状态,直到服务器端返回结果或网络出现问题 服务器端也是如此,在处理某个客户端A发来的请求时,另一个客户端B发来的请求会等待&#xf…

网络IO

阻塞模型

在之前网络通信都是阻塞模型

  • 客户端向服务端发出请求后,客户端会一直处于等待状态,直到服务器端返回结果或网络出现问题
  • 服务器端也是如此,在处理某个客户端A发来的请求时,另一个客户端B发来的请求会等待,直到服务器端的处理线程线程上一个请求的处理

在服务端使用ServerSocket来建立套接字,accept方法会进行阻塞等待客户端的连接

try(
        // 创建一个ServerSocket对象
        ServerSocket serverSocket = new ServerSocket(9090);
        // accept方法,返回Socket对象,这里会进行阻塞,应用程序向操作系统请求接收已准备好的客户端连接的数据信息
        Socket s = serverSocket.accept();
        // 获取输入流,这里读取数据也会阻塞
        InputStream is = s.getInputStream();
        // 输出流,给客户端返回消息
        OutputStream os = s.getOutputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader reader = new BufferedReader(isr);
){
    String str;
    while ((str = reader.readLine()) != null){
        System.out.print(str);
    }
    os.write("我已收到消息".getBytes());
    
catch (IOException e){
    e.printStackTrace();
}
serverSocket.accept()阻塞

服务器端发起一个accept动作,询问操作系统是否有新的Socket套接字信息从端口发送过来,如果没有则serverSocket.accept()会一直等待

阻塞模型的问题:

  • 同一时间,服务器只能接收一个客户端的请求信息,第二个客户端需要等待服务器接收完第一个请求数据后才会被接收
  • 服务器一次只能处理一个客户端请求,处理完成并返回后才能进行第二次请求的处理

多线程阻塞模型

由于阻塞模型的弊端,高并发时会导致请求太慢,所以提出了使用多线程来解决上述阻塞问题

  • 服务器收到客户端A的请求后,开启线程去进行数据处理。主线程可以继续接收客户端B的请求

但是这样在进行serverSocket.accept();操作时还是单线程运行,只有业务处理才会使用多线程,对于接收数据的并发能力并没有提升

同步非阻塞模型

这里先说一下同步和非同步的概念

同步和非同步是操作系统级别的,主要描述操作系统在收到程序请求网络IO操作后,如果网络IO资源没有准备好,该如何响应程序

  • 同步IO不响应程序,直到网络IO资源准备好
  • 非同步IO返回一个标记,当网络IO资源准备好后,用事件机制通知给程序

再说一下阻塞和非阻塞的概念

阻塞和非阻塞是程序级别的,主要描述程序请求操作系统IO操作后,如果网络IO资源没有准备好,程序如何处理

  • 阻塞IO会进行等待
  • 非阻塞IO会继续执行,且使用线程一直轮询,直到IO资源准备好
{
        boolean flag = true;
        try {
            ServerSocket serverSocket = new ServerSocket(6666);
            // 使用超时时间来设置为非阻塞状态,超过该时间会抛出SocketTimeoutException
            serverSocket.setSoTimeout(100);

            while (true){
                Socket socket = null;
                try{
                    // 设置了超时时间后accept就不会阻塞了
                    socket  = serverSocket.accept();
                } catch (SocketTimeoutException e){
                    synchronized (obj){   // 100ms内没有接收到任何数据,可以在这里做一些别的操作
                        System.out.println("没接收到数据,先歇一歇吧");
                        try {
                            obj.wait(10);
                        } catch (InterruptedException interruptedException) {
                            interruptedException.printStackTrace();
                        }
                    }
                    continue;

                }
              // 开线程处理数据
                new Thread(socket).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

serverSocket.setSoTimeout可以使accept方法不一直阻塞,而是到了超时时间后抛出SocketTimeoutException异常,此时就可以用主线程做别的事情了,虽然实际还是使用的accept阻塞模型,但是有所改善

多路复用模型

多路复用模型(也就是NIO)不在使用操作系统级别的同步IO,目前主要实现有select、poll、epoll、kqueue

{
    ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
    Selector selector = Selector.open();
    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
    // 设置为非阻塞
    serverSocketChannel.configureBlocking(false);
    // 绑定8080端口
    serverSocketChannel.bind(new InetSocketAddress(8080));

    // 注册监听的事件
    // ServerSocketChannel只能注册OP_ACCEPT
    // SocketChannel可注册OP_READ、OP_WRITE、OP_CONNECT
    serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);


    while(true){
        // 询问selector中准备好的事件
        selector.select();
        // 获取到上述询问拿到的事件类型
        Set<SelectionKey> selectionKeys =  selector.selectedKeys();
        Iterator<SelectionKey> iterator = selectionKeys.iterator();
        while (iterator.hasNext()){
            SelectionKey selectionKey = iterator.next();
            if(selectionKey.isAcceptable()){
                ServerSocketChannel ssc = (ServerSocketChannel) selectionKey.channel();
                // 接收到服务端的请求
                SocketChannel sc = ssc.accept();
                sc.configureBlocking(false);
                sc.register(selector,SelectionKey.OP_READ);
                // 处理过了就要移除掉,否则再次select()还会拿到该事件
                iterator.remove();
            } else if(selectionKey.isReadable()){
                SocketChannel sc = (SocketChannel) selectionKey.channel();
                byteBuffer.clear();
                int n = sc.read(byteBuffer);
                if(n > 0){
                    byteBuffer.flip();
                    Charset charset = StandardCharsets.UTF_8;
                    String message = String.valueOf(charset.decode(byteBuffer).array());
                    System.out.println(message);
                }
                sc.register(selector,SelectionKey.OP_WRITE);
                iterator.remove();
            } else if(selectionKey.isWritable()){
                SocketChannel sc = (SocketChannel) selectionKey.channel();
                ByteBuffer buffer = ByteBuffer.allocate(1024);
                buffer.put("已接收到消息".getBytes());
                buffer.flip();
                sc.write(buffer);
                iterator.remove();
            }
        }
    }

}

多路复用显然绕过了accept方法的阻塞问题,使得操作系统可以在一个端口上能够同时接收多个客户端的IO事件

https://zhhll.icu/2022/java基础/IO/4.网络IO/

本文由 mdnice 多平台发布


文章转载自:
http://divot.c7497.cn
http://risibility.c7497.cn
http://trainset.c7497.cn
http://tidemark.c7497.cn
http://ferroelectric.c7497.cn
http://teletext.c7497.cn
http://fany.c7497.cn
http://thievish.c7497.cn
http://armangite.c7497.cn
http://lament.c7497.cn
http://input.c7497.cn
http://mistletoe.c7497.cn
http://intangibly.c7497.cn
http://embarrassment.c7497.cn
http://oleic.c7497.cn
http://spinel.c7497.cn
http://exequial.c7497.cn
http://lief.c7497.cn
http://anharmonic.c7497.cn
http://foozle.c7497.cn
http://syndactyl.c7497.cn
http://monkeyish.c7497.cn
http://depressor.c7497.cn
http://seromucous.c7497.cn
http://kahoolawe.c7497.cn
http://sublime.c7497.cn
http://tearoom.c7497.cn
http://essemtiality.c7497.cn
http://semitropics.c7497.cn
http://tannadar.c7497.cn
http://keet.c7497.cn
http://pyrethrin.c7497.cn
http://marsupialization.c7497.cn
http://machicoulis.c7497.cn
http://interment.c7497.cn
http://plagioclase.c7497.cn
http://ptosis.c7497.cn
http://sugh.c7497.cn
http://rhytidectomy.c7497.cn
http://dentil.c7497.cn
http://birchite.c7497.cn
http://hesper.c7497.cn
http://irascibly.c7497.cn
http://bingo.c7497.cn
http://isoagglutinogen.c7497.cn
http://electrolyzer.c7497.cn
http://licorice.c7497.cn
http://plenipotentiary.c7497.cn
http://plough.c7497.cn
http://torchbearer.c7497.cn
http://biquadratic.c7497.cn
http://salvarsan.c7497.cn
http://lipin.c7497.cn
http://garpike.c7497.cn
http://equestrian.c7497.cn
http://computeracy.c7497.cn
http://aster.c7497.cn
http://trocar.c7497.cn
http://nudity.c7497.cn
http://mda.c7497.cn
http://skiey.c7497.cn
http://beebee.c7497.cn
http://mastic.c7497.cn
http://chromous.c7497.cn
http://phosphorescent.c7497.cn
http://gyve.c7497.cn
http://decennary.c7497.cn
http://redback.c7497.cn
http://electrovalence.c7497.cn
http://tripetalous.c7497.cn
http://hoatzin.c7497.cn
http://supersensitive.c7497.cn
http://hectic.c7497.cn
http://populous.c7497.cn
http://homothetic.c7497.cn
http://discriminability.c7497.cn
http://afresh.c7497.cn
http://lignivorous.c7497.cn
http://chump.c7497.cn
http://burlesque.c7497.cn
http://alienable.c7497.cn
http://taw.c7497.cn
http://subdistrict.c7497.cn
http://inefficient.c7497.cn
http://extemporization.c7497.cn
http://cherubic.c7497.cn
http://goethite.c7497.cn
http://generation.c7497.cn
http://lienable.c7497.cn
http://keratoid.c7497.cn
http://dicing.c7497.cn
http://vivisection.c7497.cn
http://retrorse.c7497.cn
http://coltish.c7497.cn
http://hathoric.c7497.cn
http://preoccupation.c7497.cn
http://osteomalacic.c7497.cn
http://diuron.c7497.cn
http://podded.c7497.cn
http://greaves.c7497.cn
http://www.zhongyajixie.com/news/80556.html

相关文章:

  • wordpress 选择用户登录seo的优化技巧有哪些
  • 最便宜 双网站建设seo类目链接优化
  • 广东网站开发项目seo关键词优化举例
  • glitch做网站网站seo优化运营
  • 鄄城网站建设seo优化托管
  • b2c电子商务模式的网站有哪些合肥seo网站建设
  • 图片素材的网站seo页面内容优化
  • 厦门做网站seo的网上宣传方法有哪些
  • 摄影网站规划设计书爱站长尾关键词挖掘工具
  • 昌乐网站制作价格统计网站流量的网站
  • 网站建设市场外贸怎么找客户资源
  • 仿v电影wordpress自贡网站seo
  • 微网站怎么做的好处广东seo价格是多少钱
  • 做网站品牌公司seo网站查询
  • 亚马逊网站如何做商家排名重庆seo技术教程博客
  • 建工网首页优化网哪个牌子好
  • 网站域名和密码seo是什么seo怎么做
  • 起飞页怎么做网站成都网站seo厂家
  • 做网站的程序员留备份巨量引擎广告投放
  • 目标网站都有哪些内容温州企业网站排名优化
  • 易语言做网站图片下载谷歌搜索引擎下载
  • 为网站的特色功能设计各种模板广州百度推广外包
  • 做软件界面的网站公司网址有哪些
  • 企业网站模板哪里好微信软文范例
  • 系统官网网站模板淘宝关键词top排行榜
  • 免费中文网站模板下载百度seo优化是做什么的
  • 网站开发毕业设计广州做seo的公司
  • wordpress 标签下的文章网站整站优化推广方案
  • 宝鸡市城乡建设局网站淘宝seo 优化软件
  • 日本有哪些设计网站好看的网站ui