Как я могу сериализовать объект в неблокирующий сокет в Java - PullRequest
1 голос
/ 19 апреля 2011

Я читал о 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 Ответ

3 голосов
/ 19 апреля 2011

Не уверен, пропустили ли вы это или нет, но в статье четко сказано, что никакие обычные утилиты ввода-вывода не включатся и выйдет, чтобы представить пример кода для чтения и записи текста по асинхронным каналам.Вот соответствующая выдержка:

Проблема с этим кодом состоит в том, что PrintWriter блокирует ввод-вывод и не поддерживает базовые механизмы асинхронного ввода-вывода.Чтобы решить эту проблему, мы не можем использовать какие-либо стандартные утилиты ввода / вывода, но вместо этого должны обернуть наше сообщение в объект ByteBuffer и отправить его через объект SocketChannel

Этот код не работает вваш случай?

Вы сказали:

Я пытаюсь выяснить, как преобразовать объект в байт [].Строки имеют метод getBytes ().Я не уверен, что использовать для общего сериализуемого объекта.Я использую классы ObjectOutput / InputStream, но, согласно статье, если я их использую, он снова будет блокироваться.Я правильно это понимаю?

Вы правы;Обтекание потоков ввода / вывода ObjectInputStream / ObjectOutputStream снова приведет к блокировке.Решение здесь может заключаться в том, чтобы обернуть ByteArrayOutputStream в ObjectOutputStream и записать ваши объекты в базовый байтовый массив.Этот базовый байтовый поток / массив теперь имеет байтовое представление (которое очевидно следует спецификации Java-сериализации) вашего объекта.С этого момента это нормально с NIO.В случае, если вам интересно, есть несколько хороших обсуждений здесь и здесь , связанных с тем, о чем я говорю.

РЕДАКТИРОВАТЬ: Кроме того, я согласен сАвтор статьи, что NIO сложно получить право.Автор рекомендует Apache Mina, но я хотел бы добавить еще одну рекомендацию, «Jboss Netty».Автор Netty часто посещает SO, поэтому вы можете получить ответы на свои запросы.

Я также хотел бы отметить, что если ваша мотивация заключается в отправке через объекты Java, используйте инфраструктуру, которая настроена на эти потребности, то есть JavaRMI или JBoss удаленное взаимодействие.Гораздо проще, чем возиться с потоками объектов и т. Д.

...