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

本文介绍了Java中的BIO阻塞模型,详细阐述了服务端如何等待客户端连接并进行全双工通信的过程。通过代码解析展示了服务器和客户端的实现,包括使用BufferedReader和BufferedWriter进行数据交换。最后,给出了服务器和客户端的运行结果,展示了简单的交互过程。
摘要由CSDN通过智能技术生成

1.BIO阻塞模型

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

简述BIO模型中服务端与客户端的响应过程

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

2.代码解析

在这里插入图片描述

这里的BufferedReader运用了装饰器模式,包裹在另外一个输入数据流之上,

在这里插入图片描述在这里插入图片描述

3. 简单实战演示

3.1 服务器

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

public class Server {

    public static void main(String[] args) {

        final String QUIT="quit";
       //服务器端监听端口8888
        final int DEFAULT_PORT=8888;
        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()+"]已经连接");
                //BufferedReader创建一个缓冲区,降低直接访问数据源的频率
                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+"\n");
                     //flush缓冲区所有数据全部发送出去
                     writer.flush();

                     //查看用户是否退出
                    if(QUIT.equals(msg)){
                        System.out.println("客户端["+socket.getPort()+"]已断开链接");
                        break;
                    }
                }

            }
        }catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(serverSocket != null){
                try {
                    serverSocket.close();
                    System.out.println("服务器端关闭serverSocket");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


3.2 客户端

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

public class Client {
    public static void main(String[] args) {

        final String QUIT="quit";
        //服务器端主机地址
             final String DEFAULT_SERVER_HOST="127.0.0.1";
        //端口号
             final int DEFAULT_SERVER_PORT=8888;
             Socket socket=null;
             BufferedWriter writer=null;

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

            //创建IO流
            BufferedReader reader=new BufferedReader(
             new InputStreamReader(socket.getInputStream())
            );

             writer=new BufferedWriter(
              new OutputStreamWriter(socket.getOutputStream())
            );

            //等待用户输入信息
           BufferedReader consoleReader=
                   new BufferedReader(new InputStreamReader(System.in)
                   );
            while (true) {
                String input=consoleReader.readLine();

                //发行消息给服务器
                writer.write(input+"\n");
                writer.flush();

                //读取服务器返回的消息
                String msg=reader.readLine();
                System.out.println(msg);

                //查看用户是否退出
                if(QUIT.equals(input)){
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                writer.close();
                System.out.println("关闭客户端socket");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }

}

3.3 响应结果

Server运行结果
在这里插入图片描述

Client运行结果
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值