关闭→
当前位置:科普经验站>IT科技>epoll java

epoll java

科普经验站 人气:3.17W

<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

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

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

如何实现epoll的接口?

1、创建epoll句柄。

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

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

java epoll

在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<SelectionKey> keys = selector.keys();            System.out.println("当前epoll注册的事件:" + keys.size());            while (selector.select() > 0) {                Set<SelectionKey> selectionKeys = selector.selectedKeys();                Iterator<SelectionKey> 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);    }}

TAG标签:#java #epoll #