栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021-11-08

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-11-08

java IO模型 BIO模型:一请求一连接的通信模型 图解


  1. 模型问题:缺乏弹性伸缩连接,当客户端并发访问量增加后,服务端的线程个数是和客户端访问并发数呈1:1的关系,由于服务器资源有限,当线程膨胀后,系统性能急剧下降,发发生堆栈溢出、创建新线程失败等问题,最终导致宕机,
NIO模型:服务器实现模式为1个线程处理多个连接请求,通过选择器维护多个连接

package bio;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;

public class BioServer {
    public static void main(String[] args) throws IOException {
        //创建线程池
        ExecutorService newcatchTreadPool  = Executors.newCachedThreadPool();
        ServerSocket serverSocket = new ServerSocket(666);
        System.out.println("服务器启动");

        while (true){
            System.out.println("等待socket连接");
            Socket socket = serverSocket.accept(); //阻塞  未连接时会一直阻塞在这个
            System.out.println("客户端连接socket成功");
            //创建线程与客户端通信
            newcatchTreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    //可以与客户端通信
                    try {
                        hander(socket);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
        }



    }
    //编写hander处理通讯
    public static void  hander(Socket socket) throws IOException {
        try {
            System.out.println("线程信息"+ Thread.currentThread().getId()+"线承名字"+Thread.currentThread().getName());
            byte[] bytes  =new byte[1024];
            //通过socket获得输入流
            InputStream inputStream =socket.getInputStream();
            while (true){
                System.out.println("read..........");
                int read = inputStream.read(bytes);//阻塞  连接后没有发数据会阻塞这路
                if(read != -1){
                    System.out.println(new  String(bytes,0,read));
                }else{
                    break;
                }
            }

        }catch (IOException e){
            socket.close();
    }
    }
}


主线程等待客户端接,并分配子线程

NIO模型 buffer和channel进行数据双向读写,nio通过buffer实现非阻塞,面向缓存区编程。


selecter管理多个通道,可以获取到通道的事件(用一个线程处理多个连接)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/459648.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号