传统BIO的缺点/NIO的设计理念 使用NIO实现并发Demo

传统BIO的缺点:

  1. 在accept的时候会作出放弃CPU的操作 线程阻塞
  2. 在socket.getInputStream.read();的时候会造成线程阻塞
  3. BIO想实现并发需要采用多线程的方式 但是多线程有很多缺点(最大的缺点:消耗程序资源)

传统BIO服务器NetServer.class代码

public class NetServer {

    static byte []bytes=new byte[1024];
    public static void main(String[] args) {

        try {
            ServerSocket serverSocket=new ServerSocket(9098);
            while (true) {
                System.out.println("accept wait coon");
                Socket socket = serverSocket.accept();
                System.out.println("conn success");
                System.out.println("read wait conn");
                //放弃CPU
                int read = socket.getInputStream().read(bytes);
                System.out.println(read+"========这是read的长度");
                System.out.println("data success");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

传统BIO客户端NetClient.class代码

public class NetClient {
    public static void main(String[] args) {
        try {
            Socket socket=new Socket("127.0.0.1",9098);
            Scanner scanner=new Scanner(System.in);
            String next = scanner.next();
            socket.getOutputStream().write(next.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

NIO的设计理念: 使用单线程实现高并发
针对传统BIO的缺点,sun公司推出了NIO

Nio Demo

package crawler.Socket;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName NioTemp
 * @Description TODO
 * @Author XuWenXiao
 * @Date 2020/5/15 9:47
 * @Version 1.0
 **/
public class NioTemp {
    static ByteBuffer byteBuffer=ByteBuffer.allocate(512);
    static List<SocketChannel> socketChannels=new ArrayList<SocketChannel>();
    public static void main(String[] args) {
        try {
            ServerSocketChannel serverSocket=ServerSocketChannel.open();
            SocketAddress socketAddress=new InetSocketAddress("127.0.0.1",9098);
            serverSocket.bind(socketAddress);
            //设置accept为非阻塞
            serverSocket.configureBlocking(false);
            while (true){
                for (SocketChannel socketChannel : socketChannels) {
                    int read=socketChannel.read(byteBuffer);
                    if (read>0){
                        System.out.println(read+"读取到数据的长度 read ");
                        byteBuffer.flip();
                        byte[]bytes=new byte[read];
                        byteBuffer.get(bytes);
                        String s=new String(bytes);
                        System.out.println(s);
                        byteBuffer.flip();
                    }
                }
                SocketChannel accept=serverSocket.accept();
                if (accept!=null){
                    System.out.println("conn success");
                    //设置read 操作为非阻塞
                    accept.configureBlocking(false);
                    socketChannels.add(accept);
                    System.out.println(socketChannels.size()+"打印集合的长度 socketChannels.size()");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43565087/article/details/106136223
今日推荐