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) { Setkeys = 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); } }
以上就是小编今天的分享了,希望可以帮助到大家。