javaNIO笔记

javaNIO

同步阻塞式IO:一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不做任何事情就会造成不必要的线程开销。JDK1.4以前的传统IO。相关的类和接口在java.io中
场景分析:适用于连接数目比较少且固定的架构,这种方式对于服务器资源要求较高,并发局限于应用中。
图例:

实现单服务端-客户端通信

  • BIOClient.java 客户端
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class BIOClient {

    public static void main(String[] args) {
        //读取键盘输入
        Scanner sn = new Scanner(System.in);

        try {
            //获取服务端socket连接
            Socket client = new Socket("127.0.0.1", 9999);
            String msg;
            while (sn.hasNext()){
                //循环读取键盘输入行数据
                msg = sn.nextLine();

                //获取socket流通道
                OutputStream outputStream = client.getOutputStream();

                //使用打印流 往通道中输入数据
                PrintStream printStream = new PrintStream(outputStream);
                printStream.println(msg);
                printStream.flush();

//                printStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
            sn.close();
        }
    }
}
  • BIOServer.java 服务端
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class BIOServer {

    public static void main(String[] args) {

        try {
            //创建socket服务端
            ServerSocket server = new ServerSocket(9999);
            //监听客户端连接 获取socket对象
            Socket socket = server.accept();
            
            //获取客户端输入流
            InputStream inputStream = socket.getInputStream();
            
            //使用缓冲字符流读取数据
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
            String msg;
            while ( (msg = br.readLine()) !=null){
                System.out.println(msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

但是上面的只能应用于单客户端,如果想实现多个客户端连接一个服务端,那么就需要对服务端进行改造,因为是单线程监听客户端,如果要服务端监听多个客户端,就需要用多线程进行监听并连接

多客户端连接服务端

  • BIOServerForMoreClient.java 服务端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class BIOServerForMoreClient {

    public static void main(String[] args) {

        try {
            //创建服务端
            ServerSocket server = new ServerSocket(9999);

            while (true){
                //循环监听
                Socket socket = server.accept();
          
                //如果监听到了客户端 则新启线程进行处理
                if (socket!=null){
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                 //同上 通过字符缓冲流包装客户端输入流读取数据
                                InputStream inputStream = socket.getInputStream();

                                BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));

                                String msg;
                                while ((msg = br.readLine())!=null){
                                    System.out.println(msg);
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }).start();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用IDEA可以启动多个客户端来连接服务端,同一个类启动多个主线程需要开启

  • Edit configurations -> allow parallel run 勾选
  • 没有设置该属性可以开启 Edit configurations ->Modify options ->allow multiple instances 勾选
    相关截图:

注:此笔记来自博主学习javaIO后编写,转载请注明出处,网站:哔哩哔哩:黑马Java-IO模式精讲

posted @ 2022-07-10 11:04  ch-一念之间  阅读(28)  评论(0)    收藏  举报