java之socket编程(nio多路复用器)(代码片段)

我想月薪过万 我想月薪过万     2022-12-24     290

关键词:

原理图展示

原理分析

  1. 每个 SelectionKey 对应着 一个 channel ,channel通过注册获取一个对应的  SelectionKey,SelectionKey.channel() 获取一个 channel。

  2. selector.select() 是一个阻塞型函数,得有事件触发他的执行,他执行之后,可以通过  selector.selectedKeys(); 来获取 触发他执行的 事件对应的 selectedKeys 集合

 代码展示

package NIO;

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 * ClassName: NioServer <br/>
 * Description: <br/>
 * date: 2021/8/20 15:17<br/>
 *
 * @author yiqi<br />
 * @since JDK 1.8
 */
public class NioServer 
    //保存客户端连接
    static List<SocketChannel> channelList = new ArrayList<>();

    public static void main(String[] args) throws Exception 

        // 创建 NIO ServerSocketChannel,与 BIO ServerSocket 类似
        ServerSocketChannel serverSocket = ServerSocketChannel.open();
        serverSocket.socket().bind(new InetSocketAddress(9000));
        // 设置 ServerSocketChannel 为非阻塞
        serverSocket.configureBlocking(false);
        // 打开Selector处理Channel,即创建epoll
        Selector selector = Selector.open();
        // 把 ServerSocketChannel 注册到 selector 上,并且 让selector监听 客户端accept 事件
        SelectionKey selectionKey = serverSocket.register(selector, SelectionKey.OP_ACCEPT);
        System.out.println("服务启动成功");

        while (true) 
            // 阻塞等待需要处理的事件发生
            selector.select();

            // 获取selector中注册的全部事件 的 SelectionKey 实例
            Set<SelectionKey> selectionKeys = selector.selectedKeys();
            Iterator<SelectionKey> skIterator = selectionKeys.iterator();

            while (skIterator.hasNext())
                SelectionKey key = skIterator.next();
                // 如果是 OP_ACCEPT 事件,则进行连接获取和时间注册
                if (key.isAcceptable())
                    ServerSocketChannel server = (ServerSocketChannel) key.channel();
                    SocketChannel socketChannel = server.accept();
                    socketChannel.configureBlocking(false);
                    SelectionKey selKey = socketChannel.register(selector, SelectionKey.OP_READ);
                    System.out.println("客户端连接成功");
                else if (key.isReadable()) // 如果是 OP_READ 事件 ,则进行读写和打印
                    SocketChannel socketChannel = (SocketChannel) key.channel();
                    ByteBuffer byteBuffer = ByteBuffer.allocate(128);
                    int len = socketChannel.read(byteBuffer);
                    // 如果有数据,把数据打印出来
                    if (len > 0)
                        System.out.println("接收到消息:" + new String(byteBuffer.array(),0,len));
                    else if (len == -1)
                        System.out.println("客户端断开连接");
                    
                
                // 从事件集合里删除本次处理的key,防止下次select重复处理
                skIterator.remove();
            
        
    

java网络编程——nio的阻塞io模式非阻塞io模式io多路复用模式的使用(代码片段)

NIO虽然称为Non-BlockingIO(非阻塞IO),但它支持阻塞IO、非阻塞IO和IO多路复用模式这几种方式的使用。同步IO模式NIO服务器端@Slf4jpublicclassNIOBlockingServerpublicstaticvoidmain(String[]args)throwsIOExceptionServerSocketChan 查看详情

java网络编程——nio的阻塞io模式非阻塞io模式io多路复用模式的使用(代码片段)

NIO虽然称为Non-BlockingIO(非阻塞IO),但它支持阻塞IO、非阻塞IO和IO多路复用模式这几种方式的使用。同步IO模式NIO服务器端@Slf4jpublicclassNIOBlockingServerpublicstaticvoidmain(String[]args)throwsIOExceptionServerSocketChan 查看详情

netty框架之nio多路复用选择器(代码片段)

...小编的代码示例中仍然是阻塞的,这是因为没有加入多路复用选择器Selector,其实只要将管道设置为非阻塞模式,然后注册至Selector。当消息到达后才去通知,这样就避免了线程的阻塞。接下来小编来探索Selecto 查看详情

java,socket,nio随笔记录

...。SocketChannel还能注册selector和感兴趣的事件。selector多路复用器这里就不多做介绍了。  查看详情

nio编程(代码片段)

