一、简介
NIO: new IO , non-blocking IO , 非阻塞IO流
面向通道,操作缓冲区,双向传递
BIO: 传统的IO处理,阻塞式IO流
面向流操作字符、字节,具有方向性
二、
由于BIO在处理,高并发线程处理时,在以下情况容易出现线程阻塞
- connect,发起连接操作时
- accept,接收连接操作
- read,读取数据
- write,写入数据
三、
1.正常情况下
- service服务器端,接收客户端数据
- client客户端,发送数据给服务器端
// 服务器端,端口号:9999 public class ServiceDemo { public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(); ss.bind(new InetSocketAddress(9999)); Socket socket = ss.accept(); InputStream in = socket.getInputStream(); while(true){ System.out.println(in.read()); } } }
// 客户端,端口号:9999 public class ClientDemo { public static void main(String[] args) throws IOException { Socket socket = new Socket("127.0.0.1",9999); OutputStream out = socket.getOutputStream(); while(true){ out.write("hello".getBytes()); } } }
先启动service端服务,否则,报错,连接不到,因为客户端找不到服务端的9999
windows+r --> cmd --> netstat -ano | find "9999"
查看服务端已启动,9999端口有TCP服务
控制台有数据输出
2.1 connect 阻塞
- service服务器端未启动
- client客户端一直发起请求连接,但始终连接不到
2.2 accep 阻塞
- service服务器端启动,准备接受客户端的请求你
- client客户端未启动
2.3 write 阻塞
- service服务器端启动,但不接收客户端传送的数据
- client客户端一直发起请求连接,传送数据
数据在写入一段时间后,控制台不再打印信息,但客户端与服务端依然在运行
2.4 read 阻塞
- service服务器端启动,接收客户端传送的数据
- client客户端一直发起请求连接,但不发送数据