При использовании сокетов мы можем запускать клиенты и серверы независимо друг от друга, при этом серверы могут выполняться постоянно и обслуживать множество клиентов (хотя для этого придется внести некоторые изменения в функцию инициализации сервера в нашем вспомогательном модуле). Кроме того, возможность передачи имен удаленных компьютеров инструментам перенаправления в сокеты позволяет клиентам соединяться с серверами, выполняющимися на совершенно разных компьютерах. Как мы узнали в главе 5, именованные каналы (fifo) также обеспечивают независимость клиентов и серверов, но в отличие от сокетов они обычно могут применяться только в пределах локального компьютера и поддерживаются не всеми платформами. Поэкспериментируйте с этим программным кодом, чтобы лучше вникнуть в его суть. Попробуйте также изменить пример 12.11, чтобы вместо сервера или параллельно с сервером он запускал клиентские функции в дочернем процессе, с вызовами и без вызовов метода flush и с вызовом функции time.sleep в конце, чтобы отложить завершение. Применение операции запуска дочернего процесса может также повлиять на надежность данной реализации диалога через сокеты, но мы не будем углубляться в обсуждение этого вопроса в интересах экономии места.
Несмотря на необходимость заботиться о кодировании текста и решать проблему буферизации потоков ввода-вывода, вспомогательный модуль в примере 12.10 все равно представляет весьма интересное решение — операции ввода-вывода автоматически выполняются через сетевые или локальные соединения сокетов, а чтобы задействовать этот модуль, в обычные сценарии требуется внести минимум изменений. Во многих случаях этот прием может существенно расширить область применения сценариев.
В следующем разделе мы снова будем использовать метод makefile для обертывания сокета объектом, похожим на файл, чтобы обеспечить возможность построчного чтения с применением обычных приемов и методов текстовых файлов. Строго говоря, в этом нет большой необходимости — мы могли бы читать строки, как строки байтов с помощью метода recv сокета. Однако в целом метод makefile удобно использовать, когда желательно работать с сокетами, как с простыми файлами. Двинемся дальше, чтобы увидеть действующий пример.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011