同步阻塞IO模型
思考集结处 2021-11-12 网络
有上篇IO
模型中的,同步阻塞IO
模型,我们能够知道,用户线程发起请求后就一直阻塞的等待
内核完成准备数据、数据拷贝的工作。并且返回成功的指示。
# 实现
使用java
来实现同步阻塞IO
模型,即我们所说的BIO
的模型
# 客户端实现
/**
* @author:triumphxx
* @Date:2021/10/12
* @Time:10:29 下午
* @微信公众号:北漂码农有话说
* @网站:http://blog.triumphxx.com.cn
* @GitHub https://github.com/triumphxx
* @Desc: BIO网络编程模型客户端
**/
public class BIOClient {
public static void main(String[] args) {
try {
//连接服务端
Socket socket = new Socket("localhost",9000);
//准备给服务端发送的信息
socket.getOutputStream().write("hello server".getBytes());
//开始发送信息
socket.getOutputStream().flush();
System.out.println("客户端信息发送完成");
byte[] bytes = new byte[1024];
socket.getInputStream().read(bytes);
System.out.println("服务端返回的信息为:"+new String(bytes));
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
由代码可以看出来,客户端的代码非常简单,即建立连接、发送信息、接收信息
# 服务端实现
/**
* @author:triumphxx
* @Date:2021/10/12
* @Time:10:29 下午
* @微信公众号:北漂码农有话说
* @网站:http://blog.triumphxx.com.cn
* @GitHub https://github.com/triumphxx
* @Desc: BIO网络编程模型服务端
**/
public class BIOServer {
public static void main(String[] args) throws IOException {
//创建一个Socket服务
ServerSocket serverSocket = new ServerSocket(9000);
//创建线程池
ExecutorService executorService = Executors.newCachedThreadPool();
//服务端启动后等待着客户端的请求
while (true){
System.out.println("等待连接");
//阻塞的方法,等待连接
final Socket socket = serverSocket.accept();
System.out.println("有客户端的连接进来了");
//BIO的特点,每进来一个客户端的请求都需要创建线程去处理
executorService.execute(new Runnable() {
@Override
public void run() {
dealMessage(socket);
}
});
}
}
public static void dealMessage(Socket socket) {
System.out.println("线程名称为" + Thread.currentThread().getName());
System.out.println("开始读取信息");
try {
byte[] bytes = new byte[1024];
InputStream inputStream = socket.getInputStream();
inputStream.read(bytes);
System.out.println("接收到客户端的信息为:"+new String(bytes));
socket.getOutputStream().write("客户端你好,接收到了你的信息".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
有服务端的代码,我们可以看到,服务端每接收一个请求就得线程池分配一个线程去处理这个请求。 每一行代码的意思,作者都已经进行表明。
# 优点及缺点
优点:编程模型简单 缺点:需要大量线程,可靠性差,吞吐量差,阻塞
# 适用场景
适用于连接比较少且比较固定的场景,编程模型最简单
# 小结
以上就是java
的BIO
编程模型,很简单的一个小例子,希望对你有所帮助。代码传送门