Java Bio编程

IO模型

基本说明
  1. io模型就是数据的发送与接收,这个直接决定了程序之间通信的效率
  2. Java的网络编程常见三种Io分别是:bio,nio,aio
  3. Bio:阻塞并且同步,服务器实现一个连接对应一个线程,如果这个连接阻塞,那么就芭比扣了,别的事都没做了。
    在这里插入图片描述

Nio:非阻塞并同步,服务器实现多个连接对应一个线程,采用了轮询的方式复用io,如果这个连接阻塞,问题不大,线程还能去做别的事情。
在这里插入图片描述
aio:异步非阻塞

BIO

BIO工作原理

在这里插入图片描述

基本流程

服务端启动一个socket -> 对每一个客户启动一个线程 -> 工作,如果没有响应就会被阻塞。

bio案例

编写一个伪服务器,端口号8888。当有客户端来的时候,启动一个线程去处理。

public class BioDemo {
	public static void main(String[] args) throws Exception{
		ExecutorService executorService = Executors.newCachedThreadPool();
		// ServerSocket
		ServerSocket serverSocket = new ServerSocket(8888);
		System.out.println("------服务器已经启动------");
		while (true){
			// 阻塞式
			System.out.println("------等待客户端连接------");
			Socket socket = serverSocket.accept();
			System.out.println("------已经连接到客户端------");
			System.out.println("------");
			executorService.submit(()->{
				try {
					doSomething(socket);
				} catch (IOException e) {
					e.printStackTrace();
				}finally {
					try {
						socket.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			});
		}
	}
	
	public static void doSomething (Socket socket) throws IOException {
	System.out.println(Thread.currentThread().getName() + "..." + Thread.currentThread().getId());
		byte[] bytes = new byte[1024];
		InputStream inputStream = socket.getInputStream();
		while (true){
			int read = inputStream.read(bytes);
			if(read != -1){
				System.out.println(new String(bytes,0,read));
			}
		}
	}
}

案例中我们发现,每telnet一次,就会新建一个线程。当一个线程暂时没事做,就会堵在哪里。啥也不做。

结果分析

1、每一个客户端都会独立开辟一个线程就行操作。
2、如果请求的客户端多,那么造成的系统资源开销是特别大的。
3、当一个线程暂时没事做,就会堵在哪里,造成线程资源浪费。

结束语

这就是bio我们认识到了,Bio还是挺不讲武德的,你给人家一人建一个,系统资源浪费不说,还占着茅坑不拉*,造成了茅坑的浪费。这很不好,当然了,在人流量小,厕所大的情况下,并没有什么问题。比较咱们人少。随便浪费。

再见再见再见再见。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值