• Java Bio


    1.简述

      JAVA BIO是同步并阻塞,阻塞主要是针对网络IO也就是Socket IO。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。 

    2.BIO实现

    (1)服务器实现如下

    /**测试类
     */
    public class Test{
        public static void main(String[] args) throws IOException {
            int Port = 7777;
            ServerSocket serverSocket = null;
            BufferedWriter bw = null;
            try {
                //1.创建服务器对象,并传入端口
                serverSocket = new ServerSocket(Port);
                System.out.println("服务器已启动!正在监听端口"+Port);
                while (true){
                    //2.从连接请求队列中取出一个客户连接
                    Socket socket = serverSocket.accept();
                    System.out.println("客户端 "+socket.getPort()+" 已连接");
                    //3.创建缓冲区输入流,读取客户传递数据
                    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    //4.创建缓存区输出流
                    bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                    //5.读取客户端传递的数据并回复
                    String message = br.readLine();
                    if (message != null){
                        System.out.println("收到一条来自客户端 "+socket.getPort()+" 发送的消息:"+message);
                    }
                    //加了
     readLine才能生效
                    bw.write("你才是" + message + "
    ");
                    bw.flush(); //清理缓冲区
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(bw != null){
                    try {
                        bw.close();
                        System.out.println("服务器挂掉了。。再见");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    View Code

    (2)客户端实现如下

    public class Test2{
        public static void main(String[] args) {
            String Host = "127.0.0.1";
            final int Port = 7777;
            BufferedWriter bw = null;
            try {
                //1.创建客户端对象,并指定连接的服务器ip和端口
                Socket socket = new Socket(Host,Port);
                //2.创建缓冲区输入流,读取服务器传递数据
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                //3.创建缓存区输出流
                bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                //4.获取控制台输入数据    
                BufferedReader cs = new BufferedReader(new InputStreamReader(System.in));
                //5.把控制台输入数据发送给服务器
                String message = cs.readLine();
                bw.write(message+"
    ");
                bw.flush();
                //6.读取服务器回复
                String responseMsg = br.readLine();
                System.out.println("收到了来自服务器的回复:" + responseMsg);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(bw != null){
                    try {
                        bw.close();
                        System.out.println("客户端关闭了连接");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    View Code

    (3)总结

      BIO服务器有一个接受请求的主线程和工作线程池组成。每个请求对应一个线程。IO操作和业务操作都有工作线程处理。优点是线程模型简单,程序编写简单。缺点是一个连接对应一个线程,线程资源创建过多,较为浪费。

  • 相关阅读:
    柱状图 highcharts 柱状图默认是显示的 Heighcharts.com 的版权。设置去掉不显示(非商业)
    eclipse下使用maven配置库托管jar包
    Java的云打印Lodop
    文本框限制输入类型<input>的输入框
    初次使用JFinal
    【原创】java实现两单链表相加求和
    【原创】Springboot的Filter拦截器中使用@value获取值为null
    【原创】Oracle主从同步---创建物理备份数据库[Creating a Physical Standby Database]
    【原创】基于Telnet协议的Jenkins远程部署
    【原创】FastDFS简单安装配置-----同一台机器测试
  • 原文地址:https://www.cnblogs.com/bl123/p/13803530.html
Copyright © 2020-2023  润新知