Создание удаленного сервера с помощью Visual C#
Эта статья поможет вам создать удаленный сервер, к которому другое приложение может получить доступ с помощью Visual C#.
Исходная версия продукта: Visual C #
Исходный номер базы знаний: 307445
Аннотация
В этой статье показано, как создать удаленный сервер, к которому может получить доступ другое приложение. Приложение, обращающееся к этому серверу, может находиться на том же компьютере, на другом компьютере или в другой сети. Удаленный сервер разбивается на две части: объект сервера и серверное приложение. Объект сервера — это объект, с которым взаимодействует клиент, и серверное приложение используется для регистрации объекта сервера в платформе удаленного взаимодействия .NET.
В этой статье рассматриваются следующие пространства имен библиотеки классов Microsoft платформа .NET Framework:
- System.Runtime.Remoting
- System.Runtime.Remoting.Channels
- System.Runtime.Remoting.Channels.Tcp
Требования
В этой статье предполагается, что вы знакомы со следующими разделами:
- Visual Studio .NET или Visual Studio
- Visual C# .NET или Visual C #
- Сеть
Создание объекта удаленного сервера
Первым шагом при создании серверного приложения является создание объекта сервера. Объект сервера — это то, что клиентское приложение создает экземпляр и взаимодействует с ним на серверном компьютере. Клиентское приложение делает это через прокси-объект, созданный на клиенте. В этом примере объект сервера находится в библиотеке классов (DLL) и называется myRemoteClass.
- Создайте приложение библиотеки классов в Visual C# .NET. Назовите проект ServerClass. Класс 1 создается по умолчанию.
- В Обозреватель решений переименуйте файл кода Class1.cs в ServerClass.cs.
- Откройте файл ServerClass.cs и переименуйте Class1 в myRemoteClass. Необходимо также переименовать конструктор по умолчанию для класса в , чтобы он соответствовал имени класса. класс myRemoteClass должен наследоваться MarshalByRefObject от класса . Теперь ваш класс должен выглядеть следующим образом:
public class myRemoteClass: MarshalByRefObject < public myRemoteClass() < // TO DO: Add constructor logic here. >>
public bool SetString(String sTemp) < try < Console.WriteLine("This string '' has a length of ", sTemp, sTemp.Length); return sTemp != ""; > catch < return false; >>
Создание удаленного серверного приложения
После создания объекта сервера, с которым будет взаимодействовать клиент, необходимо зарегистрировать этот объект в платформе удаленного взаимодействия. При регистрации объекта необходимо также запустить сервер и заставить сервер прослушивать порт, чтобы клиенты подключились к нему. Для этого требуется тип проекта, который выводит исполняемый файл.
Причина включения объекта сервера в отдельный проект заключается в том, что вы можете легко ссылаться на серверный объект из клиентского проекта. Если вы включите его в этот проект, вы не сможете ссылаться на него, так как ссылки могут быть заданы только для DLL-файлов.
- Создайте консольное приложение в Visual C# .NET, чтобы запустить удаленный сервер. Класс 1 создается по умолчанию.
- В Обозреватель решений переименуйте файл Class1.cs в RemoteServer.cs.
- Добавьте ссылку на System.Runtime.Remoting пространство имен.
- Добавьте ссылку на сборкуServerClass.dll , созданную в предыдущем разделе.
- Используйте инструкцию using для Remoting пространств имен , Remoting.Channels и Remoting.Channels.TCP , чтобы позже в коде не требовалось квалифицировать объявления в этих пространствах имен. Оператор необходимо использовать using перед любыми другими объявлениями.
using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp;
TcpChannel chan = new TcpChannel(8085); ChannelServices.RegisterChannel(chan);
- Полное имя типа регистрируемого объекта (в этом примере — ServerClass.myRemoteClass ), за которым следует имя сборки ServerClass. Укажите здесь имя пространства имен, а также имя класса. Так как пространство имен не указано в предыдущем разделе, используется корневое пространство имен по умолчанию.
- Назовите конечную точку, где объект будет опубликован, как RemoteTest. Чтобы подключиться к объекту, клиенты должны знать это имя.
- SingleCall Используйте режим объекта, чтобы указать окончательный параметр. Режим объекта указывает время существования объекта при его активации на сервере. В случае SingleCall объектов создается новый экземпляр класса для каждого вызова, который выполняет клиент, даже если один и тот же клиент вызывает один и тот же метод несколько раз. С другой стороны, Singleton объекты создаются только один раз, и все клиенты взаимодействуют с тем же объектом.
RemotingConfiguration.RegisterWellKnownServiceType( System.Type.GetType("ServerClass.myRemoteClass, ServerClass"), "RemoteTest", WellKnownObjectMode.SingleCall);
System.Console.WriteLine("Hit to exit. "); System.Console.ReadLine();
Ссылки
- Класс TcpChannel
- Метод RemotingConfiguration.RegisterWellKnownServiceType
Общие сведения о удаленном взаимодействии .NET см. в документации по платформа .NET Framework руководства разработчика.
Создание клиент-серверного приложения C#
Раньше я всегда создавал приложения на C# с помощью WinForms или WPF , в которых напрямую обращался к локальной базе данных через запросы с помощью SqlCommand или EntityFramework . Но как я понимаю это не лучшее решение, если, например, создавать приложение не только для себя, а для нескольких пользователей. Если я правильно понимаю, то клиент-серверное приложение — это клиент, с которым работает пользователь и который отправляет запросы к серверу, и собственно сам сервер, который принимает и обрабатывает запросы, а после отдаёт какой-то ответ. Клиент — это допустим WPF -приложение, в котором мы должны отправлять запросы к серверу, но я не совсем понимаю, что именно должно выполнять роль сервера, на чем его писать и как подключать к клиенту. Так как я никогда не работал с API и не создавал серверной части, то мне непонятно что именно гуглить для ответа на свой вопрос, всё, что я нашёл — это что сервер можно создать на ASP.NET WebAPI, но в данной статье только первая часть, посвященная созданию клиента. Итак, если обобщить всё выше написанное, то мой вопрос — как и на чем можно написать сервер для клиент-серверного приложения, где клиент — это WPF -приложение, и как потом этот сервер подключить к клиенту. P.S Понимаю, что вопрос достаточно тривиальный для C#-программистов, но так как сталкиваюсь впервые с этим, то мне подойдут ссылки на статьи, названия библиотек, ссылки на документацию и так далее, любая информация чтобы понять куда рыть для ответа на мой вопрос.
Отслеживать
задан 1 июл 2022 в 13:12
449 2 2 серебряных знака 14 14 бронзовых знаков
ASP.NET Core WebAPI — нормальное решение
1 июл 2022 в 13:31
плюсую комментарий @aepot, вот тут вы можете почитать подробнее о том как сделать такое приложение
1 июл 2022 в 13:31
Спасибо, буду смотреть в этом направлении, @iKuzmychov может быть есть какая-то статья по созданию клиент-серверного приложения именно wpf + asp,net?
1 июл 2022 в 13:34
@Pekor в WPF клиенте нет особо отличающегося, от того же WinForms. План довольно простой: 1. создаёте модели (классы) для таблиц базы данных и выносите их в отдельный проект «XXX.Models», чтобы ссылаться на него из других проектов 2. делаете проект «XXX.WebApi» — серверную часть приложения на ASP.NET, в которой создаёте контроллеры, которые взаимодействуют с БД и возвращают JSON в ответ 3. Создаёте проект «XXX.WebApiClient», в котором создаёте классы (обычно хватает одного), которые делают HTTP запросы к вашему API и парсят ответы в C# объекты 4. Используете API-клиет в WPF приложении
Как создать клиент серверное приложение c
Класс Socket применяется не только для создания tcp-клиента, но для определения tcp-сервера. Общая схема работы серверного сокета TCP будет следующей:

Привязка к конечной точке. Метод Bind
Вначале серверный сокет с помощью метода Bind связывается с локальной точкой. В качестве параметра этот метод принимает локальную точку EndPoint, на которой сокет будет принимать подключения от клиентов:
public void Bind (EndPoint localEP);
Если не имеет значения, на каком именно локальном адресе сервер будет запущен, то можно в качестве адреса использовать значение IPAddress.Any . Тогда серверу будет назначен наиболее подходящий сетевой адрес (при наличии нескольких сетевых интерфейсов). Кроме того, если номер порта не имеет значения, то в качестве порта можно указать число 0. Тогда серверу будет предоставлен один из доступных портов. При использовании такого подхода точный адрес и порт затем можно будет получить через свойство LocalEndpoint .
using System.Net; using System.Net.Sockets; IPEndPoint ipPoint = new IPEndPoint(IPAddress.Any, 8888); using Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(ipPoint); // связываем с локальной точкой ipPoint // получаем конечную точку, с которой связан сокет Console.WriteLine(socket.LocalEndPoint); // 0.0.0.0:8888
В этом примере сокет будет прослушивать подключения по 8888 порту на любых локальных адресах. То есть клиент должен будет подключаться к локальному адресу, например, к 127.0.0.1, и порту 8888.
Прослушивание подключений. Метод Listen
Для запуска прослушивания подключений на выбранной локальной конечной точке применяется метод Listen :
public void Listen (); public void Listen (int backlog);
При обращении к серверу входящие подключения помещаются в очередь для последующей обработки. По умолчанию эта очередь допускает 2147483647 подключений. Вторая версия метода Listen через параметр позволяет переопределить длину очереди.
stem.Net; using System.Net.Sockets; IPEndPoint ipPoint = new IPEndPoint(IPAddress.Any, 8888); using Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(ipPoint); // связываем с локальной точкой ipPoint socket.Listen(1000); // запускаем прослушивание // количество входящих подключений, которые можно поместить в очередь, равно 1000
Подключение клиента
После начала прослушивания сокет готов принимать подключения. Для приема подключений применяются методы Accept()/AcceptAsync() . Эти методы имеют ряд перегруженных версий. Отмечу саму простую из них:
public Task AcceptAsync ();
Все версии методов Accept()/AcceptAsync() в качестве результа возвращают объект Socket, который инкапсулирует входящее подключение, то есть по сути представляет подключенного клиента.
using System.Net; using System.Net.Sockets; IPEndPoint ipPoint = new IPEndPoint(IPAddress.Any, 8888); using Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(ipPoint); socket.Listen(); Console.WriteLine("Сервер запущен. Ожидание подключений. "); // получаем входящее подключение using Socket client = await socket.AcceptAsync(); // получаем адрес клиента Console.WriteLine($"Адрес подключенного клиента: ");
Через свойства Socket можно получить информацию о подключении клиента, в частности, свойство RemoteEndPoint позволяет получить адрес подключенного клиента.
Для такого просто сервера для теста определим клиент. Возьмем новый проект консольного приложения на C# и определим в нем следующий код:
using System.Net.Sockets; using var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try < await socket.ConnectAsync("127.0.0.1", 8888); Console.WriteLine($"Подключение к установлено"); > catch (SocketException) < Console.WriteLine($"Не удалось установить подключение с "); >
Здесь в метод ConnectAsync передаем данные конечной точки сервера и при успешном подключении выводим сообщение.
Запустим сервер, а затем запустим клиент. В итоге после подключения клиента к серверу в консоли сервера мы увидим что-то наподобие:
Сервер запущен. Ожидание подключений. Адрес подключенного клиента: 127.0.0.1:52767
В данном случае мы видим, что в моем случае для подключения к серверу сокет-клиент использует адрес 127.0.0.1:52767. А в консоли клиента отобразится сообщение об успешном подключении:
Подключение к 127.0.0.1:8888 установлено
Создание клиентского или серверного приложения DCOM с помощью Visual Basic
В этой статье описывается создание, упаковка и развертывание клиентского или серверного приложения модели распределенных компонентов (DCOM) с помощью Visual Basic.
Исходная версия продукта: Visual Basic
Исходный номер базы знаний: 266717
Аннотация
В этой статье показано, как создавать, упаковывать и развертывать клиентское или серверное приложение DCOM с помощью Visual Basic. Чтобы создать клиент или серверное приложение DCOM, вам потребуется выпуск Enterprise Visual Basic. Корпорация Майкрософт предполагает, что читатель уже знаком с созданием клиентских и серверных приложений, которые выполняются на одном компьютере.
Дополнительные сведения
Вам не нужно изменять код, чтобы разрешить клиентским приложениям создавать экземпляры удаленного сервера с помощью DCOM. Разница заключается в способе упаковки и развертывания клиента. Кроме того, после установки клиента и сервера необходимо внести некоторые параметры безопасности. Эти параметры можно задать с помощью служебной программы Dcomcnfg.
Ниже показано, как распространять и настраивать клиентское или серверные приложения. Приведите имя DCOMDemo_Svr и имя клиента DCOMDemo_Cli. Создайте отдельную папку для каждого из них. Для целей этой статьи вызовите эти папки c:\DCOMDemo\Server and c:\DCOMDemo\Client .
Создание сервера
- Запустите новый проект Visual Basic. В диалоговом окне «Новый проект» выберите ActiveX EXE и нажмите кнопку » Открыть». Класс 1 создается по умолчанию.
- Добавьте следующий код в модуль Class1:
Public Function ServerTime() As String ServerTime = Time End Function
Примечание. Этот параметр всегда следует проверять на серверах, на которых нет пользовательского интерфейса, чтобы гарантировать, что диалоговые окна любого типа не отображаются во время работы сервера. Если у вас есть какой-либо тип взаимодействия с пользователем во время работы сервера с удостоверением, которое не является интерактивным пользователем, ваш сервер может зависнуть.
Примечание. При проверке этого параметра компилятор Visual Basic создает файлы VBR и TLB, необходимые для упаковки клиентских приложений, использующих этот сервер. Эти файлы содержат записи реестра, которые необходимо включить на клиентский компьютер.
Создание клиента
- В меню «Файл » выберите параметр « Создать проект», выберите стандартную EXE и нажмите кнопку » ОК». Form1 создается по умолчанию.
- В меню «Проект » выберите параметр «Свойства проекта » и откройте вкладку «Общие «.
- В поле «Имя проекта » введите DCOMDemo_Cli.
- В поле «Описание проекта » введите DCOMDemo_Cli Project — Client.
- В меню «Проект » выберите » Ссылки». В списке доступных ссылок выберите DCOMDemo_Svr — Server.
- Поместите кнопку команды в Form1 и измените заголовок кнопки на «Выполнить».
- Поместите следующий код в событие нажатия кнопки:
Dim MyObj As DCOMDemo_Svr.Class1 On Error GoTo err1 Set MyObj = CreateObject("DCOMDemo_Svr.Class1") MsgBox "Server Time=" & MyObj.ServerTime & " Client Time=" & Time Exit Sub err1: MsgBox "Connection failed: Error " & Err.Number & " - " & Err.Description
Упаковка сервера
Используйте мастер упаковки и развертывания для упаковки сервера для распространения как обычно. Экземпляр сервера создается удаленным клиентом с помощью DCOM. При создании пакета для сервера вы получаете диалоговое окно с вопросом, будет ли этот сервер использоваться в качестве сервера удаленной автоматизации и нужно ли включать файлы поддержки для этой цели. Просто нажмите кнопку «Нет «, так как DCOM не является удаленной автоматизацией. Удаленная автоматизация — это более старая технология, которая была заменена DCOM.
Упаковка клиента
При упаковке клиента необходимо выполнить определенные действия, учитывая, что сервер работает не на том же компьютере, что и клиент. Изменения, внесенные в пакет клиента, гарантируют установку только библиотеки типов (TLB-файла) и включение некоторых дополнительных записей реестра вместо исполняемого файла сервера, что не требуется на компьютере клиента, так как он не будет выполняться на нем.
Укажите пакет клиента, выполнив следующие действия.
- Запустите мастер упаковки и развертывания, а затем выберите проект клиента.
- Нажмите кнопку «Пакет «. В диалоговом окне «Тип пакета» выберите стандартный пакет установки и нажмите кнопку » Далее».
- В диалоговом окне «Папка пакета» выберите папку для хранения пакета и нажмите кнопку » Далее». В этом случае это c:\DCOMDemo\Client\Package.
Примечание. Может появиться диалоговое окно с сообщением об отсутствии сведений о зависимостях для сервера. Нажмите кнопку « ОК», так как этот сервер не имеет зависимостей.
Примечание. Эти два файла включаются в DCOMDemo_Svr.VBRи DCOMDemo_Svr.TLB. Нажмите кнопку «Далее «. В диалоговом окне «Удаленные серверы» можно определить имя компьютера (Net Address), на котором запущен сервер. Обычно это поле пустое, так как заранее не знаете, где будет установлен сервер. Если оставить его пустым, при установке клиента вам будет предложено его выполнить. В этом примере оставьте его пустым.
Установка сервера
Установите сервер на компьютере, на котором вы хотите его запустить, используя созданный ранее пакет распространения. Если вы хотите использовать компьютер разработки для запуска сервера, устанавливать его не нужно, так как Visual Basic выполняет регистрацию при компиляции сервера.
Установка клиента
Установите клиент на компьютере, на котором вы хотите его запустить, используя созданный ранее пакет распространения. Так как этот клиент использует сервер DCOM, а фактическое расположение сервера остается пустым при создании пакета распространения, необходимо указать это расположение. Когда программа установки предложит указать это расположение, укажите имя компьютера, на котором установлен сервер.
Настройка безопасности сервера
Если сервер установлен на компьютере Windows NT Windows 2000, необходимо настроить для него безопасность. Для этого используйте Dcomcnfg, как показано на следующих шагах, в которых предполагается, что клиентские и серверные компьютеры являются частью домена, а пользователь, вошед в систему на клиентском компьютере, входит в систему как пользователь домена. Предлагаемые параметры — это только одна из возможных конфигураций. Они являются универсальными и предоставляют широкий доступ к серверу. Помните, что это просто пример. При развертывании реальных приложений, а безопасность является проблемой для вашей среды, следует выбрать более строгие параметры. Кроме того, если компьютер, используемый для тестирования этого примера сервера, используется для запуска других серверов, запишите текущие параметры перед внесением следующих изменений и вернитесь к исходным параметрам сразу после завершения тестов.
- На сервере нажмите кнопку «Пуск » и выберите » Выполнить». В диалоговом окне «Запуск» введите Dcomcnfg и нажмите кнопку » ОК». Для запуска Dcomcnfg требуются права администратора.
- Перейдите на вкладку «Свойства по умолчанию» и убедитесь, что на этом компьютере установлен флажок «Включить распределенный COM».
- Задайте уровень проверки подлинности по умолчанию для connect и задайте уровень олицетворения по умолчанию для идентификации.
- Выберите вкладку «Безопасность по умолчанию «.
- Нажмите кнопку «Изменить по умолчанию » на панели разрешений доступа по умолчанию.
- Убедитесь, что все и система включены в список с правами «Разрешить доступ». В противном случае их можно добавить в список с помощью кнопки «Добавить». После завершения списка нажмите кнопку «ОК».
- Нажмите кнопку «Изменить по умолчанию » на панели разрешений запуска по умолчанию.
- Убедитесь, что все и система включены в список с разрешениями на запуск. В противном случае нажмите кнопку « Добавить», чтобы добавить их в список. После завершения списка нажмите кнопку «ОК».
- Откройте вкладку « Приложения», выделите сервер, DCOMDemo_Svr.Class1 и нажмите кнопку «Свойства «.
- Выберите вкладку «Общие «, задайте для уровня проверки подлинности значение «По умолчанию», а затем выберите вкладку «Расположение «. Единственный проверяемая возможность — запустить приложение на этом компьютере.
- Перейдите на вкладку « Безопасность» и убедитесь, что установлен флажок «Использовать разрешения доступа по умолчанию» и «Использовать разрешения на запуск по умолчанию».
- Выберите вкладку «Удостоверение» , проверьте параметр запуска пользователя , нажмите кнопку «ОК», чтобы закрыть диалоговое окно «Свойства сервера «, а затем снова нажмите кнопку «ОК», чтобы закрыть Dcomcnfg. Как видите, тестовый сервер использует все параметры по умолчанию. При развертывании собственных серверов необходимо определить параметры, относящиеся к приложению. Все пользовательские параметры имеют приоритет над параметрами по умолчанию.
Теперь вы готовы протестировать сервер. На клиентском компьютере запустите клиент и нажмите кнопку « Выполнить». Должно появиться окно сообщения, указывающее время сервера. Если вы не можете успешно протестировать этот пример, см. статью по устранению неполадок Q269330, указанную в разделе «Ссылки».
Обратная связь
Были ли сведения на этой странице полезными?