一、网络通信
1、什么是socket?
Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口,一般由操作
系统提供。客户端连接上一个服务端,就会在客户端中产生一个 socket 接口实例,服务端每接受
一个客户端连接,就会产生一个 socket 接口实例和客户端的 socket 进行通信,有多个客户
端连接自然就有多个 socket 接口实例。
2、网络编程中的serversocket与socket
在网络编程中,应用程序启动会使用serversocket监听端口,客户端通过ip与端口找到对应的应用程序;建立连接后应用程序会创建对应的socket读取客户端传输的数据,并通过socket写入数据后返回给客户端;
二、JDK中的BIO
BIBIO中的SercerSocket负责绑定IP,启动监听端口,等待客户端链接;客户端的Socket累实例发起链接操作,serversocket接收后产生一个新的服务端socket负责与客户端实例通过输入流和输出流进行通信;
阻塞体现:1、服务启动就绪,主线程一直等待客户端链接,主线程阻塞;
2、建立连接后,在读取socket信息之前,线程也是一直阻塞等待;
传统BIO模型
当客户端访问数量增加,线程与客户端访问数量1:1,服务端会创建大量线程,线程数量增加,系统性能急剧下降,过多会导致系统宕机;
为了改进这一问题,我们可以采用n个线程处理多个客户端请求,这一方式会导致多个客户端等待,这是最大的弊端;
三、什么是NIO?
NIO是为了弥补BIO的不足,提供了高速的、面向块的I/O。NIO全程NO-Blocking io;
Java NIO 和 IO 之间第一个最大的区别是,IO 是面向流的,NIO 是面向缓冲区的。 Java IO
面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地
方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它
缓存到一个缓冲区。 Java NIO 的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓
冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查
是否该缓冲区中包含所有需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要
覆盖缓冲区里尚未处理的数据。
1、阻塞与非阻塞IO
java IO的各种流是阻塞的,这意味着当一个线程调用read()或write时,该线程呗阻塞;
java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据牡丹石他仅能得到目前可用的数据,如果没有数据就什么都读取不到;而不是保持阻塞,所以直到数据变更前,可以做其它的事情,因此是非阻塞;
2、NIO之Reactor(反应器)模式
“反应”即“倒置”,“控制逆转”,具体事件处理程序不调用反应器,而向反应器注
册一个事件处理器,表示自己对某些事件感兴趣,有时间来了,具体事件处理程序通过事件
处理器对某个指定的事件发生做出反应;这种控制逆转又称为“好莱坞法则”(不要调用我,
让我来调用你)
3、NIO的三大组件
Selector选择器、channel管道、buffer缓冲区;
Channels:管道,通道,应用程序与操作系统交互事件与传递内容的渠道(应用程序可以通过通道来读写数据);
a、所有被Selector注册的通道,只能是继承了SelectableChannel类的子类;
b、ServerSocketChannel:应用程序的监听的通道,只有通过这个通道,应用程序才能向操作系统注册支持多路复用IO的端口监听;
c、SocketChannel:TCP Socket套接字的监听通道,一个socket套接字对应了一个客户端IP:端口,服务端ip:端口;
Selector:java的NIO选择器允许一个单独的线程来监视多个输入通道,即多个通道可以使用一个选择器;这个单独的线程可以操作这个选择器选择通道;这种机制可以是的一个单独的线程很容易来管理多个通道;
应用程序回想selector注册需要它关注的channel,以及具体的channel会对那些IO事件感兴趣;
Buffer:缓冲区,用于和NIO通道进行交互,数据从通道读入缓冲区,从缓冲区写入通道中;(本质是一块可以写入数据,读取数据的内存);就是包装成了NIO Buffer对象,封装了该内存的访问方法;
(本文未更新完毕,持续更新中。。。。。)