Асинхронный ввод / вывод в Java?
какие параметры для асинхронного ввода-вывода (на основе сокетов) существуют в java, кроме java.НИО? Также делает java.nio использует потоки в фоновом режиме (как я думаю, библиотека асинхронных сокетов .NET, возможно, она была изменена) или это "истинный" асинхронный io с использованием правильного вызова select?
6 ответов:
пакет Nio Java (начиная с Java6), обеспечивает поддержку неблокирующий ввод / вывод только через селекторs. Java7, надеюсь, будет поставляться с NIO.2, который включает асинхронный I/O поддержка. Сегодня лучше всего использовать фреймворк. Перемирие упомянула Мина. Вот некоторые другие.
- Гризли. Это ядро ввода/вывода для Sun's GlassFish сервер. Grizzly предоставляет средство для выполнения асинхронного чтение / запись (через модель очереди). Он поддерживает TCP и UDP, так. Я использовал гризли в нескольких проектах. Есть вещи, которые мне нравятся и не нравятся в рамках, но подробно это действительно другая тема. Я скажу, что это довольно легко получить что-то и работает, и Гризли делает много тяжелой работы для вас.
- Нетти. Этот проект исходит от одного из оригинальных авторов проекта 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
Это просто пакет-коллекция "тупых" классов-сам по себе он не использует никаких потоков. При правильном использовании, например, в Схема конструкции реактора, вы можете достичь правильного, полностью масштабируемого, асинхронного ввода-вывода