Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 251

TCP устанавливает секретное рукопожатие между отправляющей и принима-

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

по протоколу TCP, начнется примерно так:

Ты хочешь услышать шутку про TCP?

Да, я хочу услышать шутку про TCP.

О'кей, я расскажу тебе шутку про TCP.

О'кей, я выслушаю шутку про TCP.

Сети

323

О'кей, теперь я отправлю тебе шутку про TCP.

О'кей, теперь я приму шутку про TCP.

… (и т. д.)

Ваша локальная машина всегда будет иметь IP-адрес 127.0.0.1 и имя localhost.

Вы можете встретить название для этого процесса — интерфейс обратной петли.

Если вы подключены к Интернету, у вашей машины также появится публичный

IP. Если же вы используете домашний компьютер, он будет скрыт за оборудовани-

ем вроде кабельного модема или роутера. Вы можете запускать интернет-протоко-

лы даже между процессами на одной машине.

Большая часть Интернета, с которой мы будем взаимодействовать, — Всемирная

паутина, серверы баз данных и т. д. — основана на протоколе TCP, работающем поверх

протокола IP, для краткости — TCP/IP. Сначала рассмотрим самые простые интернет-

сервисы. После этого мы рассмотрим общие шаблоны для работы с сетями.

Сокеты

Я приберегал данную тему до этого момента, поскольку вам не нужно знать все

низкоуровневые детали для того, чтобы использовать более высокие уровни сети

Интернет. Но если вы хотите узнать, как все работает, этот раздел для вас.

На самом низком уровне сетевого программирования используется сокет, по-

заимствованный из языка программирования C и операционной системы Unix.

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

интереснее работать с чем-то вроде ZeroMQ, однако вам не помешает узнать, что

лежит под этим уровнем. Например, сообщения о сокетах часто появляются при

возникновении ошибок в работе с сетями.

Напишем небольшой пример, где клиент и сервер будут обмениваться данными.

Клиент отправляет серверу строку, размещенную в датаграмме UDP, а сервер воз-

вращает пакет данных, содержащий строку. Серверу нужно слушать определенный

адрес и порт — они похожи на почтовое отделение и почтовый ящик. Клиенту

нужно знать эти два значения, чтобы доставить сообщение и получить ответ.

В следующем коде клиента и сервера address — это кортеж вида (адрес, порт).

address является строкой, которая может быть именем или IP-адресом. Когда ваши

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

вать имя 'localhost' или эквивалентный адрес '127.0.0.1'.

Для начала отправим небольшой фрагмент данных из одного процесса в другой

и вернем немного данных отправителю. Первая программа является клиентом,

а вторая — сервером. В каждой программе мы выведем на экран время и откроем

сокет. Сервер будет слушать подключения к своему сокету, а клиент — писать

данные в свой сокет, что передаст сообщение на сервер.

Так выглядит первая программа, udp_server.py:

from datetime import datetime

import socket

324