Расширьте SocketChannel, чтобы добавить настраиваемое чтение и запись

Я пытаюсь отправить сериализованный объект по каналам. Идея состоит в том, чтобы расширить SocketChannel конструктором метода, который сохраняет объект для отправки, и добавить метод writeObj() для отправки размера сериализованного объекта, за которым следует сериализованный объект.

Используя приватное поле, я пытаюсь управлять всей процедурой в неблокирующем режиме, поэтому в конструкторе сохраняю объект для сериализации в поле ByteBuffer src и writeObj() записываю объект, используя super.write(ByteBuffer src). (соответственно Object readObj(), которые возвращают null, если объект не получен полностью, или объект, если super.read() возвращает -1)

Проблема в том, что SocketChannel является абстрактным классом, поэтому super.read() и super.write(..) не разрешены.

Должен ли я расширить SocketChannelImpl или есть другой правильный способ сделать это?


person Alessandro    schedule 08.05.2016    source источник


Ответы (1)


Классическая задача XY.

Расширить SocketChannel

Вы не можете.

чтобы добавить пользовательское чтение и запись

Вы не можете.

Я пытаюсь отправить сериализованный объект по каналам. Идея состоит в том, чтобы расширить SocketChannel конструктором метода, который сохраняет объект для отправки, и добавить метод writeObj() для отправки размера сериализованного объекта, за которым следует сериализованный объект.

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

Используя приватное поле, я пытаюсь управлять всей процедурой в неблокирующем режиме, поэтому в конструкторе сохраняю объект для сериализации в поле src ByteBuffer и записываю объект writeObj(), используя super.write(ByteBuffer src).

Я не понимаю, какое отношение ко всему этому имеет «использование закрытого поля», учитывая, что на практике вы не можете расширить SocketChannel в первую очередь: я также не понимаю, зачем нужно личное поле или почему вы так бы подумал.

(соответствующий объект readObj(), возвращающий null, если объект не получен полностью, или объект, если super.read() возвращает -1)

Это уже две основные ошибки проектирования. Если объект получен не полностью, вы должны продолжать получать, и если EOS происходит до того, как объект будет полностью получен, вы должны создать исключение, а не возвращать что-либо.

Проблема в том, что SocketChannel является абстрактным классом, поэтому super.read() и super.write(..) не разрешены.

Проблема в том, что (а) ваш подход к дизайну и (б) ваши детали дизайна оба (в) в корне ошибочны и (г) совершенно не нужны. Вам не нужен дополнительный код, кроме того, что требуется для получения любого сообщения протокола приложения в неблокирующем режиме. Это сложно, так как вам приходится иметь дело с частичным чтением и преждевременным завершением потока у получателя, а также с частичной записью у отправителя, но это не требует расширения SocketChannel или других упомянутых вами мер.

Должен ли я расширять SocketChannelImpl

No.

или есть другой правильный способ сделать это?

Здесь много сообщений о том, как справиться с обоими условиями.

person user207421    schedule 08.05.2016