“BIO”的版本间的差异
		
		
		
		
		
		跳到导航
		跳到搜索
		
				
		
		
	
Jihongchang(讨论 | 贡献)  (建立内容为“BIO 是最传统的<u>同步阻塞</u> IO 模型,服务端的实现是一个连接只有一个线程处理,线程在发起请求后,会等待连接返回。…”的新页面)  | 
				Jihongchang(讨论 | 贡献)   | 
				||
| 第9行: | 第9行: | ||
阻塞:发起者在发起 IO 操作后,不能再处理其他业务,只能等待 IO 操作结束。  | 阻塞:发起者在发起 IO 操作后,不能再处理其他业务,只能等待 IO 操作结束。  | ||
| + | 见:[[同步与异步、阻塞与非阻塞]]  | ||
| + | |||
| + | 常见的同步阻塞 IO 访问代码如下:<syntaxhighlight lang="java">  | ||
| + | package io.github.jihch.bio;  | ||
| + | import java.io.IOException;  | ||
| + | import java.net.ServerSocket;  | ||
| + | import java.net.Socket;  | ||
| + | |||
| + | public class BIOTest {  | ||
| + | |||
| + |     public static void main(String[] args) {  | ||
| + | |||
| + |         ServerSocket server = null;  | ||
| + | |||
| + |         try {  | ||
| + |             server = new ServerSocket(8088);  | ||
| + |             while (true) {  | ||
| + | |||
| + |                 Socket socket = server.accept();  | ||
| + | |||
| + |                 //创建一个线程处理 server.accept 产生的 socket 链路  | ||
| + |                 new Thread(new SocketHandler(server.accept())).start();  | ||
| + |             }  | ||
| + | |||
| + |         } catch (IOException e) {  | ||
| + |             e.printStackTrace();  | ||
| + | |||
| + |         } finally {  | ||
| + |             if (server != null) {  | ||
| + |                 try {  | ||
| + |                     server.close();  | ||
| + |                 } catch (IOException e) {  | ||
| + |                     e.printStackTrace();  | ||
| + |                 }  | ||
| + |             }  | ||
| + |         }  | ||
| + | |||
| + | |||
| + |     }  | ||
| + | |||
| + | }  | ||
| + | </syntaxhighlight>  | ||
| + | |||
| + | |||
| + | |||
| + | 对于每个线程而言,它们内部的实现都使用了阻塞的调用方式,核心代码如下所示:<syntaxhighlight lang="java">  | ||
| + | package io.github.jihch.bio;  | ||
| + | import java.io.IOException;  | ||
| + | import java.io.InputStream;  | ||
| + | import java.net.Socket;  | ||
| − | + | public class SocketHandler implements Runnable {  | |
| + | |||
| + |     private Socket socket;  | ||
| + | |||
| + |     public SocketHandler(Socket socket) {  | ||
| + |         this.socket = socket;  | ||
| + |     }  | ||
| + | |||
| + |     @Override  | ||
| + |     public void run() {  | ||
| + |         try {  | ||
| + |             InputStream is = socket.getInputStream();  | ||
| + |             byte[] b = new byte[1024];  | ||
| + |             while (true) {  | ||
| + |                 //使用 read 阻塞读  | ||
| + |                 int data = is.read(b);  | ||
| + |                 if (data != -1) {  | ||
| + |                     //处理读取到的数据  | ||
| + |                     System.out.println(b);  | ||
| + |                 } else {  | ||
| + |                     break;  | ||
| + |                 }  | ||
| + |             }  | ||
| + |         } catch (IOException e) {  | ||
| + |             e.printStackTrace();  | ||
| + |         }  | ||
| + |     }  | ||
| + | }  | ||
| + | </syntaxhighlight>  | ||
2023年5月8日 (一) 02:59的最新版本
BIO 是最传统的同步阻塞 IO 模型,服务端的实现是一个连接只有一个线程处理,线程在发起请求后,会等待连接返回。
此处的“同步阻塞”是在 IO 语境下的概念:
同步:发起一个 IO 操作时,在没有得到结果之前,该操作不返回结果,只有调用结束后,才能获取返回值并继续执行后续的操作。
阻塞:发起者在发起 IO 操作后,不能再处理其他业务,只能等待 IO 操作结束。
常见的同步阻塞 IO 访问代码如下:
package io.github.jihch.bio;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class BIOTest {
    public static void main(String[] args) {
        ServerSocket server = null;
        try {
            server = new ServerSocket(8088);
            while (true) {
                Socket socket = server.accept();
                //创建一个线程处理 server.accept 产生的 socket 链路
                new Thread(new SocketHandler(server.accept())).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (server != null) {
                try {
                    server.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
对于每个线程而言,它们内部的实现都使用了阻塞的调用方式,核心代码如下所示:
package io.github.jihch.bio;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class SocketHandler implements Runnable {
    private Socket socket;
    public SocketHandler(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            byte[] b = new byte[1024];
            while (true) {
                //使用 read 阻塞读
                int data = is.read(b);
                if (data != -1) {
                    //处理读取到的数据
                    System.out.println(b);
                } else {
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}