Какие параметры для async io (на основе сокетов) существуют в java, а затем java.nio? Также java.nio использует потоки на заднем плане (как я думаю,.NET-асинхронная сокета-библиотека делает, может быть, она была изменена) или это "истина" async io, используя правильный вызов выбора?
Асинхронный ввод-вывод в Java?
Ответ 1
Пакет Java NIO (с Java6) обеспечивает поддержку неблокирующего ввода-вывода только через Selector s. Java7, надеюсь, отправится с NIO.2, который включает поддержку асинхронного ввода-вывода. Сегодня лучше всего использовать фреймворк. АРМИСТИКА упомянула Мину. Вот некоторые другие.
- Grizzly. Это ядро ввода/вывода для сервера Sun GlassFish. Grizzly предоставляет возможность для асинхронного чтения/записи (через модель очереди). Он поддерживает TCP и UDP. Я использовал Grizzly в нескольких проектах. Есть вещи, которые мне нравятся и не нравятся в структуре, но для детализации это действительно другая тема. Я скажу, что легко получить что-то и запустить, и Гризли делает много тяжелой работы для вас.
- Netty. Этот проект исходит от одного из оригинальных авторов проекта Mina. Я не использовал этот, поэтому я не знаю о его поддержке асинхронного ввода-вывода. Вы должны посмотреть.
Теперь, что касается вашего вопроса о потоках, селектора NIO не используют потоки для неблокирующего ввода-вывода. В JDK6 они используют select() под Windows и установку epoll на новых ядрах Linux. Для асинхронного ввода-вывода детали потоковой передачи зависят от структуры.
Ответ 2
JAVA 7 прибыл, поэтому новый ответ - 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 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 (...)
Update: Если вы можете использовать модель актера, то AKKA TCP IO будет еще лучше.
Ответ 3
Другим предложением в отношении libs будет Naga (http://naga.googlecode.com). Это немного меньше, чем структура и больше похожа на библиотеку. Он пытается больше походить на обычные сокеты java, если это ваша чашка чая. Это минималистично по сравнению с Grizzly, Mina и Netty.
Ответ 4
java.nio
- это всего лишь пакет - сборник "немых" классов - сам по себе он не использует никаких потоков. При правильном использовании, например, в шаблоне Reactor, вы можете добиться правильного, полностью масштабируемого асинхронного ввода-вывода.
Ответ 5
Если вы заинтересованы в его использовании для Network Stuff. Действительно хороший выбор:
Посмотрите там свою простую в использовании и очень мощную.
Ответ 6
В исходный вопрос реализация только потребляет поток на операцию ввода-вывода в одном случае, AsynchronousFileChannel в системах Unix/Linux.