回调在 NIO.2 库中的行为方式

How do callbacks behave in the NIO.2 library

我正在构建一个小型 client/Server 聊天应用程序。在尝试使用经典 NIO 库模拟它后,我遇到了 NIO.2

我的 "simulation" NIO.2 lib 与 classisc NIO 的目标是在通过 ArrayBlockingQueue 成对连接的多个线程中使用多个选择器,以避免网络读写次数。

我的问题是,如何在 NIO.2 库中使用 AsynchronousSocketChannelsCompletionHandlers(据我理解是回调)同时处理多个事件?

经典 NIO 库使用 Selectors,它在 select 调用 key set 后交付。这个 key set 然后可以迭代并且每个事件(读取、接受和写入)可以一个接一个地处理。

另一方面,NIO.2 回调没有这样的顺序。它们是异步的。那么,如果 2 个客户端同时向服务器发送一条消息,会发生什么?

然后同时进行 2 个回调 运行?如果是,那又如何呢? 他们每个 运行 是否在单独的线程中?

如果我从每个回调中获取这些消息并尝试将它们排入队列,如前所述ArrayBlockingQueue,它们是否会互相等待?

So what happens if, for example, 2 clients send at exact the same moment a message to the server ?

客户端不与服务器共享公共连接。在服务器端,您将调用 AsynchronousSocketChannel#read 和您对两个客户端的回调,这将在一些字节到达时触发。

因此,两个回调可以同时 运行(因为它们是异步的),但它们对于每个客户端仍然是独立的,因此不会有问题。

Do they each run in seperate threads or not?

这取决于后台AsynchronousChannelGroup的线程池(您可以自己指定或使用默认组)。

我用 NIO.2 创建了一个简单的网络库,我认为它会对你有所帮助:https://github.com/jhg023/SimpleNet