BIO模型

BIO通信模型

传统的BIO模型(同步阻塞IO模型)+线程池(多线程)模式:适合活动连接次数不是特别高。该模式是1:1,即每次连接每个线程。

处理步骤:客户端发送请求,接收器Acceptor每接收一个请求,就创建一个新线程,处理完成之后,再通过输出流返回到客户端,然后销毁线程。

缺陷:一个客户端请求,就对应一个线程,客户端的请求和服务端的线程就成为1:1的比例,当请求过多的时候,线程越来越多,最后导致JVM的内存被大量的占用,堆栈溢出,发生异常。

代码演示:

public class Test0221_TCPServer {
    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket=new ServerSocket();
        serverSocket.bind(new InetSocketAddress(3333));
        try {
            while (true) {
                Socket socket = serverSocket.accept();
                System.out.println(socket.getLocalAddress() + "连接成功");
                new Thread(new Test0221(socket)).start();
            }
        }finally{
            if(serverSocket!=null)
                System.out.println("服务器关闭了");
            serverSocket.close();
        }
    }
}

public class Test0221 implements Runnable {
    private Socket socket;
    public Test0221(Socket socket){
        this.socket=socket;
    }
    @Override
    public void run() {
        try {
            while (true) {
                BufferedInputStream inputStream = new BufferedInputStream(socket.getInputStream());
                byte[] bytes = new byte[1024];
                int read = inputStream.read(bytes, 0, 1024);
                String result = new String(bytes, 0, read);
                System.out.println(">>>" + result);
            }
        } catch(IOException e){
                e.printStackTrace();
        }
    }
}
public class Test0221_TCPClient {
    public static void main(String[] args) throws IOException {
        Socket socket=new Socket();

        socket.connect(new InetSocketAddress("127.0.0.1",3333));

        Scanner scanner=new Scanner(System.in);
        scanner.useDelimiter("\n");
        String nsg;
        BufferedOutputStream outputStream=new BufferedOutputStream(socket.getOutputStream());
        while (scanner.hasNext()){
            nsg=scanner.nextLine();
            outputStream.write((nsg+"\n").getBytes());
            outputStream.flush();
        }
        outputStream.close();
        socket.close();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40303781/article/details/87918173
BIO
今日推荐