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