26 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Максимально простой в поддержке способ интеграции java-клиента с java-сервером

Основы программирования сокетов в Java

Программирование сокетов в Java используется для связи между приложениями, работающими на разных JRE. Он может быть ориентированным на соединение или без установления соединения. По сути, сокет — это способ установить соединение между клиентом и сервером.

Что это такое программирование сокетов?

Программирование сокетов — это способ соединения двух узлов в сети для связи друг с другом. Один сокет (узел) прослушивает определенный порт на IP-адресе, в то время как другой обращается к другому, чтобы сформировать соединение.

Сервер формирует слушателя, которого клиент обращается к серверу. Классы Socket и Server Socket используются для программирования сокетов с установлением соединения.

Что такое сокет?

Сокет — это одна из конечных точек двустороннего канала связи между двумя программами, работающими в сети. Привязан к номеру порта, чтобы уровень TCP мог идентифицировать приложение, в которое должны быть отправлены данные.

Теперь, когда вы знаете, что такое Socket в Java, давайте продолжим и разберемся, как клиент взаимодействует с сервером и как сервер отвечает в ответ.

Клиентское программирование

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

Чтобы инициировать запрос клиентов, вам необходимо выполнить следующие шаги:

1. Установите соединение

Самый первый шаг — установить соединение через сокет. Соединение через сокет подразумевает, что две машины имеют информацию о сетевом расположении друг друга (IP-адрес) и TCP-порте.

Вы можете создать Socket с помощью следующего оператора:

  • Здесь первый аргумент представляет собой IP-адрес сервера.
  • Второй аргумент представляет TCP-порт (число, обозначающее, какое приложение должно работать на сервере).

2. Связь

Для связи через соединение сокета потоки используются как для ввода, так и для вывода данных. После установления соединения и отправки запросов вам необходимо закрыть соединение.

3. Закрытие соединения

Соединение сокета явно закрывается после отправки сообщения на сервер.

Пример реализации сокетного соединения на стороне клиента

Программирование на стороне сервера

По сути, сервер создает экземпляр своего объекта и ждет запроса клиента. Как только клиент отправит запрос, сервер ответит на него.

Для кодирования серверного приложения вам понадобятся два сокета, и они следующие:

  • ServerSocket, который ожидает клиентских запросов (когда клиент создает новый Socket()).
  • Обычный старый сокет для связи с клиентом.

После этого вам нужно связаться с клиентом с ответом.

Общение

getOutputStream() используется для отправки вывода через сокет.

Закройте соединение

Когда все будет сделано, важно закрыть соединение, закрыв сокет, а также потоки ввода / вывода.

Читать еще:  Что значит root права Android?

Пример реализации сокетного соединения на стороне сервера

После настройки как клиентской, так и серверной стороны вы можете сначала запустить программу на стороне сервера. После этого вам необходимо запустить клиентскую программу и отправить запрос. Как только запрос будет отправлен со стороны клиента, сервер ответит вам.

1. Когда вы запускаете сценарий на стороне сервера, он запускается и ждет, пока клиент не запустится.

2. Затем клиент подключается и вводит запрос в виде строки.

3. Когда клиент отправляет запрос, сервер отвечает.

Вот как вам нужно выполнить программу сокета на Java. Вы также можете запускать эти программы в окне терминала или в командной строке. Но, поскольку Eclipse хорошо расширен своими функциями, вы можете просто запустить обе программы на консоли.

Пример простого клиент-серверного приложения на Java

«Клиент-сервер» это очень распространенная и логичная архитектура приложений. Мне кажется, что в наши дни редко можно встретить standalone-клиентское приложение. Поэтому я принял решение рассмотреть пример построения клиент-серверного приложения на Java без привязки к конкретной задаче. Сначала вкратце пробежимся по классовой структуре приложения, потом посмотрим на отдельную реализацию каждого класса. В самом конце статьи я дам ссылку на скачивание архива с готовой структурой приложения. Итак, начнем.

Основные компоненты приложения

Основными компонентами, естественно, являются непосредственно клиент и сервер. Однако, кроме них необходим еще пакет вспомогательных классов, которые, в простейшем случае, будут отвечать за обмен сообщениями между клиентом и сервером. В минимальной комплектации нужны такие классы: MessageReader/MessageWriter(считывает/записывает сообщение в поток на сокете), MessageFactory(содержит идентификаторы всех возможных сообщений), набор сообщений-запросов(Request) и набор сообщений-ответов(Response). Все они будут размещены в пакете «core», который должны иметь у себя и клиент и сервер.

Рассмотрим классовую структуру всего проекта, а потом перейдем к реализации.

Классовая структура клиент-серверного приложения

Исходный код клиента на Java

Разобраться с клиентом гораздо проще, он по сути своей не делает ничего супер сложного, просто создает сокет и подключается к сервер-сокету с помощью связки host:port. Лаунчер создает объект класса Client и запускает его работу. Исходный код привожу без импортов, ибо любая IDE вам их подключит(те, кто пишет на Java точно знают, что без IDE очень сложно). Кроме того, в конце статьи вы сможете скачать архив с этим проектом.

ClientLauncher.java

Client.java

Под словами «логика приложения» я подразумеваю протокол обмена сообщениями с сервером, передачу каких-либо данных для достижения конечной цели.

Исходный код сервера на Java

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

Читать еще:  Как пользоваться плеером AIMP, как настроить aimp3

Напомню, что в классе ClientSession описан основной алгоритм работы с клиентом, обмен сообщениями, данными и прочее. В классе Context содержится общая информация для всех клиентов сервера, например, пути для сохранения логов.

ServerLauncher.java

Server.java

Context.java

ClientSession.java

