В этой статье описывается создание, упаковка и развертывание клиентского или серверного приложения модели распределенных компонентов (DCOM) с помощью Visual Basic.
Исходная версия продукта: Visual Basic
Исходный номер базы знаний: 266717
Аннотация
В этой статье показано, как создавать, упаковывать и развертывать клиентское или серверное приложение DCOM с помощью Visual Basic. Чтобы создать клиент или серверное приложение DCOM, вам потребуется выпуск Enterprise Visual Basic. Корпорация Майкрософт предполагает, что читатель уже знаком с созданием клиентских и серверных приложений, которые выполняются на одном компьютере.
Дополнительные сведения
Вам не нужно изменять код, чтобы разрешить клиентским приложениям создавать экземпляры удаленного сервера с помощью DCOM. Разница заключается в способе упаковки и развертывания клиента. Кроме того, после установки клиента и сервера необходимо внести некоторые параметры безопасности. Эти параметры можно задать с помощью служебной программы Dcomcnfg.
Socket или как создать собственный сервер на Python в домашних условиях #1 | Базовый курс Python
Ниже показано, как распространять и настраивать клиентское или серверные приложения. Приведите имя DCOMDemo_Svr и имя клиента DCOMDemo_Cli. Создайте отдельную папку для каждого из них. Для целей этой статьи вызовите эти папки c:DCOMDemoServer and c:DCOMDemoClient .
Создание сервера
- Запустите новый проект 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=» » Client Time=» Connection failed: Error » » — » Нет «, так как DCOM не является удаленной автоматизацией. Удаленная автоматизация — это более старая технология, которая была заменена DCOM.
Сокеты в программировании. Пишем свой сервер и клиент.
Упаковка клиента
При упаковке клиента необходимо выполнить определенные действия, учитывая, что сервер работает не на том же компьютере, что и клиент. Изменения, внесенные в пакет клиента, гарантируют установку только библиотеки типов (TLB-файла) и включение некоторых дополнительных записей реестра вместо исполняемого файла сервера, что не требуется на компьютере клиента, так как он не будет выполняться на нем.
Укажите пакет клиента, выполнив следующие действия.
- Запустите мастер упаковки и развертывания, а затем выберите проект клиента.
- Нажмите кнопку «Пакет «. В диалоговом окне «Тип пакета» выберите стандартный пакет установки и нажмите кнопку » Далее».
- В диалоговом окне «Папка пакета» выберите папку для хранения пакета и нажмите кнопку » Далее». В этом случае это c:DCOMDemoClientPackage.
Примечание. Может появиться диалоговое окно с сообщением об отсутствии сведений о зависимостях для сервера. Нажмите кнопку » ОК», так как этот сервер не имеет зависимостей.
Примечание. Эти два файла включаются в 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, указанную в разделе «Ссылки».
Обратная связь
Были ли сведения на этой странице полезными?
Источник: learn.microsoft.com
Клиент-серверное приложение на потоковом сокете TCP
В следующем примере используем TCP, чтобы обеспечить упорядоченные, надежные двусторонние потоки байтов. Построим завершенное приложение, включающее клиент и сервер. Сначала демонстрируем, как сконструировать на потоковых сокетах TCP сервер, а затем клиентское приложение для тестирования нашего сервера.
Следующая программа создает сервер, получающий запросы на соединение от клиентов. Сервер построен синхронно, следовательно, выполнение потока блокируется, пока сервер не даст согласия на соединение с клиентом. Это приложение демонстрирует простой сервер, отвечающий клиенту. Клиент завершает соединение, отправляя серверу сообщение .
Сервер TCP
Создание структуры сервера показано на следующей функциональной диаграмме:
Вот полный код программы SocketServer.cs:
// SocketServer.cs using System; using System.Text; using System.Net; using System.Net.Sockets; namespace SocketServer < class Program < static void Main(string[] args) < // Устанавливаем для сокета локальную конечную точку IPHostEntry ipHost = Dns.GetHostEntry(«localhost»); IPAddress ipAddr = ipHost.AddressList[0]; IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000); // Создаем сокет Tcp/Ip Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // Назначаем сокет локальной конечной точке и слушаем входящие сокеты try < sListener.Bind(ipEndPoint); sListener.Listen(10); // Начинаем слушать соединения while (true) < Console.WriteLine(«Ожидаем соединение через порт «, ipEndPoint); // Программа приостанавливается, ожидая входящее соединение Socket handler = sListener.Accept(); string data = null; // Мы дождались клиента, пытающегося с нами соединиться byte[] bytes = new byte[1024]; int bytesRec = handler.Receive(bytes); data += Encoding.UTF8.GetString(bytes, 0, bytesRec); // Показываем данные на консоли Console.Write(«Полученный текст: » + data + «nn»); // Отправляем ответ клиенту string reply = «Спасибо за запрос в » + data.Length.ToString() + » символов»; byte[] msg = Encoding.UTF8.GetBytes(reply); handler.Send(msg); if (data.IndexOf(«») > -1) < Console.WriteLine(«Сервер завершил соединение с клиентом.»); break; >handler.Shutdown(SocketShutdown.Both); handler.Close(); > > catch (Exception ex) < Console.WriteLine(ex.ToString()); >finally < Console.ReadLine(); >> > >
Давайте рассмотрим структуру данной программы.
Первый шаг заключается в установлении для сокета локальной конечной точки. Прежде чем открывать сокет для ожидания соединений, нужно подготовить для него адрес локальной конечной точки. Уникальный адрес для обслуживания TCP/IP определяется комбинацией IP-адреса хоста с номером порта обслуживания, которая создает конечную точку для обслуживания.
Класс Dns предоставляет методы, возвращающие информацию о сетевых адресах, поддерживаемых устройством в локальной сети. Если у устройства локальной сети имеется более одного сетевого адреса, класс Dns возвращает информацию обо всех сетевых адресах, и приложение должно выбрать из массива подходящий адрес для обслуживания.
Создадим IPEndPoint для сервера, комбинируя первый IP-адрес хост-компьютера, полученный от метода Dns.Resolve(), с номером порта:
IPHostEntry ipHost = Dns.GetHostEntry(«localhost»); IPAddress ipAddr = ipHost.AddressList[0]; IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);
Здесь класс IPEndPoint представляет localhost на порте 11000. Далее новым экземпляром класса Socket создаем потоковый сокет. Установив локальную конечную точку для ожидания соединений, можно создать сокет:
Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
Перечисление AddressFamily указывает схемы адресации, которые экземпляр класса Socket может использовать для разрешения адреса.
В параметре SocketType различаются сокеты TCP и UDP. В нем можно определить в том числе следующие значения:
Dgram
Поддерживает дейтаграммы. Значение Dgram требует указать Udp для типа протокола и InterNetwork в параметре семейства адресов.
Raw
Поддерживает доступ к базовому транспортному протоколу.
Stream
Поддерживает потоковые сокеты. Значение Stream требует указать Tcp для типа протокола.
Третий и последний параметр определяет тип протокола, требуемый для сокета. В параметре РrotocolType можно указать следующие наиболее важные значения — Tcp, Udp, Ip, Raw.
Следующим шагом должно быть назначение сокета с помощью метода Bind(). Когда сокет открывается конструктором, ему не назначается имя, а только резервируется дескриптор. Для назначения имени сокету сервера вызывается метод Bind(). Чтобы сокет клиента мог идентифицировать потоковый сокет TCP, серверная программа должна дать имя своему сокету:
sListener.Bind(ipEndPoint);
Метод Bind() связывает сокет с локальной конечной точкой. Вызывать метод Bind() надо до любых попыток обращения к методам Listen() и Accept().
Теперь, создав сокет и связав с ним имя, можно слушать входящие сообщения, воспользовавшись методом Listen(). В состоянии прослушивания сокет будет ожидать входящие попытки соединения:
sListener.Listen(10);
В параметре определяется задел (backlog), указывающий максимальное число соединений, ожидающих обработки в очереди. В приведенном коде значение параметра допускает накопление в очереди до десяти соединений.
В состоянии прослушивания надо быть готовым дать согласие на соединение с клиентом, для чего используется метод Accept(). С помощью этого метода получается соединение клиента и завершается установление связи имен клиента и сервера. Метод Accept() блокирует поток вызывающей программы до поступления соединения.
Метод Accept() извлекает из очереди ожидающих запросов первый запрос на соединение и создает для его обработки новый сокет. Хотя новый сокет создан, первоначальный сокет продолжает слушать и может использоваться с многопоточной обработкой для приема нескольких запросов на соединение от клиентов. Никакое серверное приложение не должно закрывать слушающий сокет. Он должен продолжать работать наряду с сокетами, созданными методом Accept для обработки входящих запросов клиентов.
while (true) < Console.WriteLine(«Ожидаем соединение через порт «, ipEndPoint); // Программа приостанавливается, ожидая входящее соединение Socket handler = sListener.Accept();
Как только клиент и сервер установили между собой соединение, можно отправлять и получать сообщения, используя методы Send() и Receive() класса Socket.
Метод Send() записывает исходящие данные сокету, с которым установлено соединение. Метод Receive() считывает входящие данные в потоковый сокет. При использовании системы, основанной на TCP, перед выполнением методов Send() и Receive () между сокетами должно быть установлено соединение. Точный протокол между двумя взаимодействующими сущностями должен быть определен заблаговременно, чтобы клиентское и серверное приложения не блокировали друг друга, не зная, кто должен отправить свои данные первым.
Когда обмен данными между сервером и клиентом завершается, нужно закрыть соединение используя методы Shutdown() и Close():
handler.Shutdown(SocketShutdown.Both); handler.Close();
SocketShutdown — это перечисление, содержащее три значения для остановки: Both — останавливает отправку и получение данных сокетом, Receive — останавливает получение данных сокетом и Send — останавливает отправку данных сокетом.
Сокет закрывается при вызове метода Close(), который также устанавливает в свойстве Connected сокета значение false.
Клиент на TCP
Функции, которые используются для создания приложения-клиента, более или менее напоминают серверное приложение. Как и для сервера, используются те же методы для определения конечной точки, создания экземпляра сокета, отправки и получения данных и закрытия сокета:
Вот полный код для SocketClient.cs и его объяснение:
// SocketClient.cs using System; using System.Text; using System.Net; using System.Net.Sockets; namespace SocketClient < class Program < static void Main(string[] args) < try < SendMessageFromSocket(11000); >catch (Exception ex) < Console.WriteLine(ex.ToString()); >finally < Console.ReadLine(); >> static void SendMessageFromSocket(int port) < // Буфер для входящих данных byte[] bytes = new byte[1024]; // Соединяемся с удаленным устройством // Устанавливаем удаленную точку для сокета IPHostEntry ipHost = Dns.GetHostEntry(«localhost»); IPAddress ipAddr = ipHost.AddressList[0]; IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, port); Socket sender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp); // Соединяем сокет с удаленной точкой sender.Connect(ipEndPoint); Console.Write(«Введите сообщение: «); string message = Console.ReadLine(); Console.WriteLine(«Сокет соединяется с «, sender.RemoteEndPoint.ToString()); byte[] msg = Encoding.UTF8.GetBytes(message); // Отправляем данные через сокет int bytesSent = sender.Send(msg); // Получаем ответ от сервера int bytesRec = sender.Receive(bytes); Console.WriteLine(«nОтвет от сервера: nn», Encoding.UTF8.GetString(bytes, 0, bytesRec)); // Используем рекурсию для неоднократного вызова SendMessageFromSocket() if (message.IndexOf(«») == -1) SendMessageFromSocket(port); // Освобождаем сокет sender.Shutdown(SocketShutdown.Both); sender.Close(); > > >
Единственный новый метод — метод Connect(), используется для соединения с удаленным сервером. На рисунке ниже показаны клиент и сервер в действии:
Источник: professorweb.ru
Как установить базу данных на сервер и начать с ней работать
В каждом проекте мы обычно храним все данные либо во внутренней памяти браузера, либо в текстовых файлах на компьютере или на сервере. Это хорошо работает в простых проектах, когда нужно запомнить несколько десятков строк или чисел. Но в полноценных проектах, где обрабатываются сотни и тысячи записей, так почти никто не делает — вместо этого программисты используют базы данных.
Сегодня мы сделаем первый шаг на этом пути — установим на сервер базу данных MySQL и убедимся, что она работает.
Что понадобится
Чтобы всё получилось, нам будут нужны:
- свой виртуальный сервер;
- настроенный доступ к серверу через SSH;
- место на диске для установки базы данных.
Виртуальный сервер можно взять любой, где будет хотя бы 1 гигабайт памяти на диске для хранения данных. У нас не будет настолько большой базы данных, но этого размера точно хватит и для базы, и для установки всех нужных программ.
Необходимый минимум для связи с сервером
Чтобы сервером можно было управлять со своего домашнего компьютера, нам понадобится настроить SSH — программу для безопасной связи между компьютерами по сети. Так как почти все серверы в интернете работают на линуксе без графической оболочки, команды для управления будем вводить в терминале (или командной строке, кому какое название больше нравится).
Перед тем как продолжить, проверяем, что у нас работает доступ к серверу по SSH:
Базу данных необязательно устанавливать на сервер — на домашнем компьютере она тоже будет работать. Самый простой способ это сделать — поставить виртуальную машину с Ubuntu и установить базу там. Единственный минус — удалённо поработать с такой базой будет сложно, но для тренировки и изучения SQL-запросов этого хватит.
Проверяем, есть ли база данных на сервере
Некоторые виртуальные серверы уже идут в комплекте с установленной базой данных MySQL, и в этом случае ничего дополнительно устанавливать не придётся. Проверить, если ли MySQL на сервере, можно командой mysql -V :
Сервер ответил, что не знает этой команды, — это значит, что база MySQL не установлена.
Дальше мы будем использовать команды установщика для Ubuntu, потому что именно эта операционная система стоит на нашем сервере. Если у вас другая версия линукса, замените наши команды установки apt install на свои.
Устанавливаем базу данных
Установим сразу и серверную, и клиентскую части базы данных MySQL. Серверная отвечает за обработку и хранение данных, а клиентская — за отправку запросов на сервер. Теоретически можно было бы обойтись одной серверной частью, но мы ставим клиентскую, чтобы сразу получить возможность отправлять запросы в базу и видеть результат.
Для установки обеих частей выполним команду apt install mysql-server mysql-client . Сервер соберёт данные об установке и скажет, что ему понадобится около 250 мегабайт на диске — для установки нужно будет ввести английскую букву «y» и нажать энтер:
Когда установка закончится, снова проверим, знает ли сервер о том, что у него теперь есть MySQL, командой mysql -V :
Сервер ответил, что у нас установлена версия 8.0.29, — это значит, что мы всё сделали правильно.
Создаём новую базу
Последнее, что нам осталось сделать, — создать новую базу данных.
Все команды в MySQL называются запросами и пишутся внутри её собственной командной строки. Для перехода в неё пишем команду mysql -u root:
У нас поменялся внешний вид приветствия в командной строке: вместо имени пользователя и текущей папки мы видим строку mysql> — это значит, что мы сейчас общаемся с базой данных и она готова принимать и выполнять команды.Создадим новую базу с названием thecodeDB командой CREATE DATABASE:
Обратите внимание на точку с запятой в конце команды — без неё база данных не поймёт, что запрос закончился, и будет ждать продолжения:
Убедимся, что база создана, — выполним команду SHOW DATABASES;