Передача ссылки на (большую) область данных через сокет - PullRequest
0 голосов
/ 23 апреля 2009

Я читал описания ссылок в Java, и, хотя я чувствую, что понимаю их, я не уверен, что Java позволяет мне делать следующее: у нас есть два потока в одной JVM, взаимодействующие через сокеты, и мы хотел бы передать то, что по существу является адресом большого куска данных через сокет, без копирования самих данных. Решение может быть довольно очевидным для посвященных, но я не могу понять это! Помощь будет оценена.

Ответы [ 5 ]

1 голос
/ 24 апреля 2009

Что еще путешествует по этой розетке? Если это ваш собственный протокол, то добавьте в протокол глагол, который говорит: «достаньте эту большую вещь из известного места» и просто отправьте глагол. Сколько таких объектов есть? Можете ли вы сделать карту - строку, объект - и просто передать строку через сокет?

1 голос
/ 23 апреля 2009

AFAIK Java не предоставляет средства для получения ссылки на память объекта. Однако вам может пригодиться использование общего массива или общего вектора, в который вы помещаете данные как объект в вектор / массив и передаете индекс объекта через сокет.

0 голосов
/ 24 апреля 2009

Если вы передаете данные между двумя потоками одной и той же программы, вы можете просто передать ссылку на область через любой канал из пакета java.concurrent.

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

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

0 голосов
/ 23 апреля 2009

Есть два способа сделать это.

  1. поместите ссылку в глобальное местоположение, которое можно получить позже. Отправьте объект через сокет, который после сериализации будет преобразован в глобально доступную ссылку. (Работает только в той же JVM)
  2. Сделать большой объект доступным через RMI. Отправьте объект, который при сериализации создает RMI-прокси для вашего большого объекта.

Использование прямого API, который будет более эффективным и простым. Я предлагаю рассмотреть BlockingQueue.

0 голосов
/ 23 апреля 2009

Это возможно при использовании JNI, но я не думаю, что это возможно с чистой Java.

Учитывая, что вы находитесь в одной и той же JVM (и это единственный шанс, который у вас есть, заставить его работать, если вы не используете файл с отображением памяти), вам действительно нужно использовать сокеты? Разве вы не можете создать более «прямой» API?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...