...上移动,而通道可以用于读、写或者二者同时进行。多路复用器Selector多路复用器提供选择就绪的任务的能力。简单来说Selector会不断的轮询注册在其上的Channel。NIO服务端时序图打开ServerSocketChannel,用于监听客户端的连接,它是... 查看详情

java之socket编程(nio)(代码片段)

效果展示原理分析NIO:非阻塞型IO自从jdk1.4之后,增加了nio库,支持非阻塞型IO操作代码展示packageNIO;importjava.net.InetSocketAddress;importjava.nio.ByteBuffer;importjava.nio.channels.ServerSocketChannel;importjava.nio.channe 查看详情

java网络编程——nio的阻塞io模式非阻塞io模式io多路复用模式的使用(代码片段)

NIO虽然称为Non-BlockingIO(非阻塞IO),但它支持阻塞IO、非阻塞IO和IO多路复用模式这几种方式的使用。同步IO模式NIO服务器端@Slf4jpublicclassNIOBlockingServerpublicstaticvoidmain(String[]args)throwsIOExceptionServerSocketChannelserverSocketCha... 查看详情

java网络编程——nio的阻塞io模式非阻塞io模式io多路复用模式的使用(代码片段)

NIO虽然称为Non-BlockingIO(非阻塞IO),但它支持阻塞IO、非阻塞IO和IO多路复用模式这几种方式的使用。同步IO模式NIO服务器端@Slf4jpublicclassNIOBlockingServerpublicstaticvoidmain(String[]args)throwsIOExceptionServerSocketChannelserverSocketCha... 查看详情

java004网络编程bionioaio

目录(图片来自于网络)  多路复用Linux环境下底层机制  多路复用模式Reacotor和Proactor  BIO,NIO,AIO的简单介绍 多路复用Linux环境下底层机制  多路复用模式Reacotor和ProactorReactor和Proactor模式的主要区别就是真正的读... 查看详情

linux网络编程——多路复用之epoll(代码片段)

目录Linux网络编程——多路复用之epoll基础API实例一、epoll实现在线聊天实例二、epoll实现在客户端断开后服务端能一直运行,客户端可以多次重连Linux网络编程——多路复用之epoll?epoll是Linux下多路复用IO接口select/poll的增强版本,... 查看详情

网络编程之io多路复用

目录一.同步与阻塞1.1同步阻塞1.2 同步非阻塞1.3 异步阻塞1.4 异步非阻塞1.5I/O多路二.多路复用的技术2.1UNIXI/OModels2.1.1blockingI/O2.1.2 nonblockingI/O2.1.3 I/OMultiplexingModel2.1.4 SIGIO2.1.5asynchronousI/O2.2IO多路复用2.2.1从同步阻塞到同步非阻... 查看详情

网络编程之每天学习一点点[day4]-----nio实现单向通信

...接的开销!因为Channel非直连,而是注册到了多路复用器上。一个TCP连接对应多个channel。NIO概念我们使用nio来实现客户端发送数据,服务端接收数据这样一个例子。先来看下NIO的几个概念࿱ 查看详情

aio编程(代码片段)

...请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。而AIO则是则是异步非阻塞的,并且提供了异步文件通道和异步套接字通道的实现。主要通过两种方... 查看详情

高性能socket模型

1.常见的Socket模型服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:(1)同步阻塞IO(BlockingIO):即传统的IO模型。(2)同步非阻塞IO(Non-blockingIO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBL... 查看详情

深入socket网络编程与i/o多路复用(代码片段)

进一步学习select、poll、epoll。全文目录Socket网络编程I/O分类select/pollepoll读写就绪条件参考资料Socket网络编程学过计算机网络的同学应该都看得懂这幅图:一个进程进行网络传输的过程可以分为两个阶段:第一阶段:... 查看详情

深入socket网络编程与i/o多路复用(代码片段)

进一步学习select、poll、epoll。全文目录Socket网络编程I/O分类select/pollepoll读写就绪条件参考资料Socket网络编程学过计算机网络的同学应该都看得懂这幅图:一个进程进行网络传输的过程可以分为两个阶段:第一阶段:... 查看详情

java网络编程——nio三大组件bufferchannelselector(代码片段)

...持IO多路复用模式,可以通过一个线程监控多个IO流(Socket) 查看详情

nio多路复用的终极奥义

...型进行异步调用。3、Reactor模型就是基于事件驱动的一个多路复用模型,它又可分为单线程、多线程、主从式的Reactor模型,以应对不同应用场景,Nginx、Redis、Netty都采用了Reactor模型作为多路复用实现思路。4、NIO也是基于事件驱... 查看详情