Java网络编程(JAVA网络编程面试题)
传统的TCP和UDP通讯都是同步阻塞式IO(BIO),I指输入流,O指输出流,阻塞体现在通信的双方接收和发送信息的速率不一样,从而导致快的一方一直在等待慢的一方,不能进行下一步动作,同步体现在一直在等待对方响应
NIO即同步非阻塞式IO,JDK4提出来的,主要有三大组件:Buffer(这个BIO也有,做数据缓冲,例如ReaderBuffer),Channel(这个类似BIO的输出输入流,不同点在于,channel是全双工的,可以双向通信),Selector(多路选择器,实现非阻塞IO的关键),服务端建立ServerSocketChannel后,将其绑定在Selector上,Selector对ServerSocketChannel管道上接入的客户端连接进行轮询监听,当发生相应的Selectionkey事件后,进行相应的读写操作,这种情况下,是一个服务端管道对应多个客户端管道,中间用一个选择器对多个客户端管道的进行处理,当哪个管道有事件发生的时候,就拿这个管道与服务端管道进行对接通信,这样就不用一直等着某个客户端了,实现了非阻塞
AIO即异步IO,JDK7提出来的,采用回调方法进行读写操作,简单讲就是,消息给你发过去就不管了,你啥时候回我,调用我给你的方法(回调方法)就行了,建立管道连接方式和BIO/NIO差不多,核心类是Completionhandler,用于回调操作
Netty是一个非阻塞,基于异步事件驱动的网络通信框架,简单讲是NIO和AIO的组合体,利用回调函数(主要是各种handler类)实现了异步(这点像AIO),利用事件分类做了业务驱动处理,例如对处理类分成Inbound和OutBound两种类型,通信套路跟上述通信方式大同小异,都是建立管道进行通信