java epoll

作者:原创时间:2022-03-31
文档

java epoll是什么,让我们一起了解一下?

epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select或poll的增强版本,能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

如何实现epoll的接口?

1、创建epoll句柄。

2、将被监听的描述符添加到epoll句柄或从epool句柄中删除或者对监听事件进行修改。

3、等待事件触发,当超过timeout还没有事件触发时,就超时。

在Java中epoll的优点有哪些?

1、支持一个进程打开大数目的socket描述符。

2、IO效率不随FD数目增加而线性下降。

3、没有使用mmap加速内核与用户空间的消息传递。

如何使用多路复用的服务端程序,来演示JavaAPI中提供的方法与底层epoll函数实现的具体关系?

首先程序运行后服务端启动并绑定9090端口,等待客户端连接,读取到客户端消息后再直接把消息后回复给客户端。

示例代码如下:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;
public class SocketMultiplexIO {
    private static Selector selector;
    public static void main(String[] args) throws Exception {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress(9090));
        serverSocketChannel.configureBlocking(false);
        selector = Selector.open();
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
        System.out.println("服务端启动了。。。");
        while (true) {
            Set keys = selector.keys();
            System.out.println("当前epoll注册的事件:" + keys.size());
            while (selector.select() > 0) {
                Set selectionKeys = selector.selectedKeys();
                Iterator iterator = selectionKeys.iterator();
                while (iterator.hasNext()) {
                    SelectionKey selectionKey = iterator.next();
                    iterator.remove();
                    if (selectionKey.isAcceptable()) {
                        System.out.println("有一个客户端连接了。。。");
                        acceptHandler(selectionKey);
                    } else if (selectionKey.isReadable()) {
                        selectionKey.cancel();
                        System.out.println("cancel函数,取消了accept事件");
                        readHandler(selectionKey);
                    }
                }
            }
        }
    }
    private static void readHandler(SelectionKey key) {
        SocketChannel client = (SocketChannel) key.channel();
        ByteBuffer buffer = (ByteBuffer) key.attachment();
        buffer.clear();
        int read;
        try {
            while (true) {
                read = client.read(buffer);
                if (read > 0) {
                    buffer.flip();
                    while (buffer.hasRemaining()) {
                        client.write(buffer);
                    }
                    buffer.clear();
                } else if (read == 0) {
                    break;
                } else {
                    client.close();
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static void acceptHandler(SelectionKey selectionKey) throws IOException {
        ServerSocketChannel serverSocketChannel = (ServerSocketChannel) selectionKey.channel();
        SocketChannel accept = serverSocketChannel.accept();
        accept.configureBlocking(false);
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);
        accept.register(selector, SelectionKey.OP_READ, byteBuffer);
    }
}

以上就是小编今天的分享了,希望可以帮助到大家。

显示全文
java error java escape java event java exchange java execute 微信群怎么找 怎么导出微信聊天记录 苹果手机怎么恢复出厂设置 qq怎么清理缓存和垃圾清理 朋友圈怎么转发 微信分组怎么删除 两个excel如何独立显示 excel怎么排序 计算机管理怎么打开 java jep java jetty java jit java jmeter java jmh java jndi java environment java enterprise java generic java enhancer java generator java future java encapsulation java empty java email java ehcache java echarts java formatter java ecc加密 java fork java foreach循环 java ear java flume java dynamic java dto java drools