Введение в серверную архитектуру Client-Socket

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

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

В этом уроке я сосредоточусь на дизайне клиент-сервер.

Что такое клиент-серверная архитектура?

В этой модели у нас есть центральное хранилище ресурсов (сервер), к которому подключаются клиенты и запрашивают ресурс (данные, вычислительную мощность и т. д.).

На схеме мы видим рабочий процесс между сервером и клиентом.

  1. Сервер прослушивает запросы (обычно это происходит всегда, иначе вы получите пресловутое исключение 404)
  2. Клиент подключается к серверу
  3. Клиент запрашивает что-то у сервера
  4. Сервер отвечает Клиенту запрошенным ресурсом
  5. соединение закрывается

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

Практический пример: многопоточный клиент-сервер

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

Класс сервера

Наш сервер представляет собой исполняемый метод. Мы создаем сокет на порту 8000, а затем постоянно принимаем запросы клиентов и создаем экземпляр соединения с помощью ServerClientThread.

СерверКлиентТред

Здесь мы берем ссылку на клиентский сокет и начинаем диалог между потоком на нашем сервере и клиентским сокетом. Взаимодействие предполагает…

  1. Чтение сообщения из входного потока клиентского сокета
  2. вывод «От клиента-{id}: Сообщение: {clientMessage}» на консоли сервера
  3. Затем отправьте сообщение обратно клиенту, в котором говорится: «От сервера к клиенту-{id}: получено сообщение {clientMessage}».

Когда пользователь отправит сообщение «закрыть», мы закроем соединение.

Здесь мы создаем 2 клиента один и два. Мы создаем Buffered Reader для чтения пользовательского ввода из Standard. Мы просим пользователя ввести 1 или 2, чтобы определить, какой клиент будет отправлять сообщение на сервер. В зависимости от числа, которое дал пользователь, мы либо отправляем сообщение на сервер, используя поток вывода клиента 1 или 2. Наконец, мы читаем из потока ввода этого клиента, чтобы получить сообщение, отправленное сервером.

Использование сервера

Чтобы запустить этот пример, сначала запустите приложение MyServer, которое содержит наш многопоточный сервер. Затем запустите ClientSimulator.

если вы ответите на подсказки, как показано ниже

Enter 1 or 2: 
1
Enter Message :
hello
From Server to Client-1 received message hello
Enter 1 or 2: 
2
Enter Message :
hi
From Server to Client-2 received message hi

вы должны увидеть следующий вывод в консоли сервера

listening on port 8000
Client:1 started!
Client:2 started!
From Client-1: Message is :hello
From Client-2: Message is :hi

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