Как отправить «командный» объект через сокеты, чтобы его выполняли на сервере? Джава - PullRequest
0 голосов
/ 28 апреля 2018

Я работаю над программой чата.

[JAVA] [Без RMI, только сокеты] [Пример команды: 'sentToMike', 'Disconnect', 'Login' и т. Д.]

Как я могу отправить объект «команда» через сокеты для непосредственного выполнения на сервере? Я хочу отправлять всевозможные сообщения (Strings, Audio, Video) и все виды объектов Command многим клиентам, любым из них. Я знаю, что существуют объекты ObjectInput / Output и все такое. Моя проблема - попытка получить полиморфное решение.

Например, я хочу создать интерфейс IMessage с сигнатурой метода "execute ()". Затем я бы создал AudioMessage, TextMessage и т. Д., Который реализует IMessage. Проблема в том, что в какой-то момент мне нужно поделиться кодом сервера с клиентом и наоборот, чтобы сервер и клиент знали все объекты, участвующие в каждом исключительном методе. И хуже всего то, что если я отправлю IMessage, сервер не будет знать, какой конкретно тип сообщения, так что я не знаю, к какому типу приведен объект. То же самое произойдет, когда я отправлю команду клиенту.

Я могу работать над решением с помощью простых текстовых строк "команд" и большим и некрасивым переключателем на сервере (и, между прочим, на клиенте), но я считаю, что это не элегантно, мне нужно создать класс-оболочку с помощью команды string плюс объект того типа, который я хочу отправить, плюс строку с типом отправленного объекта (Message [String type; String command; IMessage-> AudioMessage]), это не будет полиморфным, поскольку мне нужно будет использовать переключатель, чтобы спросить тип объекта и затем привести его к AudioMessage, например. Кроме того, мне нужно было бы поделиться большим количеством кода между сервером и клиентом, и я не знаю, будет ли это нормально

Любой совет будет очень кстати, может быть, мне нужен шаблон проектирования, шаблон архитектуры, я понятия не имею.

1 Ответ

0 голосов
/ 28 апреля 2018

Существует причина безопасности, запрещающая запуск любого кода на сервере!

Но если вы готовы предоставить свой сервер (и клиент) неизвестному коду, то вам также нужно обслуживать байт-код классов и иметь загрузчики классов, чтобы разрешить создание типов классов, которые вы ожидаете принять с другой стороны. Ваш протокол должен будет отправить полное имя класса и местоположения (если он не включен в байт-код) класса пришельцев (и все его зависимости, не найденные в родительском загрузчике классов), чтобы надеяться вызвать любой метод такого объекта.

(К вашему сведению, это просто переизобретение RMI).

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

...