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

С помощью вызова server.listen(5) сервер конфигурируется так, чтобы поста-

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

Вызов client.recv(1000) устанавливает максимальную длину входящего сообщения

равной 1000 байтам.

Как мы уже делали ранее, запустите сервер, а затем клиент и наблюдайте.

Сначала запустим сервер:

$ python tcp_server.py

Starting the server at 2014-02-06 22:45:13.306971

Waiting for a client to call.

At 2014-02-06 22:45:16.048865 <socket.socket object, fd=6, family=2, type=1,

proto=0> said b'Hey!'

Теперь запустим клиент. Он отправит сообщение серверу, получит ответ и за-

вершит работу:

$ python tcp_client.py

Starting the client at 2014-02-06 22:45:16.038642

At 2014-02-06 22:45:16.049078 someone replied b'Are you talking to me?'

Сервер получит сообщение, выведет его на экран, ответит и завершит работу:

At 2014-02-06 22:45:16.048865 <socket.socket object, fd=6, family=2, type=1,

proto=0> said b'Hey!'

Обратите внимание на то, что сервер TCP, чтобы ответить, вызвал метод cli-

ent.sendall(), а в предыдущем примере был вызван метод client.sendto(). TCP под-

держивает клиент-серверное соединение с помощью нескольких вызовов сокетов

и запоминает IP-адрес клиента.

Сети

327

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

то увидите, насколько низкоуровневыми являются сокеты. Рассмотрим несколько

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

 UDP отправляет сообщения, но их размер ограничен и не гарантируется, что

они достигнут места назначения.

 TCP вместо сообщений отправляет потоки байтов. Вы не знаете, сколько байтов

отправит или получит система с каждым вызовом.

 Для обмена сообщениями с помощью TCP вам нужна дополнительная инфор-

мация, чтобы собрать полное сообщение из сегментов: фиксированный размер

сообщения (в байтах), или размер всего сообщения, или какой-нибудь раздели-

тель.

 Поскольку сообщения являются байтами, а не текстовыми строками Unicode,

вам придется использовать тип bytes. Чтобы получить более подробную инфор-

мацию об этом типе, обратитесь к главе 7.

Если после всего этого вас все еще восхищает программирование сокетов, вам

стоит посетить ресурс Python socket programming HOWTO (http://bit.ly/socket-howto),

чтобы получить более подробную информацию.

ZeroMQ

Мы уже рассматривали сокеты ZeroMQ, использованные для создания модели

публикации-подписки. ZeroMQ является библиотекой. Иногда называемые со-

кетами на стероидах, сокеты ZeroMQ делают то, чего вы вроде бы ожидаете от

обычных сокетов:

 происходит обмен сообщениями целиком;

 выполняются повторные соединения при обрыве;

 выполняется буферизация данных для их сохранения в том случае, когда от-