Unix Socket - Модель клиент-сервер
Большинство сетевых приложений используют архитектуру клиент-сервер, которая относится к двум процессам или двум приложениям, которые взаимодействуют друг с другом для обмена некоторой информацией. Один из двух процессов действует как клиентский процесс, а другой - как сервер.
Клиентский процесс
Это процесс, при котором обычно запрашивается информация. После получения ответа этот процесс может прекратиться или выполнить другую обработку.
Example, Интернет-браузер работает как клиентское приложение, которое отправляет запрос на веб-сервер для получения одной веб-страницы HTML.
Серверный процесс
Это процесс, который принимает запросы от клиентов. После получения запроса от клиента этот процесс выполнит необходимую обработку, соберет запрошенную информацию и отправит ее клиенту-отправителю. После этого он становится готовым к обслуживанию другого клиента. Серверные процессы всегда бдительны и готовы обслуживать входящие запросы.
Example - Веб-сервер продолжает ожидать запросов от интернет-браузеров, и как только он получает любой запрос от браузера, он берет запрошенную HTML-страницу и отправляет ее обратно в этот браузер.
Обратите внимание, что клиенту необходимо знать адрес сервера, но серверу не нужно знать адрес или даже существование клиента до установления соединения. Как только соединение установлено, обе стороны могут отправлять и получать информацию.
2-х и 3-х уровневые архитектуры
Есть два типа клиент-серверных архитектур:
2-tier architecture- В этой архитектуре клиент напрямую взаимодействует с сервером. Этот тип архитектуры может иметь некоторые дыры в безопасности и проблемы с производительностью. Internet Explorer и веб-сервер работают по двухуровневой архитектуре. Здесь проблемы безопасности решаются с помощью Secure Socket Layer (SSL).
3-tier architectures- В этой архитектуре между клиентом и сервером находится еще одно программное обеспечение. Это промежуточное программное обеспечение называется промежуточным программным обеспечением. Промежуточное ПО используется для выполнения всех проверок безопасности и балансировки нагрузки в случае большой нагрузки. Промежуточное ПО принимает все запросы от клиента и после выполнения необходимой аутентификации передает этот запрос серверу. Затем сервер выполняет необходимую обработку и отправляет ответ обратно промежуточному программному обеспечению, и, наконец, промежуточное программное обеспечение передает этот ответ обратно клиенту. Если вы хотите реализовать трехуровневую архитектуру, вы можете разместить любое промежуточное программное обеспечение, такое как Web Logic или программное обеспечение WebSphere, между вашим веб-сервером и веб-браузером.
Типы серверов
У вас могут быть два типа серверов:
Iterative Server- Это простейшая форма сервера, где серверный процесс обслуживает одного клиента, а после выполнения первого запроса принимает запрос от другого клиента. Тем временем другой клиент продолжает ждать.
Concurrent Servers- Этот тип сервера запускает несколько параллельных процессов для обслуживания множества запросов одновременно, потому что один процесс может занять больше времени, а другой клиент не может ждать так долго. Самый простой способ , чтобы написать параллельный сервер под Unix является раскошелиться дочерний процесс для обработки каждого клиента в отдельности.
Как сделать клиента
Системные вызовы для установления соединения несколько различаются для клиента и сервера, но оба включают базовую конструкцию сокета. Оба процесса устанавливают свои собственные сокеты.
Шаги, необходимые для установки сокета на стороне клиента, следующие:
Создайте сокет с socket() системный вызов.
Подключите сокет к адресу сервера с помощью connect() системный вызов.
Отправлять и получать данные. Есть несколько способов сделать это, но самый простой - использоватьread() и write() системные вызовы.
Как сделать сервер
Шаги, необходимые для установки сокета на стороне сервера, следующие:
Создайте сокет с socket() системный вызов.
Привяжите сокет к адресу с помощью bind()системный вызов. Для серверного сокета в Интернете адрес состоит из номера порта на хост-машине.
Слушайте связи с listen() системный вызов.
Примите связь с accept()системный вызов. Этот вызов обычно блокирует соединение до тех пор, пока клиент не соединится с сервером.
Отправлять и получать данные с помощью read() и write() системные вызовы.
Взаимодействие клиента и сервера
Ниже приведена диаграмма, показывающая полное взаимодействие клиента и сервера.