Java 中的异步 IO?
2022-08-31 16:25:15
除了java.nio之外,java中还有哪些异步io(基于套接字)的选项?java.nio也在后台使用线程(我认为.NET 的 async-socket-library 确实存在,也许它已被更改)或者它是使用适当的选择调用的“true”异步 io?
除了java.nio之外,java中还有哪些异步io(基于套接字)的选项?java.nio也在后台使用线程(我认为.NET 的 async-socket-library 确实存在,也许它已被更改)或者它是使用适当的选择调用的“true”异步 io?
Java的NIO包(从Java6开始)仅通过Selectors提供对非阻塞I / O的支持。Java7有望与NIO.2一起发布,其中包括异步I / O支持。今天,你最好的选择是利用一个框架。ARMistice提到了Mina。以下是其他一些内容。
现在,关于您关于线程的问题,NIO 选择器不使用线程进行非阻塞 I/O。在JDK6中,他们在Windows下使用select()和在较新的Linux内核上使用epoll工具。对于异步 I/O,线程详细信息取决于框架。
JAVA 7来了,所以新的答案是NIO.2与未来类。例:
在服务器端:
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) (...)
在客户端:
AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open();
Future connected = localSocket.connect(ourServerSocketAddress);
// later: if(future.isDone())
connected.get();
//Send something
OutputStream os = Channels.newOutputStream(clientChannel );
os.write (...)
更新:如果你可以使用演员模型,那么AKKA TCP IO会更好。