2017-02-17 3 views
0

Я новичок в программировании сокета, и я пытаюсь написать простой чат-приложение. Мой сервер использует HashSet строк для хранения информации о имени пользователя, и я хочу передать HashSet от сервера к клиенту. Я смог сделать это раньше с ObjectOutputStream и ObjectInputStream над обычными сокетами. Тем не менее, в настоящее время я использую SocketChannel и это не позволяет этого я получаю следующее исключение:Запись и чтение объектов по Java NIO без блокировки SocketChannels

java.nio.channels.IllegalBlockingModeException 

Так я искал в Интернете о том, как это сделать, и все говорят, что что-то другое, и большинство идут путь над моей головой. Есть ли простой способ сделать это без полного переопределения методов writeObject и readObject?

Благодарю вас заранее.

+0

это возможно: слишком сложно. Придерживайтесь режима блокировки. – EJP

+0

@ EJP Lol спасибо, мне нужно сделать это без блокировки как часть моего класса сетевого программирования. – mks

ответ

1

Я рекомендую вам либо использовать неблокирующий режим, либо не использовать сериализацию.

Если вам необходимо, вы должны сериализоваться на ByteArrayOutputStream, получить длину, отправить длину, отправить байты, получить длину, продолжить чтение, аккумулировать данные, пока не получите правильную длину данных, поместите их в ByteArrayInputStream, и десериализуем из этого. Нелегко, особенно ручные махинации «продолжайте читать». И это тратит время и пространство.

+0

Спасибо, нет ли у кого-то общего шаблона, написанного где-то? вы бы подумали, что это распространенная проблема. – mks

+0

Вопрос был задан здесь раньше. – EJP

+0

Я имею в виду какой-то класс или метод, который использует Java-генераторы для обработки этого. – mks