BIO简介
Java I/O,也叫Blocking I/O,也就是阻塞式I/O。
BIO的流程比较简单,在服务端创立一个ServerSocket去监听,等待连接。客户端创建一个Socket连接过来,服务器端就能接收到连接请求,建立一个连接。连接建立起来后,服务端和客户端就能通过一个流式API进行一个数据通信,进行一些读写操作。
单线程BIO示例
来看一个BIO的例子,服务端创立一个ServerSocket,然后等待连接(accept就是阻塞的):
连接过来以后,使用IO流方式读取和写入数据,处理的方法如下:
客户端发起Socket连接,然后同样用IO流的方式读取和写入数据:
上面这些代码相信很多人都写过,也都熟悉,可以看到单线程的BIO编程逻辑清晰,内容简单,(可惜效率低。。。),运行结果如下:
程序整个过程就是一个单线程的,如果这个时候再来一个客户端连接,那么新来的客户端就无法建立连接,因为上一个连接已经阻塞在while循环中。
多线程BIO示例
来看一个多线程的BIO例子,同样是服务端创立一个ServerSocket,然后等待连接(accept就是阻塞的),区别是,来一个连接就启动一个新线程去处理:
处理的线程方法如下,操作上和单线程的差不多:
多线程体现在服务端,客户端的写法基本没变,下面我们启动一个服务端和三个客户端,查看效果:
这种方式明显的缺点就是当连接多的时候,线程数量会爆掉,无法支持高并发的情况。虽然可以使用线程池保护机器,但是无法从根本上解决高并发问题。下面是使用线程池的例子:
客户端代码一样,此处不再演示。
本文由博客一文多发平台 OpenWrite 发布!