вить в очередь пять клиентских соединений прежде, чем отказывать в следующем.
Вызов 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 делают то, чего вы вроде бы ожидаете от
обычных сокетов:
происходит обмен сообщениями целиком;
выполняются повторные соединения при обрыве;
выполняется буферизация данных для их сохранения в том случае, когда от-