我正在构建一个小型客户端/服务器聊天应用程序。我NIO.2
尝试使用经典NIO
库对其进行仿真后遇到了。
我使用classisc NIO“模拟” NIO.2库的目的是在多个线程中使用多个选择器,这些选择器成对通过aArrayBlockingQueue
进行连接,以避免网络读写时间。
我的问题是,如何在NIO.2 lib中同时使用AsynchronousSocketChannels
和处理多个事件CompletionHandlers
(据我理解,这些事件充当回调)?
经典的NIO
lib使用Selectors
在select
调用a之后传递key set
。这key set
然后可以遍历每个事件(阅读,接受并写入)可以处理一个又一个。
在NIO.2
另一方面回调,没有这样的序列。他们是异步的。那么,例如,如果2个客户端在同一时间向服务器发送消息,会发生什么情况?
然后是否同时运行两个回调?如果是,那又如何?它们是否都在单独的线程中运行?
而且,如果我要从每个回调中获取这些消息并尝试像前面提到的那样ArrayBlockingQueue
将它们放入队列中,它们是否会彼此等待?
那么,例如,如果2个客户端在同一时间向服务器发送消息,会发生什么情况?
客户端不与服务器共享公共连接。在服务器端,您需要AsynchronousSocketChannel#read
为两个客户端调用回调,这将在某些字节到达时触发。
因此,两个回调可以同时运行(因为它们是异步的),但是它们对于每个客户端仍然是独立的,因此不会有问题。
它们是否都在单独的线程中运行?
这取决于支持AsynchronousChannelGroup
的线程池(您可以指定自己或使用默认组)。
我使用NIO.2创建了一个简单的网络库,希望对您有所帮助:https : //github.com/jhg023/SimpleNet
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句