Java 中的异步 IO?

2022-08-31 16:25:15

除了java.nio之外,java中还有哪些异步io(基于套接字)的选项?java.nio也在后台使用线程(我认为.NET 的 async-socket-library 确实存在,也许它已被更改)或者它是使用适当的选择调用的“true”异步 io?


答案 1

Java的NIO包(从Java6开始)仅通过Selectors提供对非阻塞I / O的支持。Java7有望与NIO.2一起发布,其中包括异步I / O支持。今天,你最好的选择是利用一个框架。ARMistice提到了Mina。以下是其他一些内容。

  1. 灰熊。这是 Sun 的 GlassFish 服务器的 I/O 核心。Grizzly提供了一个执行异步读取/写入的工具(通过队列模型)。它支持TCP和UDP。我在几个项目中使用过灰熊。关于这个框架,我喜欢和不喜欢一些事情,但详细介绍这实际上是另一个话题。我会说,启动和运行某些东西很容易,灰熊为你做了很多繁重的工作。
  2. 网易.该项目来自Mina项目的原始作者之一。我没有使用这个,所以我不知道它对异步I / O的支持。你应该看看。

现在,关于您关于线程的问题,NIO 选择器不使用线程进行非阻塞 I/O。在JDK6中,他们在Windows下使用select()和在较新的Linux内核上使用epoll工具。对于异步 I/O,线程详细信息取决于框架。


答案 2

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会更好。


推荐