一、自己理解的概念
nioSocket(即new io socket)是一种同步非阻塞的I/O,其使用buffer来缓存数据和channel来传输数据,使用select来分拣消息。其使用的ServerSocketChannel和SocketChannel对应于之前学习的ServerSocket和Socket。
在我看的书(《看透Spring MVC源代码分析与实践》)中形容为:当今的快递物流,现实中的快递站点不会一件一件地发出快递,而是在每一天的中午或者是一天的下午等时间即等待一段时间后将受到的快件一起发出去,这就像这里要提到的NioSocket的工作原理,送货员就像这里的channel,将一段时间的一批货一起送出去,这一批快件就针对于buffer,到一个中转点分拣员分拣,将不同的货分发给相应的地区相应的快递员,分拣员的身份就相当于selector。
二、与普通socket的区别:
数据传输方面:
socket是直接使用输入输出流的方式直接读,当然也可以选择性的放在缓冲数据区中。
nioSocket只能用buffer来进行信息的获取与发出!
异步特性上面
socket 在连接和读写是都是堵塞状态的,即所在线程必须停住等待连接和数据的读入及写出,如果想在通信的时候可以开辟线程,一个线程对应一个socket连接,这样不仅资源消耗太高,而且线程安全问题也不容小觑!
niosocket可以再连接、读入、写出等待时执行其他代码,就像上面的例子中,快递站点的工作人员不是一直有事,可以再等待快递的时间里干别的事。
三、代码实现
服务器端
package AboutNioSocket.SimpleNioSocket;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;
/**
* @author hsw
* @create 2018-09-11 16:09
*/
public class NioSocketServer {
public static void main(String[] args) throws IOException, InterruptedException {
new NioSocketServer().start();
}
private void start() throws IOException, InterruptedException {
//使用静态open方法,生成一个ServerSocketChannel对象
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
//设置其为非阻塞模式
serverSocketChannel.configureBlocking(false);
//获取有个selector对象
Selector selector = Selector.open();
//注册selector,第二个参数设置了其操作类型
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
//绑定接受请求的端口
serverSocketChannel.bind(new InetSocketAddress(8001));
//循环接受请求
while (true)