Java中的异步IO?
除了java.nio之外,java中还有哪些异步io(基于套接字)选项?java.nio是否也在后台使用线程(我认为.NET的异步套接字库是这样做的,可能已经更改了),或者它是使用正确的select调用的“真”异步io?Java中的异步IO?,java,networking,sockets,asynchronous,Java,Networking,Sockets,Asynchronous,除了java.nio之外,java中还有哪些异步io(基于套接字)选项?java.nio是否也在后台使用线程(我认为.NET的异步套接字库是这样做的,可能已经更改了),或者它是使用正确的select调用的“真”异步io?java.nio只是一个包—一个“哑”类的集合—它本身并不使用线程。如果使用得当,例如在中,您可以实现适当的、完全可扩展的异步I/O。如果您有兴趣将其用于网络内容。一个真正好的选择是: 看看那里,它使用方便,功能强大 Java的NIO包(从Java6开始)仅通过s提供对非阻塞I
java.nio
只是一个包—一个“哑”类的集合—它本身并不使用线程。如果使用得当,例如在中,您可以实现适当的、完全可扩展的异步I/O。如果您有兴趣将其用于网络内容。一个真正好的选择是:
看看那里,它使用方便,功能强大 Java的NIO包(从Java6开始)仅通过s提供对非阻塞I/O的支持。Java7有望与NIO.2一起发布,其中包括异步I/O支持。今天,您最好的选择是使用框架。停战协议提到米纳。这里还有一些其他的
现在,关于线程的问题,NIO选择器不使用线程进行非阻塞I/O。在JDK6中,它们在Windows下使用select(),在较新的Linux内核上使用epoll工具。对于异步I/O,线程细节取决于框架。关于LIB的另一个建议是Naga()。它不太像一个框架,而更像一个库。它试图看起来更像普通的java套接字,如果你喜欢的话。与Grizzly、Mina和Netty相比,它是最低限度的。对于最初的问题,在Unix/Linux系统上,在一种情况下,实现每个I/O操作只消耗一个线程,即异步文件通道 Java7出现了,所以新的答案是NIO.2和Future类。例如: 在服务器端:
final AsynchronousServerSocketChannel serverSocket=
AsynchronousServerSocketChannel.open().bind(new InetSocketAddress("127.0.0.1", 2587)); // Listening on port 2587 for client connection
Future<AsynchronousSocketChannel> future= serverSocket.accept();
final AsynchronousSocketChannel clientSocket= future.get(); // now it's blocking, useful: future.isDone() and .isCancelled()
//Do whatever you want ..
InputStream stream = Channels.newInputStream(clientSocket) (...)
更新:
如果您可以使用actor模型,那么就更好了。在底层流支持它的地方,.NET使用IO完成端口和线程池线程来执行回调。Jon,底层流什么时候可能不支持它?关于为什么不使用java.nio,有什么具体原因吗?实际上,我正在工作中尝试在我的项目中实现一些异步I/o,而我以前从未使用过这两种方法。因此我想知道。谢谢。我通常使用java,您可以获得游戏或聊天的代码示例。java的NIO还支持阻止IO。;)Netty与MINA一样是异步的、事件驱动的。在主页上查看真实用户撰写的推荐和绩效报告。:)非阻塞IO和异步IO之间有什么区别?@oconnor0非阻塞IO内核调用在缓冲区满(写时)和缓冲区空(读时)时不阻塞,这些状态导致从各自的API返回软错误。但是,非阻塞IO仍然在用户空间和内核空间之间复制数据,这会导致不必要的额外数据复制,当涉及大量数据时,这会带来很大的开销。内核随后(可能)将数据再次复制到数据包大小的片段中,并在其周围增加网络协议开销。一些网络堆栈/硬件驱动程序可能支持分散-聚集以优化内核阶段的,但最坏的情况是3个副本。@oconnor0异步IO接受在用户空间和内核空间之间的数据转换期间删除额外的复制操作。这允许内核直接从用户空间访问数据。为此,应用程序准备内存并向内核发送IO请求。控制返回应用程序(API非常类似于非阻塞)。在将来的某个时间点,内核可能会在执行IO时访问用户空间内存。一旦完成,内核将通过完成处理程序向用户空间发出类似于回调的信号,以通知应用程序请求的IO结果。Naga实际上似乎是异步内容的一个非常好的包装器。如果您只想执行异步ronous Socket I/O没有框架阻碍,Naga就是你想要的。我似乎记得有人在android上使用过它。我可以确认Naga可以与android一起工作。我还没有用它完成一个生产质量的应用程序,但到目前为止,我所有的测试都还可以。未来不是真正的异步。它是基于线程/信号量的:什么是“真正的异步”?仅仅因为它是使用线程实现的并不意味着它不是异步的…你的答案对我来说似乎是正确的,但是你能解释更多吗?请再解释一点。
AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open();
Future connected = localSocket.connect(ourServerSocketAddress);
// later: if(future.isDone())
connected.get();
//Send something
OutputStream os = Channels.newOutputStream(clientChannel );
os.write (...)