Протокол:
Если вам не нужна совместимость с другими языками, я бы выбрал RMI по HTTP. Он имеет поддержку прямо из JRE, довольно прост в настройке и очень прост в использовании, если у вас есть фреймворк.
Для аппликативной логики я бы использовал:
- Шаблон команды, передающий объекты, которые при вызове вызывают методы на сервере. Это хорошо для небольших проектов, но со временем усложняется и добавляется больше команд. Кроме того, это требует, чтобы клиент был связан с логикой сервера.
- Запрос по имени + DTO подход. Преимущество этого заключается в том, что клиентская логика полностью отделена от клиентской логики, что позволяет серверной стороне свободно меняться по мере необходимости. Затраты на создание вспомогательной инфраструктуры немного больше, чем в первом варианте, но разделение клиента и сервера, на мой взгляд, стоит усилий.
Реализация:
Если вы еще не начали, или используете и используете Spring, Spring Remoting - отличный инструмент. Он работает везде (включая апплеты), даже если вы не используете контейнер IOC.
Если вы не хотите использовать Spring, базовый RMI также довольно прост в использовании и имеет множество примеров в Интернете.