BIO
Blocking IO也称为BIO,即同步阻塞IO。Java的io包下提供的InputStream和OutputStream操作,交互⽅式是同步且阻塞的⽅式,在输⼊输出流的操作进⾏读、写动作完成之前,线程会⼀直阻塞。因此io包中对流的操作容易造成性能的瓶颈。
服务端网络BIO模型
在BIO同步阻塞模型下,服务端收到客户端请求后,如果二者之间未发生数据传输,那么线程会一直处于阻塞状态,其他请求就无法处理
单线程网络BIO模型
服务端代码:
public class SingleServerScoket {
public static void main(String[] args) throws Exception{
ServerSocket serverSocket = new ServerSocket(8888);
while (true){
//accept()方法是一个阻塞方法,监听8888端口,如果有客户端请求8888端口才会继续往下执行,等待客户端连接
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
byte[] bytes = new byte[1024];
//read()方法是一个阻塞方法,只有读取到数据才会继续往下执行,阻塞等待客户端发送数据
int len = inputStream.read(bytes);
System.out.println(new String(bytes,0,len));
outputStream.write("success".getBytes());
outputStream.flush();
inputStream.close();
outputStream.close();
}
}
}
客户端代码:
public class ClientOne {
public static void main(String[] args) throws Exception{
Socket socket = new Socket("localhost", 8888);
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();
outputStream.write("Hello Wrold".getBytes());
outputStream.flush();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
System.out.println(new String(bytes,0,len));
socket.close();
}
}
多线程网络BIO模型
多线程服务端代码:
public class MultiServerSocket {
public static void main(String[] args) throws Exception{
ServerSocket serverSocket = new ServerSocket(8888);
while (true){
//accept()方法是一个阻塞方法,监听8888端口,如果有客户端请求8888端口才会继续往下执行,等待客户端连接
Socket socket = serverSocket.accept();
new Thread(new Runnable() {
@Override
public void run() {
try {
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
byte[] bytes = new byte[1024];
//read()方法是一个阻塞方法,只有读取到数据才会继续往下执行,阻塞等待客户端发送数据
int len = inputStream.read(bytes);
System.out.println(new String(bytes,0,len));
outputStream.write("success".getBytes());
outputStream.flush();
inputStream.close();
outputStream.close();
}catch (Exception e){
}
}
});
}
}
}
NIO
NIO(Non Blocking IO)是同步⾮阻塞的IO,服务器可以使⽤⼀个线程来处理多个客户端请求,客户端发送的请求会注册到多路复⽤器Selector上,由多路复⽤器Selector轮询各客户端的请求并进⾏处理。与BIO网络模型最大的区别就是:NIO将传统BIO的那一套阻塞流程拆分为事件的方式,通过Selector轮询每个通道上是否有事件发生,完成请求处理,其中重要的几大组件分别是:ServerSocketChannel、Selector、SocketChannel、SelectionKey、Buffer
FileChannel
1、缓冲区在java nio中负责数据的存储。缓冲区就是数组。用于存储不同数据类型的数据。根据数据类型不同(boolean除外),提供了相应类型的缓冲区:ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer。
上述缓冲区的管理方式几乎一致,通过allocate()获取缓冲区。
filp():随着数据的写入position(位置)也在不断的发生变化,filp其实就是让position从0开始,到limt结束