Простой и надежный C# клиент-сервер используя WCF

https://www.clipartmax.com

WCF - Windows Communication Foundation, программный фреймворк, используемый для обмена данными между приложениями.

Почему стоит использовать это решение, а не сделать свой клиент-сервер ?

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

2. Решение не имеет большого объема кода, а значит понять данный код легче.

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

1. Создадим интерфейс ITransferObject

Интерфейс определяет как будет выглядеть объект, в котором будут методы работы нашего клиент-сервера. В WCF данный интерфейс называется контрактом.

Замечание
: если Вы создаете клиент-сервер не для теста в рамках одного приложения, а клиент и сервер будут разными приложениями, то Вам следует создать интерфейс ITransferObject и класс TransferObject в отдельной библиотеке dll. В таком случае Ваше клиентское и серверное приложения будут использовать одни классы и интерфейсы, что является Важным условием для WCF.
В данном примере определим, что данный объект будет иметь 2 простых метода:
GetSum - подсчет суммы двух целых чисел
GetMultiPly - подсчет умножения двух целых чисел

[ServiceContract] public interface ITransferObject { [OperationContract] int GetSum(int a, int b); [OperationContract] int GetMultiPly(int a, int b); }

[ServiceContract] - необходимый модификатор чтобы указать что данный интерфейс является контрактом WCF службы.
[OperationContract] - необходимый модификатор чтобы указать что данные методы будут использоваться в контракте.

2. Создадим класс TransferObject

Класс TransferObject унаследуем от интерфейса ITransferObject. Данный класс будет иметь простую реализацию наших методов.
При вызове метода GetSum будут переданы 2 целых числа.Ответом выполним сложение этих чисел.

Соответственно и с методом GetMultiPly - ответом выполним перемножение этих чисел.

public class TransferObject : ITransferObject { public int GetSum(int a, int b) { return a + b; } public int GetMultiPly(int a, int b) { return a * b; } }

3. Создадим серверную часть.

static void Main(string[] args) { var serviceAddress = "127.0.0.1:10000"; var serviceName = "MyService"; var host = new ServiceHost(typeof(TransferObject), new Uri($"net.tcp://{serviceAddress}/{serviceName}")); var serverBinding = new NetTcpBinding(); host.AddServiceEndpoint(typeof(ITransferObject), serverBinding, ""); host.Open(); Console.ReadKey(); }

serviceAddress - это адрес на котором сервер будет ожидать подключения от клиентов.
serviceName - имя сервиса. На каждом адресе может быть большое количество сервисов. Имя сервиса - часть адреса, по которому клиент подключается к серверу.
Далее происходит запуск серверной части WCF. Чтобы приложение не закрылось после отработки всего кода, добавлено Console.ReadKey() - ожидание нажатия любой клавиши.

4. Создадим клиентскую часть.

static void Main(string[] args) { var serviceAddress = "127.0.0.1:10000"; var serviceName = "MyService"; Uri tcpUri = new Uri($"net.tcp://{serviceAddress}/{serviceName}"); EndpointAddress address = new EndpointAddress(tcpUri); NetTcpBinding clientBinding = new NetTcpBinding(); ChannelFactory<ITransferObject> factory = new ChannelFactory<ITransferObject>(clientBinding, address); var service = factory.CreateChannel(); var sum = service.GetSum(4, 7); var multiply = service.GetMultiPly(3, 17); Console.WriteLine($"sum = {sum}"); Console.WriteLine($"multiply = {multiply}"); Console.ReadKey(); }

Строка подключения к серверу такая же как используется в серверной части: адрес_сервера + имя сервиса.

Далее происходит инициализация клиенской части WCF и вызов методов сложения и умножения чисел.

5. Запуск и проверка клиент-сервера

В первую очередь запускаем серверную часть, затем клиентскую.

6. Выводы:

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

Ссылка на код:

0
2 комментария
Влад Швецов

Есть один маленький ньюанс. На локальном компьютере подключение работает изумительно, но с переносом на сервер при подключении клиента к серверу выскочит Ошибка вызова SSPI. Это из особенностей пакетов безопасности.
В код клиента и сервера необходимо будет добавить следующие строки.
Для клиента:
clientBinding.Security.Mode = SecurityMode.None;
Для сервера:
serverBinding.Security.Mode = SecurityMode.None; 

Фотку для примера прикладываю)

Ответить
Развернуть ветку
Тагир Сюндюков

Спасибо тебе добрый человек, теперь у меня всё работает. Только я прописал в конфиге, а не в коде.

Ответить
Развернуть ветку
-1 комментариев
Раскрывать всегда