Как создаются серверные приложения, как осуществляется взаимодействие клиент-сервер?

Я хотел бы иметь клиент-серверное приложение, написанное на .NET, которое будет делать следующее:

  • сервер работает под управлением линукс
  • на сервере есть база данных SQL (mySQL), содержащая URL-адреса документов

Что мы хотим: - серверная сторона будет регулярно сканировать все URL-адреса и создавать для них полнотекстовый индекс - клиентская сторона сможет выполнять запросы к этому индексу с помощью графического интерфейса.

Клиентское приложение написано на .NET с использованием C#. Помимо поиска в документах, он сможет делать много других вещей, которые здесь не описаны и которые очень хорошо выполняются на стороне клиента.

Мы хотели бы использовать C# и для серверной части, но у нас нет опыта в этой области. Как такие вещи обычно делаются?


Уточняющий вопрос теперь основан на некоторых ответах:

Больше всего мне неясно, как обычно осуществляется связь клиент-сервер. Клиент и сервер обычно используют сокеты, заботясь о таких деталях, как IP-адреса, порты или обход NAT? Или есть какие-то общие фреймворки и шаблоны, которые сделали бы это прозрачным и упростили обмен сообщениями между клиентом и сервером или вызов процедур? Любые примеры или хорошие отправные точки для этого? Существуют ли какие-то общие методы, как справиться с тем фактом, что один сервер требуется для одновременного обслуживания нескольких клиентов?


person Suma    schedule 26.01.2010    source источник
comment
Вам нужно будет использовать Mono, если вы хотите серверную часть Linux.   -  person UpTheCreek    schedule 26.01.2010
comment
Конечно, ничто не мешает вам, чтобы приложение .Net на стороне клиента взаимодействовало с реализацией сервера, отличной от .Net.   -  person UpTheCreek    schedule 26.01.2010
comment
.NET не является очевидным выбором для сервера Linux. Да, есть Mono, но его совместимость не гарантируется на 100%. Нет причин, по которым сервер не может быть (скажем) на Java, а клиент на C#, пока они общаются друг с другом.   -  person Dan Diplo    schedule 26.01.2010
comment
Какое приложение вы разрабатываете? это окажет большое влияние на решения, которые вы должны принять. Игры требуют большого количества двунаправленной связи с малой задержкой. Приложения Business/DB CRUD редко инициируются клиентом, могут иметь задержку в несколько секунд. Если вы дадите нам немного больше деталей, мы можем быть более конкретными в наших советах.   -  person David Waters    schedule 26.01.2010
comment
Java+C#: изучить веб-сервисы. По сути, вы (обычно) отправляете HTTP-запросы на сервер, а он отправляет вам обратно XML. Это похоже на использование браузера для удаленного вызова процедуры.   -  person TMN    schedule 26.01.2010
comment
Нет, на этот раз это не игра. У меня большой опыт работы с многопользовательскими играми, в которых мы используем сокеты UDP и подобные низкоуровневые конструкции. Это инструмент управления контентом, а именно его частью индексации и поиска. Для этого я бы предпочел что-то намного более высокого уровня. Веб-службы пока кажутся хорошими, объекты TCP .NET также могут выполнять эту работу.   -  person Suma    schedule 26.01.2010


Ответы (5)


Чтобы использовать c# в Linux, вам потребуется использовать Mono. Это реализация спецификации CLR с открытым исходным кодом.

Затем вам нужно решить, как взаимодействовать между сервером и клиентом, от самого низкого уровня простого открытия сокета TCP/IP и отправки битов вверх и вниз до удаленного взаимодействия .Net, WCF и предоставления веб-сервисов на сервере. Я не знаю, насколько завершена реализация WCF в моно, также я думаю, что у вас могут быть проблемы с бинарным удаленным взаимодействием между моно и MS .Net.

Я бы посоветовал WebServices в стиле RPC предложить очень хорошее решение. Веб-службы также имеют то преимущество, что позволяют легко подключаться клиентам с других платформ.

EDIT В ответ на уточнение вопроса. Я бы предложил использовать mono/ASP.NET/WebServices на сервере, если вы хотите использовать С# как на сервере, так и на клиенте.

Одно из предположений, которые я сделал, заключается в том, что вы можете использовать модель извлечения клиента, в которой каждое сообщение инициируется клиентом. Использование другого подхода может позволить серверу передавать события клиенту. Учитывая, что у клиента есть возможность регулярно подключаться к серверу, я не считаю это большим недостатком, но это может зависеть от типа разрабатываемого вами приложения.

Mono разрешает выполнение С# (скомпилированного в IL) в Linux-системе. Mono ASP.NET позволяет вам использовать стандартный ASP.NET и интегрироваться в Apache, см. http://www.mono-project.com/ASP.NET и, наконец, веб-службы позволяют вам надежно взаимодействовать строго типизированным образом между вашим клиентом и вашим сервером.

Использование этого подхода сводит на нет большинство проблем, поднятых в вашем пояснении, и делает их чужой проблемой.
Sockets/SSL — об этом заботится стандартная среда выполнения .Net на клиенте и Apache на сервере. .
IP-адрес/порты/обход NAT — обо всем позаботились. Поиск DNS позволит получить IP-адрес серверов. Открытый сокет позволит серверу отвечать через любой брандмауэр и настройку NAT.
Несколько клиентов. Apache создан для одновременной обработки нескольких клиентов, как и ASP.NET, поэтому вам не следует столкнуться с какими-либо проблемами там.

person David Waters    schedule 26.01.2010
comment
после комментария к вопросу. Я бы тоже посоветовал использовать на сервере более зрелую и поддерживаемую среду, например Java. C# и Java могут легко взаимодействовать друг с другом, используя Raw sockets/http/webserverices. - person David Waters; 26.01.2010

Как многие уже упоминали, есть ряд вещей, которые вы упомянули, которые причинят вам боль. Я не буду вдаваться в подробности, вместо этого я отвечу на ваш первоначальный вопрос об общении.

В настоящее время популярным выбором в этом виде связи являются веб-сервисы. Они позволяют совершать удаленные вызовы с использованием протокола HTTP и кодировать запросы и ответы в формате XML. Хотя у этого метода есть свои критики, я считаю, что его невероятно просто настроить и запустить, и он отлично работает практически для всех приложений.

Платформа .NET имеет встроенную поддержку веб-служб, которые определенно могут быть вызваны вашим клиентом. Беглый взгляд на веб-сайт mono показывает, что он также поддерживает веб-сервисы, поэтому написать свой сервер на C# и запустить его под mono должно быть нормально. Поиск в Google «Учебник по веб-службе С#» показывает множество сайтов, на которых есть информация о том, как начать работу, вот случайный выбор из этих результатов:

http://www.codeguru.com/Csharp/Csharp/cs_webservices/tutorials/article.php/c5477

person Jack Ryan    schedule 26.01.2010

взгляните на Grasshopper: "С Grasshopper вы можете использовать свою любимую разработку среду от Microsoft® для развертывания приложений на платформах с поддержкой Java, таких как Linux"

Или см. здесь

Идея состоит в том, чтобы преобразовать ваше приложение в Java, а затем запустить его на Tomcat или JBoss.

person lmsasu    schedule 26.01.2010


Это базовое клиент-серверное приложение для чата на C# выглядит как своего рода пример, который может быть отправной точкой для меня. Соответствующие классы .NET: TcpClient и TcpListener

person Suma    schedule 26.01.2010