为了账号安全,请及时绑定邮箱和手机立即绑定

回调在 NIO.2 库中的行为如何

回调在 NIO.2 库中的行为如何

绝地无双 2021-12-10 16:47:35
我正在构建一个小型客户端/服务器聊天应用程序。我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


查看完整回答
反对 回复 2021-12-10
  • 1 回答
  • 0 关注
  • 186 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号