Как передать метод или объект с клиента на сервер в Java?

У меня несколько клиентов и один сервер. Каждый клиент имеет в своем распоряжении несколько команд, например:

public interface Command {
 public int run();
}

public class CommandOne implements Command {
 // ...
}

public class CommandTwo implements Command {
 // ...
}

Эти команды могут выполняться в клиенте (на их машине) - или они могут быть "переданы" на сервер, который будет выполнен, и затем результат будет возвращен.

Каков самый простой способ реализации как клиента, так и сервера в Java?

Ниже приводится то, что я придумал:

  • Сериализовать команду, передать ее серверу, выполнить десериализацию сервера, запустить команду и вернуть результат. (Это не сработает, потому что методы не могут быть сериализованы.)
  • Передайте имя команды (как String) на сервер, запустите на сервере команду switch, создайте новую команду того же типа, запустите ее и верните результат. Это означает, что если я когда-либо добавлю новый класс команд, мне придется обновлять как клиент, так и сервер.
  • Сериализуйте логику необходимого метода в какую-либо структуру (JSON, XML и т.д.), Передайте ее серверу, выполните десериализацию сервера в пользовательский класс, запустите логику метода и верните результат. Это кажется излишним и требует написания DSL.

Есть что-то, что мне не хватает?

РЕДАКТИРОВАТЬ

Каждый запрос должен быть потоковым в некотором роде - поскольку несколько клиентов могли одновременно связываться с сервером. Это, вероятно, не проблема с вышеупомянутой проблемой.

2 ответа

В уродливом мире простая вещь, которую вы могли бы сделать, это заставить ваш сервер выставлять интерфейс, такой как

/commands?run=CommandOne

и передать некоторые параметры (в теле или строке запроса) для хранения параметров команды.

Затем используйте некоторый HTTP-клиент для отправки HTTP-запроса в этот URI. Сервер будет создавать экземпляр и отправлять некоторую команду для выполнения того, что вы хотели.

В более структурированном мире вы должны заглянуть в вызовы RPC или архитектурный стиль RESTful.


Одно из решений, которое я нашел очень элегантно и весело.

Если вы откроете порт и у вас есть слушатель, который просто ждет входа "Runnable", вы можете выполнить метод run. Все переменные будут переданы, и все, что будет выполняться, будет выполнено.

Даже немного лучше иметь метод "runOnServer()" и "runOnClient()". клиент создает объект, передает его на сервер и идет по нему, сервер выполняет метод runOnServer() (против переменных, поскольку они были сериализованы), тогда класс автоматически сериализуется обратно клиенту, где runOnClient() материал выполняется.

Делает это действительно гладким, чтобы выполнить что-то на сервере.

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

licensed under cc by-sa 3.0 with attribution.