Отправка объектов через неблокирующие сокеты Java NIO - PullRequest
1 голос
/ 12 апреля 2011

Я получаю исключение при попытке использовать:

oos = new ObjectOutputStream(socketChannel.socket().getOutputStream());
oos.writeObject(o);

И возникает исключение:

java.nio.channels.IllegalBlockingModeException

Разве нельзя передавать объекты в неблокирующие сокеты? Если да, то как мне поступить при передаче объектов сообщения через каналы сокетов?

Я искал другие ответы на этот вопрос, но не смог найти ...

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Возможно, вы захотите написать свою собственную реализацию ObjectOutputStream, которая создает ByteBuffer и write() s для канала.

С неблокирующими сокетами вы не можете напрямую использовать каналразъем;вам нужно использовать методы канала read() и write().

Когда вы пишете свой собственный ObjectOutputStream, вам в основном нужно переопределить методы write() для буферизации вывода и использовать flush() метод записи буфера в канал.Затем переопределите метод writeObject(), чтобы он выглядел следующим образом:

public void writeObject(Object o) throws IOException {
    super.writeObject(o);
    flush();
}

, чтобы обеспечить запись данных после каждой записи объекта.

0 голосов
/ 14 апреля 2011

Прошло много времени с тех пор, как я работал в этой области, но это казалось более сложным, чем просто завершение writeObject.java.nio обычно ожидает буферы фиксированного размера (хотя я считаю, что вы можете динамически распределять их), и вашим удаленным конечным точкам нужно знать, сколько нужно прочитать для произвольного Object спускающегося по проводу.В итоге я отправил начальный заголовок int, сообщающий на другой конец, сколько данных ожидать, а затем сериализовал объект в байтовый массив и отправил его по проводам.

У меня есть пример этого , в котором все еще могут быть ошибки, поэтому используйте его на свой страх и риск.PendingDataBufferS необходимы для работы с объектами, размер которых превышает изначально выделенный буфер фиксированного размера.

...