Как сервер должен передавать данные богатому клиенту
Я пишу простую бухгалтерскую программу, состоящую из нескольких клиентов c# winform и серверного приложения java, которое читает / записывает данные в базу данных. Одним из требований является то, что все клиенты C# должны получать обновления с сервера. Например, если пользователь а создает новую накладную из своего клиента C#, другие пользователи должны видеть эту новую накладную из своего клиента.
Мой опыт в основном связан с веб-разработкой, и я не знаю, как лучше всего выполнить это требование с клиентом C#и Сервер сервлетов Java.
Моя начальная задача-запустить ActiveMQ с Glassfish и использовать метод messaging pub / sub, чтобы обновления можно было отправлять клиенту C#. Я создам различные темы, такие как newInvoice, cancelInvoice и т. д., чтобы дифференцировать тип сообщения. Каждое сообщение будет просто содержать объект, закодированный в JSON.
Но мне кажется, что это требует довольно большой работы. Учитывая, что моя база пользователей очень мала ( всего 3 или 4 одновременных пользователя), мне кажется, что должны быть и более простые решения. (Я не знаком с программированием сокетов :)) Я знаю, что это клиент-серверное программирование 101 вопрос, но было бы здорово, если бы любой опытный программист мог указать мне на некоторые простые решения.4 ответа:
Самый простой подходздесь часто заключается в том, чтобы просто использовать опрос - т. е. иметь запрос клиентов для данных каждый (ваш временной интервал). Это позволяет избежать целого семейства проблем (брандмауэры, безопасность, прямой обзор, разрешение, отслеживание клиентов и т. д.).
С помощью WCF можно выполнять обратные вызовы по дуплексным каналам (что позволяет серверу активно отправлять сообщения клиентам), но это более сложно. Я ценю простоту, поэтому обычно просто опрашиваю.
Трюки, которые помогают здесь, проектируют система должна иметь встроенный механизм для запроса "изменений с момента x" - например, таблицу аудита, возможно, подаваемую триггерами базы данных. Точные детали варьируются в зависимости от проекта, конечно.
Еще один вариант, который вы можете рассмотреть, это ADO.NET службы синхронизации; это делает многое из того, что вы просите, для поддержания локальной копии базы данных в актуальном состоянии с сервером - но имеет несколько собственных сложностей. Это доступно (IIRC) в шаблоне VS" локальный кэш базы данных".
Вместо того, чтобы передавать информацию с сервера на 1:N клиентов, не проще ли было бы, чтобы клиенты опрашивали сервер на предмет обновлений так часто ? Или когда клиент запускает и создает соединение с сервером, сервер может динамически генерировать новую очередь сообщений для этого соединения клиента, которую клиент может затем опрашивать для обновлений?
Существует несколько доступных вам push-технологий, таких как ActiveMQ (как вы упомянули) или XMPP. Но если у вас есть только 3 или 4 клиента, чтобы заботиться о себе, опрос будет самым простым решением. Он не очень хорошо масштабируется, но это не проблема в вашем случае, если ваш сервер не 8086 или что-то 8-)
Вы можете взглянуть наStreamHub Push Server - это популярный сервер Comet, написанный на Java, который имеет пакет SDK клиента .NET для получения обновлений с сервера на C#. Он также имеет JAVA Client SDK и обычную поддержку Ajax / Comet web browser, что дает вам больше гибкости в будущем для передачи данных на веб -, Java-и C# - клиенты.