консультации по архитектуре клиент-сервер - PullRequest
1 голос
/ 16 августа 2010

Я делаю концептуальное приложение, которое, возможно, однажды станет источником дохода.
Потоки данных диктуют, что должно быть клиент-сервер приложение, информация передаетсямежду клиентами и должны быть сохранены.

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

Так что теперь у меня есть протокол в виде интерфейса (C #) с вызовами методов.
Четыре из них предназначены для запроса информации, а два - для передачи данных.на сервер.
Данные в классах, которые я хотел бы заморозить и восстановить с другой стороны.

В будущем я хотел бы перенести клиент на другие ОС, поэтому я не хотел бы делать то, что мне нужно, чтобы переписать сервер с нуля, если я не могу избежать этого.

Я также хотел бы обновлять данные в клиенте с неопределенными интервалами.Сегодня я не знаю, как это сделать.
Мое приложение однопоточное, Windows Forms

Мои предположения таковы:
*Я буду использовать TCP / IP в какой-то форме ниже всего.Я должен настроить канал, установить IP-адреса и тому подобное, у меня есть идея, что мне нужно делать.
* Внешний интерфейс сервера будет многопоточным , чтобы разрешитьчтобы более чем один клиент мог общаться с сервером одновременно.Синхронизация будет внутренней по отношению к серверу.
* Прогнозируемый объем данных, максимум : текст 1000 * 1 Кбайт, 100 000 объектов с 4 состояниями.20 000 обновлений / день.Но это путь в будущее.

Может три самых больших вопрос -
1. Протокол связи .Как мне сопоставить вызовы моих методов, которые есть в интерфейсе, с чем-то, что я могу передавать по каналу TCP / IP?
2. Мне нужен совет по хорошему шаблону для сериализации чтенияи запись в «базу данных», база данных не обязательно должна быть сервером sql.
3. Могу ли я позволить серверу отправлять обновления клиенту, не делая его многопоточнымприложение с одним потоком, слушающее только сокет?

Я с радостью обновлю свой вопрос, если потребуется дополнительная информация.
Заранее спасибо.
Gorgen

Ответы [ 4 ]

0 голосов
/ 18 августа 2010

Я просто хотел добавить немного мяса в ответ Agent_9191 и записать шаги, которые я предпринял для потомков:

Вопрос 1

  • Читать Учебник по началу работы осторожно (нет, я не хотел, но хотел бы, чтобы я сделал)

  • Изменил пример на мой собственный интерфейс

  • Сгенерированный по умолчанию прокси-сервер довольно существенно меняет интерфейс; Все классы коллекции сделаны в массив, и все классы, которые вы хотите передать, удалены из всех методов, благодаря механизму доставки. Для доступа к классам домена как на сервере, так и на клиенте следуйте совету этого поста

  • Классы домена, которые будут использоваться, должны быть сериализуемы с [DataContract] и [DataMember] из System.Runtime.Serializion.dll

  • Эти образцы WCF помогли мне понять, что происходит тоже

Вопрос 2

  • Сделал класс, который снова реализовал мой интерфейс
  • добавлен статический экземпляр в Сервис
    private static MyManager myManager = new MyManager();

  • просто переадресовал все звонки
    public Project[] GetProjects() { return myManager.GetProjects(); }

Вопрос 3

Двусторонний контракт: Как: создать дуплексный контракт

Пока у меня будет состояние в памяти, а не в базе данных, когда я изменю это, я пересмотрю подход.

0 голосов
/ 16 августа 2010

1) Пожалуйста, уточните этот вопрос немного. Я не совсем понимаю, что именно вы хотите объяснить здесь.

2) Я не уверен, что вы подразумеваете под этим (ничего не знаю о шаблонах в смысле программирования), но не было бы разумнее читать и писать асинхронно, чтобы вы могли обращаться к базе данных только тогда, когда читать / писать

3) Да, это выполнимо, но вы действительно должны создать другой поток для обновления ваших клиентов. Это целесообразно по нескольким причинам, но, в основном, вы хотите максимально разделить логику программы, чтобы вам было намного проще выявлять проблемы в программном обеспечении.

0 голосов
/ 16 августа 2010

Судя по звукам, WCF прямо в вашем переулке. Хотя на первый взгляд это может показаться немного сложным, когда вы начнете копаться в этом, все довольно просто. Таким образом, вы позволяете платформе обрабатывать асинхронные вызовы и подключать ее к сетевой стороне.

Что касается сервера, отправляющего обновления клиенту, вам нужно рассмотреть дуплексную привязку в WCF и на стороне сервера, поддерживающую список известных (подключенных) клиентов. Конечно, оберните все вызовы обратно в блоки try-catch, поскольку вы никогда не знаете, когда произойдет сбой и клиент внезапно станет недоступен.

0 голосов
/ 16 августа 2010

Получается, как хороший кандидат от .Net remoting.

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

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