SessionsManager.java

Вспомогательные классы из пакета «core»

Помещу все вспомогательные классы под один кат, название классов в точности соответствует названиям из списка «классовая структура» выше, по нему вы можете определить пакет каждого класса.

Пара слов о сообщениях, классы Request и Response являются абстрактными и играют роль классификаторов сообщения. Благодаря этому очень удобно разграничивать «запросы» от «ответов». В этом примере я привел только одно сообщение — Handshake, которое отвечает за первое «рукопожатие» клиента и сервера. Все последующие сообщения должны быть прописаны в классе MessageFactory по примеру этих двух.

Скачать архив с шаблоном клиент-серверного приложения на Java

Заключение

Главная цель, которую я преследовал при написании этой статьи заключается в том, чтобы дать возможность мне или кому-либо еще за считанные минуты «собрать» готовое клиент-серверное приложение. Кажется, я с этим справился, если будут дополнения или замечания, пишите в комментариях или на почту. А на сегодня у меня все, спасибо за внимание!

Клиент-сервер на Java

Это первое приложение в односторонней связи. В случае односторонней связи клиент отправляет на сервер, но сервер не отправляет обратно клиенту. При двусторонней связи клиент отправляет на сервер, а сервер отправляет обратно клиенту.

Всего в приложении TCP / IP 4 варианта.

1-е Приложение клиент-сервер

Приложение состоит из двух программ. Клиентская программа, работающая на стороне клиента, и серверная программа, работающая на стороне сервера. Клиентская программа WishesClient.java отправляет серверу наилучшие пожелания, а серверная программа WishesServer.java получает сообщение и печатает на своем терминале (мониторе).

Клиентская программа — WishesClient.java

Конструктор класса Socket принимает два параметра — строку, IP-адрес сервера и целое число, номер порта на сервере, к которому клиент хотел бы подключиться. 127.0.0.1 — это адрес по умолчанию локальной системы в компьютерных сетях.

OutputStream ostream = sock.getOutputStream ();

Метод getOutputStream() класса Socket возвращает объект OutputStream, здесь объект является ostream. Это отправная точка всего общения (программы). Здесь сокет связан с потоками. Потоки способствуют передаче данных.

OutputStream является абстрактным классом; он не может быть использован напрямую. В приведенном выше коде он связан с конкретным классом DataOutputStream. Метод writeBytes() объекта DataOutputStream принимает строковое сообщение и передает его в Socket. Теперь клиентский сокет отправляется на другой сокет на сервере. Когда работа закончится, закройте потоки и сокет. Он освобождает дескрипторы (ссылки), связанные с системными ресурсами.

Ниже приведены исключения в вышеприведенной программе, создаваемые конструктором и различными методами.

  • Socket(«127.0.0.1», 5000) выдает UnknownHostException
  • getOutputStream() генерирует IOException
  • writeBytes (message1) выдает IOException
  • Все методы close() выдают IOException
  • Серверная программа — WishesServer.java
Читать еще:  Сравнение структур разделов GPT и MBR


ServerSocket sersock = новый ServerSocket (5000);

У сервера есть два задания: одно, как и ожидалось, должно связываться, а другое связывает соединение с номером порта 5000. Для связи он использует Socket, а для привязки — ServerSocket.

Связывание — это не что иное, как выделение номера порта клиенту так долго, как ему хотелось бы; Между тем, если какой-либо другой клиент запрашивает номер порта 5000, он не должен выделяться сервером. Когда клиент отключается, порт освобождается и может быть предоставлен другому клиенту сервером.

Socket sock = sersock.accept ();

accept() — это метод класса ServerSocket, используемый сервером для привязки соединения по номеру порта 5000, запрошенного клиентом.

InputStream istream = sock.getInputStream();

Метод getInputStream() объекта Socket возвращает объект InputStream, и это отправная точка серверной программы. Сервер использует входной поток при получении сообщения.

DataInputStream dstream = new DataInputStream (istream);

Поскольку InputStream является абстрактным классом, его нельзя использовать напрямую. Он связан с конкретным классом DataInputStream.

String message2 = dstream.readLine();

Метод readLine() объекта DataInputStream читает строку сообщения из сокета и возвращает ее. Это сообщение печатается на консоли.

Примечание. При компиляции этой программы вы получаете предупреждение из-за метода readLine() объекта DataInutStream; но программа выполняется. Чтобы избежать этого предупреждения, в следующей программе используется BufferedReader.

Выполнение клиентских и серверных программ

В одной системе, чтобы действовать как клиент и сервер, откройте два шDOS и обработайте одно как клиент, а другой — как сервер. Из одного приглашения DOS сначала запустите серверную программу, а из другого приглашения DOS запустите клиентскую программу. Вы получаете вывод при запросе сервера DOS.

Это приложение и следующее — только односторонняя связь, отправляющая или получающая. Но второй набор (после следующего) приложений является двусторонним, когда клиент и сервер могут отправлять и получать (оба). Для тестирования на выделенных серверах, можно обратиться сюда https://www.mixtelecom.ru/arenda-serverov.html

Для лучшего понимания вопрос-ответ из пакета java.lang.

Сколько существует типов внутренних классов?
Ответ: 4 типа.

Что такое файлы JAR?
Ответ: JAR-файл — это заархивированный файл, сжатый JVM.

Как преобразовать строку в форму типа данных?
Ответ: Преобразование строки в тип данных — байтовое, короткое, целое, длинное, плавающее, двойное, символьное и логическое.

Как преобразовать объект в строку?
Ответ: Объект в строку — toString()

Как сравнить два объекта?
Ответ: Сравнение объектов — hashCode() & equals()

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим – напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Статьи c упоминанием слов: