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);
                }
                //加了\n readLine才能生效
                bw.write("你才是" + message + "\n");
                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+"\n");
            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操作和业务操作都有工作线程处理。优点是线程模型简单,程序编写简单。缺点是一个连接对应一个线程,线程资源创建过多,较为浪费。

posted on 2020-10-12 17:09  码农记录  阅读(126)  评论(0)    收藏  举报

导航