#java #asynchronous #io #nio
#java #асинхронный #io #nio
Вопрос:
Я читал о java nio и неблокирующих сокетах, и я хочу записать сериализованные объекты в сокет. Я читал эту статью здесь http://www.owlmountain.com/tutorials/NonBlockingIo.htm#_Toc524339525 , и там говорится, что если вы обернете свой неблокирующий сокет вокруг PrintWriter, он будет блокироваться. Интересно, будет ли то же самое, если я оберну свой socket.getOutputStream вокруг ObjectOutputStream? Есть какой-нибудь простой способ проверить, будет ли оболочка блокировать или нет? Я не смог найти никаких упоминаний об этом в документации PrintWriter или ObjectOutputStream.
Вот фрагмент кода из статьи выше:
else if ( key.isWritable() ) {
Socket socket = (Socket) key.attachment();
PrintWriter out = new PrintWriter( socket.getOutputStream(), true );
out.println( "What is your name? " );
}
Ответ №1:
Не уверен, пропустили вы это или нет, но в статье четко сказано, что любые используемые обычные утилиты ввода-вывода не будут подключаться, и выходит, чтобы представить пример кода для чтения и записи текста из асинхронных каналов. Вот соответствующий отрывок:
Проблема с этим кодом заключается в том, что PrintWriter блокирует ввод-вывод и не поддерживает базовые механизмы асинхронного ввода-вывода. Чтобы справиться с этой проблемой, мы не можем использовать какие-либо стандартные утилиты ввода-вывода, но вместо этого должны обернуть наше сообщение в объект ByteBuffer и отправить его через объект SocketChannel
В вашем случае этот код не работает?
Вы сказали:
Я пытаюсь выяснить, как преобразовать объект в байт[]. Строки имеют метод getBytes(). Я не уверен, что использовать для общего сериализуемого объекта. Я использовал классы ObjectOutput / InputStream, но, согласно статье, если я их использую, это снова будет блокировать. Правильно ли я это понимаю?
Вы правы; обертывание потоков ввода-вывода с помощью ObjectInputStream
/ ObjectOutputStream
снова приведет к блокировке объектов. Решением здесь может быть обернуть ByteArrayOutputStream
в ObjectOutputStream
и записать ваши объекты в базовый массив байтов. Этот базовый поток байтов / массив теперь имеет байтовое представление (которое, очевидно, соответствует спецификации сериализации Java) вашего объекта. С этого момента это обычная работа с NIO. В случае, если вам интересно, есть несколько приятных обсуждений здесь и здесь, связанных с тем, о чем я говорю.
РЕДАКТИРОВАТЬ: Кроме того, я согласен с автором статьи в том, что NIO сложно настроить правильно. Автор рекомендует Apache Mina, но я хотел бы добавить еще одну рекомендацию, «Jboss Netty». Автор Netty часто посещает SO, чтобы вы могли получать ответы на свои запросы.
Я также хотел бы отметить, что если вашей мотивацией является отправка через объекты Java, используйте фреймворк, который настроен на эти потребности, т. е. Java RMI или JBoss remoting. Намного проще, чем возиться с потоками объектов и т.д.
Комментарии:
1. Я полностью пропустил этот комментарий. Но да, я пытаюсь выяснить, как преобразовать объект в байт[]. Строки имеют метод getBytes(). Я не уверен, что использовать для общего сериализуемого объекта. Я использовал классы ObjectOutput / InputStream, но, согласно статье, если я их использую, он снова будет блокироваться. Я правильно это понимаю?