Асинхронный ввод / вывод в Java?


какие параметры для асинхронного ввода-вывода (на основе сокетов) существуют в java, кроме java.НИО? Также делает java.nio использует потоки в фоновом режиме (как я думаю, библиотека асинхронных сокетов .NET, возможно, она была изменена) или это "истинный" асинхронный io с использованием правильного вызова select?

6 56

6 ответов:

пакет Nio Java (начиная с Java6), обеспечивает поддержку неблокирующий ввод / вывод только через селекторs. Java7, надеюсь, будет поставляться с NIO.2, который включает асинхронный I/O поддержка. Сегодня лучше всего использовать фреймворк. Перемирие упомянула Мина. Вот некоторые другие.

  1. Гризли. Это ядро ввода/вывода для Sun's GlassFish сервер. Grizzly предоставляет средство для выполнения асинхронного чтение / запись (через модель очереди). Он поддерживает TCP и UDP, так. Я использовал гризли в нескольких проектах. Есть вещи, которые мне нравятся и не нравятся в рамках, но подробно это действительно другая тема. Я скажу, что это довольно легко получить что-то и работает, и Гризли делает много тяжелой работы для вас.
  2. Нетти. Этот проект исходит от одного из оригинальных авторов проекта Mina. Я не использовал этот, поэтому я не знаю о о его поддержка асинхронного ввода-вывода вы должны взглянуть.

теперь, что касается вашего вопроса о потоках, селекторы NIO не используют потоки для неблокирующего ввода-вывода в JDK6 они используют select () под Windows и средством epoll на более новых ядрах Linux. Для асинхронного ввода-вывода детали потоковой передачи зависят от структуры.

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 было бы еще лучше.

еще одно предложение в отношении libs было бы Naga (http://naga.googlecode.com). это немного меньше похоже на фреймворк и больше похоже на библиотеку. Он пытается больше походить на обычные сокеты java, если это ваша чашка чая. Это минималистично по сравнению с гризли, Мина и Нетти.

java.nio Это просто пакет-коллекция "тупых" классов-сам по себе он не использует никаких потоков. При правильном использовании, например, в Схема конструкции реактора, вы можете достичь правильного, полностью масштабируемого, асинхронного ввода-вывода

Если вы заинтересованы в использовании его для сетевых вещей. Действительно хороший выбор:

http://mina.apache.org/

посмотреть там его простой в использовании и очень мощный.

к исходному вопросу реализация только потребляет поток на операцию ввода-вывода в одном случае, AsynchronousFileChannel на системах Unix/Linux.