Передача массива больших байт клиенту

#java #communication #bytearray #rmi #aio

#java #Информационные материалы #массивы #rmi #aio

Вопрос:

Позвольте мне представить мою ситуацию.

У меня много данных в байтах, хранящихся в файлах на сервере. Я пишу и читаю эти файлы, используя AIO, который поставляется в JDK7. Таким образом, я использую ByteBuffer (ы) для операций чтения и записи.

Вопрос в том, что после того, как я выполнил чтение в AsynchronousFileChannel, я хочу передать содержимое ByteByffer, которое использовалось в операции чтения, клиенту. Таким образом, я действительно хочу отправить байты.

Каков был бы наилучший способ начать отсюда. Я не хочу отправлять ByteBuffer, потому что у меня есть их пул, который я повторно использую, поэтому это не вариант. Я хочу также иметь возможность, возможно, даже комбинировать несколько операций чтения и отправлять содержимое нескольких байтовых буферов одновременно.

Итак, что мне отправить. Просто массив byte[]? Или мне нужен какой-то поток? Каким будет лучшее решение в отношении производительности здесь.

Я использую RMI для связи.

Заранее благодарю.

Комментарии:

1. переназначил ваш вопрос с помощью java. Больше шансов получить ответ таким образом.

2. Если производительность критична, я бы не использовал стандартный Java RMI. Все остальное, что вы делаете, вряд ли что-то изменит. Если вам нужно использовать Java RMI, я бы не слишком беспокоился о производительности. 😉

Ответ №1:

Вы можете имитировать потоки через rmi, используя библиотеку RMIIO, которая позволит вам передавать произвольное количество байтов через RMI, не вызывая проблем с памятью на обоих концах.

(отказ от ответственности, я написал библиотеку)

Ответ №2:

Если нет очень веской причины не делать этого, тогда просто отправьте массив байтов вместе с достаточным количеством метаданных, чтобы вы могли обеспечить надежное обслуживание.

Чем меньше базовой реализации вам нужно передавать туда и обратно через RMI, тем лучше. Особенно когда вы работаете с Java 7, которая еще не является общедоступной.

Комментарии:

1. На самом деле нет веской причины не делать этого. Я думаю, что я пойду этим путем, потому что он самый простой и не требует привлечения какого-либо другого компонента / библиотеки / чего-либо еще.

Ответ №3:

Чтобы использовать RMI, вы должны извлечь содержимое буфера в виде byte[] , затем записать его в ObjectOutputStream (запись происходит под прикрытием). Предполагая, что в данный момент вы используете прямые буферы, это означает процессорное время для создания массива в куче Java и процессорное время для сбора мусора из этого массива после его записи, а также возможность того, что поток будет удерживать ссылку слишком долго, вызывая ошибку нехватки памяти.

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