netty 三个线程池(Java-彻底弄懂netty-Nio之ServerSocketChannel基础知识-知识铺)
netty 三个线程池(Java-彻底弄懂netty-Nio之ServerSocketChannel基础知识-知识铺)1.5 绑定: ssc.configureBlocking(false); ServerSocketChannel ssc = ServerSocketChannel.open(); 1.4 设置非阻塞:
知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。
1.1 包路径:java.nio.channels
1.2 监听:可以监听新TCP连接通道
1.3 创建通道:
ServerSocketChannel ssc =
ServerSocketChannel.open();
1.4 设置非阻塞:
ssc.configureBlocking(false);
1.5 绑定:
ssc.socket().bind(new InetSocketAddress(8080));
1.6 关闭通道:
ssc.close();
二、ServerSocketChannel 工作原理2.1 ssc.accept() 监听新接入进来的TCP连接
2.2 有新连接,则返回一个SocketChannel通道
2.3 使用ByteBuffer来接收SocketChannel通道数据
2.4 处理buffer业务逻辑
注意:2.1 在设置为非阻塞模式,ssc.accept()会立即返回,不一定就获取到连接。所以这里如果设置的非阻塞模式,需要判空处理。
三、服务端完整例子public void startServer() throws IOException { //1 创建一个ServerSocketChannel通道 ServerSocketChannel ssc = ServerSocketChannel.open(); //2 绑定服务端端口 ssc.socket().bind(new InetSocketAddress(8080)); //3. 设置非阻塞模式 ssc.configureBlocking(false); while (true) { //4.获取客户端连接 SocketChannel aChannel = ssc.accept(); //5.非阻塞模式下,accept立即返回 // 没有连接返回的是null,这里要判断 if(aChannel != null){ ByteBuffer buf = ByteBuffer.allocate(100); aChannel.read(buf); //6. 反正为读模式 buf.flip(); //7. 操作buf,如这里输出 // hasRemaining() buffer是否读取完毕 while (buf.hasRemaining()) { System.out.println((char)buf.get()); } } } }
3.1 缺点:非阻塞模式下看到很多空转,CPU飙高
3.2 改进:这里的输出可以换成线程池来处理,
实现无阻塞,高吞吐量处理。