Въведение в сървърната архитектура клиент-сокет

Какво представляват сокетите?

Сокетът е крайна точка в двупосочен комуникационен поток между две програми, работещи в мрежа. В архитектурата клиент-сървър един сокет е клиентът и един е сървърът. Съществуват и мрежи peer-to-peer, които изискват по-малко инфраструктура за настройка, но обикновено имат по-лоша производителност (ето връзка, за да научите повече за „специфичните разлики“).

В този урок ще се съсредоточа върху дизайна клиент-сървър.

Какво представлява архитектурата клиент-сървър?

В този модел имаме централно съхранение на ресурси (сървър), към което клиентите се свързват и искат ресурса (данни, изчислителна мощност и т.н.).

На диаграмата можем да видим работния процес между сървър и клиент

  1. Сървърът слуша за заявки (обикновено винаги се случва или в противен случай получавате прословутото изключение 404)
  2. Клиентът се свързва със сървъра
  3. Клиентът иска нещо от сървъра
  4. Сървърът отговаря на клиента с искания ресурс
  5. връзката се затваря

Сега, след като вече разбираме дизайна и работния процес, нека създадем наш собствен пример.

Казус от практиката: Многопоточен клиентски сървър

В нашия пример ще създадем сървър, който използва нишки, така че да може да се свързва с множество клиенти наведнъж. След това ще свържем два клиента към сървъра и ще изпратим няколко съобщения.

Сървърен клас

Нашият сървър е изпълним метод. Създаваме Socket на порт 8000 и след това непрекъснато приемаме клиентски заявки и установяваме връзката с помощта на ServerClientThread.

ServerClientThread

Тук вземаме препратка към клиентски сокет и започваме разговор между нишка на нашия сървър и клиентския сокет. Взаимодействието включва…

  1. Четене на съобщение от входния поток на клиентския сокет
  2. отпечатване на „От клиент-{id}: Съобщението е: {clientMessage}“ на конзолата на сървъра
  3. След това изпращане на съобщение обратно до клиента, което казва „От сървър към клиент-{id}: получено съобщение{clientMessage}“

Когато потребителят изпрати съобщение „затвори“, тогава ние ще затворим връзката.

Тук създаваме 2 клиента един и два. Създаваме буфериран четец, за да четем въведените от потребителя данни от 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

Сега, след като разбирате архитектурата клиент-сървър, можете да внедрите свой собствен сървър и да разберете по-добре вътрешната работа на приложенията, които използвате всеки ден.