Cloud with rain
.:G
G:.
0 and 1 serie, black on white
pulled card
myjsp.feelinglinux.com
ver. 1.1.9-4
Hallo, welcome to my world.
Here you can find some stuff about computer science.
<<< Enjoy your visit! >>>
0 and 1 serie, white on black

Изучаем сокет

          Написано: Giansante Gabriele, 2001      Перевод Марины Пыльник

Чтобы понять, что такое сокеты и как они работают, рассмотрим обычный телефонный звонок.
Чтобы позвонить другу, мы набираем номер на телефоне и ждём, когда наш друг ответит (при этом его телефон будет в режиме ожидания звонка). Если же ответа не последует, то мы услышим сигнал "занято".
Если же друг ответит, то можем разговаривать с ним сколько угодно, т.е. пока сами не нажмём "отбой" (конец связи). Смотрим что происходит. А происходит то, что посредством телефонной линии устанавливается некое соединение между нашим аппаратом и аппаратом другого человека.
А сейчас попробуем заменить нас и нашего друга двумя процессами, при этом один процесс хочет установить связь-соединение с другим.
Ситуация очень похожа на ту, в которой мы хотим позвонить другу. Так вот сокет может быть представлен как телефон этого процесса.

Основными функциями, которые обычно предоставлены для использования сокетов, являются его создание, настройка удалённого подключения, ожидание на определённом порте (порт, практически, мы можем рассматривать как интерфейс между компьютером и внешним миром), обмен данными и закрытие сокета.

Посмотрим, как работает типичный обмен данных с сокетами. Предположим, что мы имеем два процесса A, который должен послать сообщение другому процессу B. B, в свою очередь, должен дать соответствующий ответ. Очень похоже на ситуацию, когда ваш друг приглашает вас на ужин (хотя в этом случае ответ всегда будет "да").

Процесс A   Процесс B
  1 Создание и конфигурация сокета.
(телефонный контракт)
Создание и конфигурация сокета.
(телефонный контракт)
2 Ожидание соединения.
(телефон может принимать звонки)
Попытка соединения.
(набрать номер телефона)
3  
  4 Принять соединение.
(поднять трубку)
  5 Ожидание сообщения.
(ожидание, когда другой человек начнёт говорить)
Посылка сообщения.
(Приглашение на ужин)
6  
Ожидание ответа.
(придёт или не придёт?)
7 Чтение сообщения и посылка ответа.
(ну конечно же пойду...)
Чтение ответа.
(Увидимся сегодня вечером...)
8 Конец связи.
(положить трубку)
Конец связи.
(положить трубку)
9 Ожидание соединения.
(телефон может принимать звонки)
Закрытие сокета.    
... ... ...
  n Закрытие сокета.

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

Всё это может быть формализировано следующим образом:

Процесс A Процесс B
сокетA=Создатьсокет();
ИнициализироватьСокет(сокетA,портa);
Подключить(сокетA,по Адресу B);
Послать(сокетA,сообщение);
ответ=Принять(сокетA);
ЗакрытьСокет(сокетA);
сокетB=Создатьсокет();
ИнициализироватьСокет(сокетB,портa);
сокетВременный=ОжиданиеСоединения(сокетB);
сообщение=Принять(сокетВременный);
Послать(сокетВременный,ответ);
ЗакрытьСокет(сокетВременный);
ЗакрытьСокет(сокетB);

Прокомментируем написанное.
Прежде всего нужно отметить следующее. Функции "Принять" и "ОжиданиеСоединения" блокируют программный поток до тех пор, пока не будет получено соответственно сообщение или запрос соединения. И ещё, здесь предполагается, что существуют и тип сокета, и используемые функции; а также выполнение каждой функции из таблицы находящейся ниже должно быть без ошибок.
Использованные функции имеют следующую задачу:

СоздатьСокет Создаёт сокет и возвращает его как результат.
ИнициализироватьСокет Получает в качестве параметров сокет и данные. Инициализирует сокет с полученными данными.
ОжиданиеСоединения Получает сокет как параметр и ставит его в режим ожидания возможных запросов на соединение.
Возвращает новый сокет, инициализированный для коммуникации с тем, который сделал запрос.
Соединить Получает в качестве параметров сокет и адрес. Coединяет сокет с тем, который в режиме ожидания, по указанному адресу и к тому порту, который указан в конфигурации.
Послать Получает в качестве параметра сокет(1) и сообщение для отправления. Посылает сообщение сокету (2), с которым l'(1) на связи.
Получить Как Послать, но получает сообщение и возвращает его как результат.
Закрытьсокет Получает в качестве параметра сокет и закрывает его полностью.

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

Реклама
В случае процесса A, необходимо указать  порт (число), на котором сокет, с которым хотим установить соединение, находится в режиме ожидания. Что касается процесса B, инициализация предполагает определение портa, где ожидается запрос на соединение.
Чтобы общаться с B, A должен сначала установить подсоединение (Соединить). Соединение будет установлено по указанному адресу. Как только установлена связь, A может послать сообщение и ожидать ответа.
Обратите внимание, что инструментом, посредством которого осуществляется подсоединение, является собственно сокет. Вот почему сокетA передаётся параметром как на "Послать" так и на "Получить". Что обозначает "послать/получить сообщение посредством сокета сокетA".
В процессе B, после того, как сокет инициализирован, нужно будет ждать подсоединения (ОжиданиеСоединения). сокетB останется в режиме ожидания подсоединения. Как только пришёл запрос на соединение, автоматически создаётся новый сокет, который подключается к тому, который сделал запрос. Для каждого обмена данными будет использован этот новый сокет. По окончании всех операций "сокетВременный" может быть закрыт и сокетB может быть использован  для дальнейших соединений или может быть закрыт (что и происходит в продемонстрированной программе).
Если Вы нашли эту статью полезной для себя
поделитесь ею с друзьями в социальных сетях или поставьте "Мне нравится" (вверху справа) .
Большое спасибо!


Вы должны разрешить сохранение куки-файлов и согласиться на правила о конфиденциальности для использования "поделиться" и "мне нравится".
Вы всегда можете отказаться от сохранения куки-файлов и можете удалить куки "cookieconsent_status" из вашего браузера.

 

Tools (myjsp.feelinglinux.com)
Gioco: allenamento con la tastiera Strumenti di codifica/decodifica URI (%-encoding) e Base64 Strumenti di calcolo online per IP e Reti
QUIZ GAME
Quiz game

Поиск в @myjsp.feelinglinux.com

Реклама