快捷搜索:  汽车  科技

netty 三个线程池(Java-彻底弄懂netty-Nio之ServerSocketChannel基础知识-知识铺)

netty 三个线程池(Java-彻底弄懂netty-Nio之ServerSocketChannel基础知识-知识铺)1.5 绑定: ssc.configureBlocking(false); ServerSocketChannel ssc = ServerSocketChannel.open(); 1.4 设置非阻塞:

知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。

netty 三个线程池(Java-彻底弄懂netty-Nio之ServerSocketChannel基础知识-知识铺)(1)

一、ServersocketChannel 基础

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()); } } } }

netty 三个线程池(Java-彻底弄懂netty-Nio之ServerSocketChannel基础知识-知识铺)(2)

3.1 缺点:非阻塞模式下看到很多空转,CPU飙高

3.2 改进:这里的输出可以换成线程池来处理,

实现无阻塞,高吞吐量处理。

猜您喜欢: