我正在构建一个小型客户端/服务器聊天应用程序。我NIO.2在尝试使用经典NIO库模拟它后遇到了它。我使用 classisc NIO 对 NIO.2 库进行“模拟”的目标是在通过 a 成对连接的多个线程中使用多个选择器ArrayBlockingQueue,以避免网络读写时间。我的问题是,如何在 NIO.2 库中使用AsynchronousSocketChannels和CompletionHandlers(根据我的理解作为回调)同时处理多个事件?经典的NIOlib 使用Selectorswhich 在select调用 a后交付key set。这key set然后可以遍历每个事件(阅读,接受并写入)可以处理一个又一个。在NIO.2另一方面回调,没有这样的序列。它们是异步的。那么,例如,如果 2 个客户端在同一时刻向服务器发送消息,会发生什么?那么 2 个回调是否同时运行?如果是,那么如何?它们是否都在单独的线程中运行?如果我要从每个回调中获取这些消息并尝试将它们排入队列,如前所述ArrayBlockingQueue,它们会相互等待吗?
1 回答

慕的地6264312
TA贡献1817条经验 获得超6个赞
那么,例如,如果 2 个客户端在同一时刻向服务器发送消息,会发生什么?
客户端不与服务器共享公共连接。在服务器端,您会AsynchronousSocketChannel#read
为两个客户端调用回调,当一些字节到达时会触发。
出于这个原因,两个回调可以同时运行(因为它们是异步的),但它们对于每个客户端仍然是独立的,所以不会有问题。
它们是否都在单独的线程中运行?
这取决于 backingAsynchronousChannelGroup
的线程池(您可以自己指定或使用默认组)。
我用 NIO.2 创建了一个简单的网络库,我认为它会帮助你:https : //github.com/jhg023/SimpleNet
添加回答
举报
0/150
提交
取消