gpt4 book ai didi

java - 一个线程一个ByteBuffer NIO

转载 作者:行者123 更新时间:2023-12-01 11:25:31 25 4
gpt4 key购买 nike

我想知道用一个线程和一个缓冲区实现多用户 NIO 服务器的最佳方法。目前我使用选择器来实现此目的,但我只弄清楚如何在所有客户端上进行读取。我在使用一个缓冲区实现写入时遇到问题。我需要第二个缓冲区用于写入吗?或者我是否必须(不幸的是)每个客户端都有一个写入缓冲区?我编写这个示例是为了轻松地展示我是如何做事情的,只是为了让您知道所有处理都发生在调度程序的线程内,我没有通过另一个线程与任何状态交互!

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

ServerSocketChannel server = ServerSocketChannel.open();
Selector selector = Selector.open();
ByteBuffer buffer = ByteBuffer.allocateDirect(8192);
Map<SelectionKey, SocketChannel> clients = new HashMap<>();

server.configureBlocking(false);
server.register(selector, SelectionKey.OP_ACCEPT);
server.bind(new InetSocketAddress(43594));

scheduler.scheduleAtFixedRate(() -> {
try {
selector.selectNow();
Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
while (keys.hasNext()) {
SelectionKey key = keys.next();
keys.remove();
if (key.isAcceptable()) {
for (int i = 0; i < 16; i++) {
SocketChannel client = server.accept();
if (client == null)
break;
client.configureBlocking(false);
SelectionKey clientKey = client.register(selector, SelectionKey.OP_READ);
clients.put(clientKey, client);
}
}
if (key.isReadable()) {
SocketChannel client = clients.get(key);
if (client != null) {
buffer.clear();
client.read(buffer);
buffer.flip();
// do stuff with buffer
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}, 600, 600, TimeUnit.MILLISECONDS);

最佳答案

你不能。对于任何比回声服务器更简单的事情,每个 channel 至少需要一个缓冲区,可能两个(读和写)。否则,您将无法处理部分读取的请求或部分写入的响应。

您可以通过 SelectionKey 附件将缓冲区与 channel 关联起来。

关于java - 一个线程一个ByteBuffer NIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30836723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com