Как создать клиент серверное приложение
Это первое приложение в односторонней связи. В случае односторонней связи клиент отправляет на сервер, но сервер не отправляет обратно клиенту. При двусторонней связи клиент отправляет на сервер, а сервер отправляет обратно клиенту.
Всего в приложении TCP / IP 4 варианта.
APPLICATION NUMBER | FUNCTIONALITY |
---|---|
1st application | Client to server communication (one-way) |
2nd application | Server to client communication (one-way) |
3rd application | Server sends file contents to client (two-way, non-continuous) |
4th application | Chat program (two-way, continuous) |
1-е Приложение клиент-сервер
OutputStream ostream = sock.getOutputStream ();
Метод getOutputStream() класса Socket возвращает объект OutputStream, здесь объект является ostream. Это отправная точка всего общения (программы). Здесь сокет связан с потоками. Потоки способствуют передаче данных.
Ниже приведены исключения в вышеприведенной программе, создаваемые конструктором и различными методами.
ServerSocket sersock = новый ServerSocket (5000);
Socket sock = sersock.accept ();
InputStream istream = sock.getInputStream();
DataInputStream dstream = new DataInputStream (istream);
Поскольку InputStream является абстрактным классом, его нельзя использовать напрямую. Он связан с конкретным классом DataInputStream.
String message2 = dstream.readLine();
Примечание. При компиляции этой программы вы получаете предупреждение из-за метода readLine() объекта DataInutStream; но программа выполняется. Чтобы избежать этого предупреждения, в следующей программе используется BufferedReader.
Выполнение клиентских и серверных программ
Для лучшего понимания вопрос-ответ из пакета java.lang.
Сколько существует типов внутренних классов?
Ответ: 4 типа.
Средняя оценка / 5. Количество голосов:
Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.
В начале будет рассмотрено создание элементарного клиент-сервера, для усвоения базовых знаний, на основе которых будет строиться многопоточная архитектура.
— Потоки: для того чтобы не перепутать что именно подразумевается под потоком я буду использовать существующий в профессиональной литературе синоним — нить, чтобы не путать Stream и Thread, всё-таки более профессионально выражаться — нить, говоря про Thread.
— Сокеты(Sockets): данное понятие тоже не однозначно, поскольку в какой-то момент сервер выполняет — клиентские действия, а клиент — серверные. Поэтому я разделил понятие серверного сокета — (ServerSocket) и сокета (Socket) через который практически осуществляется общение, его будем называть сокет общения, чтобы было понятно о чём речь.
Спасибо за подсказку про Thread.sleep();!
Конечно в реальном коде Thread.sleep(); устанавливать не нужно — это моветон! В данной публикации я его использую только для того чтобы выполнение программы было нагляднее, что бы успевать разобраться в происходящем.
Так что тестируйте, изучайте и в своём коде никогда не используйте Thread.sleep();!
1) Однопоточный элементарный сервер.
2) Клиент.
3) Многопоточный сервер – сам по себе этот сервер не участвует в общении напрямую, а лишь является фабрикой однонитевых делегатов(делегированных для ведения диалога с клиентами серверов) для общения с вновь подключившимися клиентами, которые закрываются после окончания общения с клиентом.
4) Имитация множественного обращения клиентов к серверу.
Итак, начнём с изучения структуры однопоточного сервер, который может принять только одного клиента для диалога. Код приводимый ниже необходимо запускать в своей IDE в этом идея всей статьи. Предлагаю все детали уяснить из подробно задокументированного кода ниже:
Сервер запущен и находится в блокирующем ожидании server.accept(); обращения к нему с запросом на подключение. Теперь можно подключаться клиенту, напишем код клиента и запустим его. Клиент работает когда пользователь вводит что-либо в его консоли (внимание! в данном случае сервер и клиент запускаются на одном компьютере с локальным адресом — localhost, поэтому при вводе строк, которые должен отправлять клиент не забудьте убедиться, что вы переключились в рабочую консоль клиента!).
После ввода строки в консоль клиента и нажатия enter строка проверяется не ввёл ли клиент кодовое слово для окончания общения дальше отправляется серверу, где он читает её и то же проверяет на наличие кодового слова выхода. Оба и клиент и сервер получив кодовое слово закрывают ресурсы после предварительных приготовлений и завершают свою работу.
Посмотрим как это выглядит в коде:
А что если к серверу хочет подключиться ещё один клиент!? Ведь описанный выше сервер либо находится в ожидании подключения одного клиента, либо общается с ним до завершения соединения, что делать остальным клиентам? Для такого случая нужно создать фабрику которая будет создавать описанных выше серверов при подключении к сокету новых клиентов и не дожидаясь пока делегированный подсервер закончит диалог с клиентом откроет accept() в ожидании следующего клиента. Но чтобы на серверной машине хватило ресурсов для общения со множеством клиентов нужно ограничить количество возможных подключений. Фабрика будет выдавать немного модифицированный вариант предыдущего сервера(модификация будет касаться того что класс сервера для фабрики будет имплементировать интерфейс — Runnable для возможности его использования в пуле нитей — ExecutorServices). Давайте создадим такую серверную фабрику и ознакомимся с подробным описанием её работы в коде:
- Модифицированный Runnable сервер для запуска из предыдущего кода:
- 4) Имитация множественного обращения клиентов к серверу.
Как видно из предыдущего кода фабрика запускает — TestRunnableClientTester() клиентов, напишем для них код и после этого запустим саму фабрику, чтобы ей было кого исполнять в своём пуле:
Запускайте, вносите изменения в код, только так на самом деле можно понять работу этой структуры.
WCF - Windows Communication Foundation, программный фреймворк, используемый для обмена данными между приложениями.
Почему стоит использовать это решение, а не сделать свой клиент-сервер ?1. Данное решение многопоточное. Это значит, что одновременно могут серверу поступить запросы от многих клиентов и клиенты не будут ждать друг друга в очереди, а каждый запрос будет выполнен в отдельном параллельном потоке.
2. Решение не имеет большого объема кода, а значит понять данный код легче.
3. Вам не придется вдаваться в подробности работы между клиентом и сервером: тот самый случай когда установил и забыл о проблемах.
Интерфейс определяет как будет выглядеть объект, в котором будут методы работы нашего клиент-сервера. В WCF данный интерфейс называется контрактом.
Замечание: если Вы создаете клиент-сервер не для теста в рамках одного приложения, а клиент и сервер будут разными приложениями, то Вам следует создать интерфейс ITransferObject и класс TransferObject в отдельной библиотеке dll. В таком случае Ваше клиентское и серверное приложения будут использовать одни классы и интерфейсы, что является Важным условием для WCF.
В данном примере определим, что данный объект будет иметь 2 простых метода:
GetSum - подсчет суммы двух целых чисел
GetMultiPly - подсчет умножения двух целых чисел
[ServiceContract] - необходимый модификатор чтобы указать что данный интерфейс является контрактом WCF службы.
[OperationContract] - необходимый модификатор чтобы указать что данные методы будут использоваться в контракте.
Класс 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; >> 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 - имя сервиса. На каждом адресе может быть большое количество сервисов. Имя сервиса - часть адреса, по которому клиент подключается к серверу.
Далее происходит запуск серверной части WCF. Чтобы приложение не закрылось после отработки всего кода, добавлено Console.ReadKey() - ожидание нажатия любой клавиши.
Строка подключения к серверу такая же как используется в серверной части: адрес_сервера + имя сервиса.
Далее происходит инициализация клиенской части WCF и вызов методов сложения и умножения чисел.
В этой статье описывается создание, упаковка и развертывание клиентского или серверного приложения распределенных компонентов (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 Project. В диалоговом окне Project выберите ActiveX EXE и нажмите кнопку Открыть. Class1 создается по умолчанию.
Добавьте следующий код в модуль Класса 1:
В меню Project нажмите кнопку Project свойства, а затем выберите вкладку General.
В поле Project Name введите DCOMDemo_Svr.
В поле Project Описание введите DCOMDemo_Svr - Server. Проверьте параметр Без присмотра.
Этот параметр всегда должен проверяться на серверах, на которые нет пользовательского интерфейса, чтобы убедиться, что диалоговое окно любого типа не отображается во время работы сервера. Если у вас есть какой-либо тип взаимодействия с пользователем во время работы сервера под удостоверением, которое не является интерактивным пользователем, сервер может показаться зависающим.
Выберите вкладку Компонент и проверьте параметр Remote Server Files.
Проверка этого параметра позволяет Visual Basic создает файлы VBR и TLB, необходимые для упаковки клиентских приложений, которые используют этот сервер. Эти файлы содержат записи реестра, которые необходимо включить на клиентский компьютер.
Закройте диалоговое окно Project Properties.
В меню File выберите Сохранить Как и сохранить этот проект в c:\DCOMDemo\Server folder .
В меню File выберите Make DCOMDemo_Svr и скомпилировать сервер.
В меню Project выберите параметр Project свойства, а затем выберите вкладку Component.
На вкладке Компонент выберите совместимость версий, выберите параметр Двоичная совместимость, а затем сделайте двоичный файл проекта совместимым с созданным файлом сервера (DCOMDemo_Svr.exe). Выбрав этот параметр, вы заверяете, что все GUID-интерфейсы хранятся одинаково при повторнойкомплектовки сервера.
Создание клиента
В меню File выберите параметр New Project, выберите стандартный EXE и нажмите кнопку ОК. Form1 создается по умолчанию.
В меню Project нажмите кнопку Project свойства, а затем выберите вкладку General.
В поле Project Name введите DCOMDemo_Cli.
В поле Project Описание введите DCOMDemo_Cli Project - Client.
В меню Project выберите Ссылки. Из списка доступных ссылок выберите DCOMDemo_Svr - Server.
Поместите кнопку команды в Form1 и измените подпись кнопки на run.
Поместите следующий код в событие щелчка кнопки:
В меню File выберите Сохранить Как и сохранить проект в папке c:\DCOMDemo\Client клиента.
Нажмите клавишу F5, чтобы запустить клиента в IDE и протестировать его.
В меню File выберите Make DCOMDemo_Cli для компиляции клиента, а затем закроем Visual Basic.
Пакет сервера
Мастер пакета и развертывания используется для упаковки сервера для распространения в обычном режиме. Сервер мгновенно используется удаленным клиентом с помощью DCOM. При создании пакета для сервера вы получаете диалоговое окно с вопросом, будет ли этот сервер использоваться в качестве сервера удаленной автоматизации, и если вы хотите включить файлы поддержки для этой цели. Просто нажмите кнопку Нет, так как DCOM не является удаленной автоматизацией. Удаленная автоматизация — это более старая технология, которая была заменена DCOM.
Пакет клиента
При упаковке клиента необходимо выполнить определенные действия, учитывая, что сервер не работает на том же компьютере, что и клиент. Изменения, внесенные в пакет клиента, гарантируют, что установлена только библиотека типов (tlb-файл) и включены дополнительные записи реестра вместо исполняемого сервера, что не требуется на компьютере клиента, так как он не будет выполняться на нем.
Пакет клиента с помощью следующих действий:
Начните мастер пакета и развертывания, а затем выберите проект клиента.
В диалоговом окне Папка пакетов выберите папку для хранения пакета и нажмите кнопку Далее. В этом случае это c:\DCOMDemo\Client\Package.
Теперь вы должны быть в диалоговом окне Included Files.
Отклоните исполняемый файл сервера, DCOMDemo_Svr.exe, так как вы не хотите распространять исполняемый сервер, а затем нажмите кнопку Добавить.
Измените поле "Файлы комбо типа" на удаленные файлы сервера (*.vbr).
Для продолжения нажмите кнопку Далее. Теперь можно приступить к стандартным процедурам мастера пакета и развертывания. В этом случае просто нажмите кнопку Рядом со всеми оставшимися диалогами.
Установка сервера
Установите сервер на компьютер, на котором вы хотите запустить его, используя созданный ранее пакет рассылки. Если вы хотите использовать компьютер разработки для запуска сервера, его не нужно устанавливать, так как Visual Basic регистрацию для вас при компиляции сервера.
Установка клиента
Установите клиент на компьютер, на котором вы хотите запустить его, используя созданный ранее пакет рассылки. Так как этот клиент использует сервер DCOM, а фактическое расположение сервера пусто, когда вы создали пакет рассылки, необходимо предоставить это расположение. Когда настройка подсказывет вам это расположение, укай имя компьютера, на котором установлен сервер.
Настройка безопасности сервера
Если вы установили сервер на компьютере Windows NT или Windows 2000, необходимо настроить для него безопасность. Сделайте это с помощью Dcomcnfg, как показано на следующих действиях, которые предполагают, что клиентские и серверные компьютеры являются частью домена, а пользователь, во время входа на клиентский компьютер, входит в систему как пользователь домена. Предложенные параметры — это только одна из возможных конфигураций. Они являются универсальными и дают широкий доступ к серверу. Помните, что это только пример. При развертывании реальных приложений, а безопасность является проблемой для вашей среды, необходимо выбрать более ограничительные параметры. Кроме того, если компьютер, используемый для тестирования этого примера, используется для запуска других серверов, сделайте заметку о текущих параметрах, прежде чем внести следующие изменения, и вернись к исходным настройкам, как только вы закончили с тестами.
В следующем примере используем TCP, чтобы обеспечить упорядоченные, надежные двусторонние потоки байтов. Построим завершенное приложение, включающее клиент и сервер. Сначала демонстрируем, как сконструировать на потоковых сокетах TCP сервер, а затем клиентское приложение для тестирования нашего сервера.
Сервер TCP
Создание структуры сервера показано на следующей функциональной диаграмме:
Вот полный код программы SocketServer.cs:
Давайте рассмотрим структуру данной программы.
Первый шаг заключается в установлении для сокета локальной конечной точки. Прежде чем открывать сокет для ожидания соединений, нужно подготовить для него адрес локальной конечной точки. Уникальный адрес для обслуживания TCP/IP определяется комбинацией IP-адреса хоста с номером порта обслуживания, которая создает конечную точку для обслуживания.
Класс Dns предоставляет методы, возвращающие информацию о сетевых адресах, поддерживаемых устройством в локальной сети. Если у устройства локальной сети имеется более одного сетевого адреса, класс Dns возвращает информацию обо всех сетевых адресах, и приложение должно выбрать из массива подходящий адрес для обслуживания.
Создадим IPEndPoint для сервера, комбинируя первый IP-адрес хост-компьютера, полученный от метода Dns.Resolve(), с номером порта:
Здесь класс IPEndPoint представляет localhost на порте 11000. Далее новым экземпляром класса Socket создаем потоковый сокет. Установив локальную конечную точку для ожидания соединений, можно создать сокет:
Перечисление AddressFamily указывает схемы адресации, которые экземпляр класса Socket может использовать для разрешения адреса.
В параметре SocketType различаются сокеты TCP и UDP. В нем можно определить в том числе следующие значения:
Dgram
Поддерживает дейтаграммы. Значение Dgram требует указать Udp для типа протокола и InterNetwork в параметре семейства адресов.
Raw
Поддерживает доступ к базовому транспортному протоколу.
Stream
Поддерживает потоковые сокеты. Значение Stream требует указать Tcp для типа протокола.
Третий и последний параметр определяет тип протокола, требуемый для сокета. В параметре РrotocolType можно указать следующие наиболее важные значения - Tcp, Udp, Ip, Raw.
Следующим шагом должно быть назначение сокета с помощью метода Bind(). Когда сокет открывается конструктором, ему не назначается имя, а только резервируется дескриптор. Для назначения имени сокету сервера вызывается метод Bind(). Чтобы сокет клиента мог идентифицировать потоковый сокет TCP, серверная программа должна дать имя своему сокету:
Метод Bind() связывает сокет с локальной конечной точкой. Вызывать метод Bind() надо до любых попыток обращения к методам Listen() и Accept().
В параметре определяется задел (backlog), указывающий максимальное число соединений, ожидающих обработки в очереди. В приведенном коде значение параметра допускает накопление в очереди до десяти соединений.
В состоянии прослушивания надо быть готовым дать согласие на соединение с клиентом, для чего используется метод Accept(). С помощью этого метода получается соединение клиента и завершается установление связи имен клиента и сервера. Метод Accept() блокирует поток вызывающей программы до поступления соединения.
Метод Accept() извлекает из очереди ожидающих запросов первый запрос на соединение и создает для его обработки новый сокет. Хотя новый сокет создан, первоначальный сокет продолжает слушать и может использоваться с многопоточной обработкой для приема нескольких запросов на соединение от клиентов. Никакое серверное приложение не должно закрывать слушающий сокет. Он должен продолжать работать наряду с сокетами, созданными методом Accept для обработки входящих запросов клиентов.
Когда обмен данными между сервером и клиентом завершается, нужно закрыть соединение используя методы Shutdown() и Close():
SocketShutdown — это перечисление, содержащее три значения для остановки: Both - останавливает отправку и получение данных сокетом, Receive - останавливает получение данных сокетом и Send - останавливает отправку данных сокетом.
Сокет закрывается при вызове метода Close(), который также устанавливает в свойстве Connected сокета значение false.
Клиент на TCP
Функции, которые используются для создания приложения-клиента, более или менее напоминают серверное приложение. Как и для сервера, используются те же методы для определения конечной точки, создания экземпляра сокета, отправки и получения данных и закрытия сокета:
Вот полный код для SocketClient.cs и его объяснение:
Единственный новый метод - метод Connect(), используется для соединения с удаленным сервером. На рисунке ниже показаны клиент и сервер в действии:
Читайте также: