gpt4 book ai didi

java - 使用java选择器唯一标识客户端

转载 作者:行者123 更新时间:2023-12-02 02:15:49 24 4
gpt4 key购买 nike

我正在使用 java.nio 编写套接字服务器。因为我需要我的服务器使用 0 个线程,所以我使用 java.nio.channels.Selector。我的代码如下所示。

while (iterator.hasNext()) {
SelectionKey key = (SelectionKey) iterator.next();

iterator.remove();

if (!key.isValid()) {
continue;
}

if (key.isAcceptable()) { // Accept client connections
this.acceptClient(key);
} else if (key.isReadable()) { // Read from client
this.read(key);
} else if (key.isWritable()) {
this.write(key);
}
}

private void acceptClient(SelectionKey key) throws IOException {
ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();
SocketChannel channel = serverChannel.accept();
channel.configureBlocking(false);
SocketAddress clientAddress= channel.getRemoteAddress();

//clients is a Hashmap
clients.put(clientAddress, new Client());
clientConnected(clientAddress.toString());
System.out.println("Connected to: " + clientAddress);

channel.register(this.selector, SelectionKey.OP_READ);
}

如您所见,我正在为每个接受的客户端创建一个新的客户端对象。我需要做的是,相关的Client对象来处理自己的读写。
我的方法是通过地址唯一地标识客户并将其转发到相关的客户对象。
我认为使用客户地址来唯一标识客户并不是一个好方法。处理这个问题的最佳方法是什么?

最佳答案

I think using client address to uniquely identify clients is not a good approach.

没有什么问题。 TCP/IP 的语义保证每个接受的套接字都有不同的远程 SocketAddress

但你不需要它,或者 Map任何一个。只需保存 Client作为SelectionKey的附件。这样也可以 Client将与 SelectionKey 一起消失当您关闭Channel时自动.

相比之下,更改为 IdentityHashMap<SelectionKey, Client>正如其他地方所建议的那样,您有机会泄露 SelectionKey因此它是ChannelClient也是。

关于java - 使用java选择器唯一标识客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49313967/

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