一站式学习Java网络编程 全面理解BIO_NIO_AIO,学习手记(三)

大家好,我是方圆
这里的知识还挺简单的


1. BIO阻塞模型

在这里插入图片描述
简述BIO模型中服务端与客户端的响应过程

  1. 服务器serverSocket先要和端口进行绑定
  2. 绑定完成后,执行accept方法,等待客户端的连接,这个方法是阻塞式调用,也就是说,要一直等待客户端的连接响应,不做其他事情,一直等,(被阻塞的还有InputStream.read()、OutputStream.write(),这两个也会一直等待客户端的响应)
  3. 客户端创建Socket对象,绑定服务器的ip地址端口号,与服务器进行连接
  4. 服务器接收到客户端的连接请求,accept方法获取到客户端的socket信息,连接成功
  5. 服务器与客户端创建各自的io流,实现全双工通信
  6. 之后便可以随时结束连接

2. 简单实战演示

2.1 服务器

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
    
    
    public static void main(String[] args) {
    
    
        final int DEFAULT_PORT = 8888;
        final String QUIT = "quit";
        ServerSocket serverSocket = null;

        try {
    
    
            //绑定端口号
            serverSocket = new ServerSocket(DEFAULT_PORT);
            System.out.println("服务器已经启动,绑定端口号:" + DEFAULT_PORT);

            while (true){
    
    
                //等待客户端的连接
                Socket socket = serverSocket.accept();
                System.out.println("客户端" + socket.getPort() + ":" + "已经连接");

                //获取io流
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(socket.getInputStream())
                );
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(socket.getOutputStream())
                );

                //读取客户发送的信息
                String msg = null;
                while ((msg = reader.readLine()) != null) {
    
    
                    System.out.println("客户端" + socket.getPort() + ":" + msg);
                    //回复消息
                    writer.write( msg + " ok" +"\n");
                    writer.flush();
                    System.out.println("服务器:" + msg + " ok");

                    if(msg.equals(QUIT)){
    
    
                        System.out.println("客户端" + socket.getPort() + ":断开连接" );
                        break;
                    }
                }
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }finally {
    
    
            if(serverSocket != null){
    
    
                try {
    
    
                    serverSocket.close();
                    System.out.println("服务器Socket关闭");
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
        }
    }
}

2.2 客户端



import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
    
    
    public static void main(String[] args) {
    
    
        final int DEFAULT_SERVER_PORT = 8888;
        final String DEFAULT_ADDRESS = "127.0.0.1";
        final String QUIT = "quit";

        Socket socket = null;
        BufferedWriter writer = null;

        try {
    
    
            //创建Socket
            socket = new Socket(DEFAULT_ADDRESS,DEFAULT_SERVER_PORT);

            //创建io流
            writer = new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream())
            );
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(socket.getInputStream())
            );

            //等待用户输入信息
            while (true) {
    
    
                BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
                String msg = consoleReader.readLine();
                //向服务器发送消息
                writer.write(msg + "\n");
                writer.flush();
                System.out.println("客户端"+ ":" + msg);
                String line = reader.readLine();
                System.out.println("服务器:" + line);
                //退出判断
                if(msg.equals(QUIT)){
    
    
                    break;
                }
            }
        } catch (UnknownHostException e) {
    
    
            e.printStackTrace();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }finally {
    
    
            if(writer != null){
    
    
                try {
    
    
                    writer.close();
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
        }

    }
}

2.3 响应结果

  • 客户端
    在这里插入图片描述
  • 服务器
    在这里插入图片描述

3. 加深理解

在这里插入图片描述


赶赶单单!

猜你喜欢

转载自blog.csdn.net/qq_46225886/article/details/107469924