Главная » Просмотр файлов » Саммерфилд - Программирование на Python 3

Саммерфилд - Программирование на Python 3 (1077331), страница 111

Файл №1077331 Саммерфилд - Программирование на Python 3 (Саммерфилд - Программирование на Python 3) 111 страницаСаммерфилд - Программирование на Python 3 (1077331) страница 1112018-01-10СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 111)

Метод вссКет, вссКет, вепда11() отправляет все переданные ему данные, выполняя за кулисами столько вызовов вссКет. вьскет. вепс(), сколько потребуется. Программа всегда передает серверу два элемента данных: длину законсервированного объекта и сам объект. Если аргумент иа(С тсг гер1у имеет значение Ра1ве, функция не ждет получения ответа от сервера и немедленно возвращает управление — менеджер контекста гарантирует, что сокет будет закрыт до того, как функция фактически вернет управление. После отправки данных (когда требуется получить ответ) вызывается метод восКет.

восКет. гесэ(), который принимает ответ. Этот метод блокирует выполнение программы, пока не примет данные. Первым вызовом принимаются четыре байта — столько отводится под целое число со значением размера законсервированного объекта, следующего за числом. Здесь с помощью объекта втгьст.

Зтгьст выполняется распаковывание байтов в целое число в(ге. Затем создается пустой объект Ьутеаггау и производится попытка получить входящий законсервированный объект блоками размером до 4 000 байтов. Как только будет прочитано в1ге байтов (или если данные были исчерпаны до этого момента), производится выход из цикла и распаковывание данных с помощью функции р(сК1е,1сазв() (которая принимает объект Ьутев или Ьутеаггау), после чего данные возвращаются вызывающей программе.

496 Глава 10. Сети В данном случае известно, что данные всегда имеют форму кортежа, так как это определяется протоколом взаимодействия с сервером приложения регистрации автомобилей, но функция Лап01е гесеезт() ничего не знает и не делает никаких предположений о типе получаемых данных. Если при попытке выполнить сетевое взаимодействие что-то пойдет не так, например, сервер окажется не запущен или по каким-либо причинам соединение будет разорвано, будет возбуждено исключение вссК- ет.еггог.

В этом случае исключение будет перехвачено, клиентская программа выведет сообщение об ошибке и завершит работу. с1авв Босхетхападег: дет !пат (ве11, ааегевв): ве1т.аепгевв = алагезе Еет ептег (ве1Г): зе1т.воск = воскет.воскет(воскет.Ае 1иет, воскет,БОск БтйеАм) ве1т,восх.соппест(ве1т,аепгевв) гетпгп ве1т.восх Пет ех11 (ве1Г, *1дпоге): ве1т.вссК.с!ове() Объект адд геев — это кортеж из двух элементов (1Р-адрес и номер порта); он определяется при создании менеджера контекста.

Как только инструкция и11Л задействует менеджер контекста, он создаст сокет и попытается установить соединение, при этом выполнение программы будет заблокировано, пока соединение не будет установлено или пока сокет не возбудит исключение. Первый аргумент функции инициализации объекта восКет. восКет() определяет семейство адресов — в данном случае используется семейство восКет. АЕ 1ИЕТ (1Рч4), однако имеются и другие семейства — например, восКет. АЕ 1ИЕТ6 (1Рчб), восКет. АЕ ОИ1Х и восКе(.АЕ ИЕТЕТИК. Второй аргумент — это обычно либо восКет.ЯОСК БТНЕАМ (ТОР), как в данном случае, либо зссКе1.

БОСХ СОМАМ (Т)1)Р). Когда поток управления покидает область видимости инструкции и11Л, вызывается метод ех(т () объекта контекста. Мы не заботимся о том, возникло исключение или нет (поэтому мы игнорируем аргументы с информацией об исключении), и просто закрываем сокет. Поскольку метод возвращает Иопе (Еа1ве — в логическом контексте), любое возникшее исключение продолжит евое распространение — на этот случай мы предусмотрели соответствующий блок ехсерт в функции Пап01е гесеевт(), который обработает любое исключение, возникшее в сокете. Сервер ТСР Поскольку в большинстве случаев программный код реализации серверов следует одному и тому же шаблону, вместо низкоуровневого моду- 497 Сервер ТСР ля зосае( мы будем использовать высокоуровневый модуль зосНе(зегче г, который выполнит всю рутинную работу за нас.

Все, что от нас требуется, это реализовать класс обработчика запросов с методом Нап01е(), который будет использоваться для чтения запросов и записи ответов. Модуль зосае1зегчег сам выполняет все необходимые взаимодействия, обслуживая запросы на соединение либо по очереди, либо передавая нх своим отдельным потокам или процессам, причем все это делается абсолютно прозрачно, что избавляет нас от необходимости погружаться в детали низкоуровневой обработки.

Программа-сервер для данного приложения находится в файле саг ген!ззгаг(оп зегоегру.' Эта программа содержит определение очень простого класса Са г, который хранит информацию о количестве мест, пробеге и владельце в виде свойств (первое из них доступно только для чтения). Класс не хранит информацию о номерном знаке, потому что номер хранится в словаре, где он используется в качестве ключа. Начнем с того, что рассмотрим функцию ва! и( ), затем коротко познакомимся с тем, как сервер загружает данные, далее рассмотрим создание класса сервера и, наконец, реализацию класса обработчика запросов, обрабатывающего запросы клиентов.

сег аазп(). (11епаае = оз.рагс.)озп(оз.рази.еьгпаае( г!1а ), "саг гедзз1га(!опз.еаз") сага = 1оас((11епаае) рГ1П1(тЕОаосс (О) СаГ ГЕ91З(Гаг!ОПЗ".ГаГаа1(1ЕП(оаГЗ))) Яепчез(иапо1ег.Сага = сагз загчег = Иоле ггу; загчег = сагнед(зггагзопзегчег(("", 9653), непчезгнапе1ег) зегчег.зегче Гогечег() ехсерг Ехсзрз!оп аз егг: рг!п(("ЕННОН", егг) Гтпа11у: з( зегчег (з пог Нопе: зегчег.зппгеоип() паче(Г!1епаае, сагз) рг(п1("зачес (О) саг гед!ззга11опз". Гогаа(( 1еп(сага))) Регистрационная информация об автомобилях хранится в том же каталоге, что и сама программа.

В объект сага записывается ссылка на словарь, ключами которого являются строки с номерами автомобилей, а значениями — объекты типа Саг. Обычно серверы ничего не выводят на экран, потому что обычно они запускаются и останавливают- Прн нервом запуске сервера в операционной системе ч(Г1пдонз может появиться диалог брандмауэра, сообщающий о том, что Руз)гоп заблокирован — щелкните на кнопке Разблокировать (0пз(ос)г), чтобы дать серверу возможность работать.

498 Глава 10. Сети ся автоматически, а выполняются в фоновом режиме. По этой причине они, как правило, сообщают о своем состоянии посредством записи сообщений в файлы журналов (например, с помощью модуля 1одд1пд). Здесь мы решили выводить на экран сообщения при запуске и остановке, чтобы упростить тестирование и экспериментирование.

Наш класс обработчика запросов должен иметь возможность обращаться к словарю саге, но мы не можем передавать словарь экземплярам этого класса, так как они будут создаваться сервером без нашего участия — по одному обработчику на каждый запрос. Поэтому мы записываем ссылку на словарь в атрибут класса Недоев!Напд1ег. Сага, который обеспечит доступ к словарю всем экземплярам класса. При создании экземпляра сервера ему передаются адрес и порт для выполнения сетевых взаимодействий, а также класс Недоев!Напс1ег — сам класс, а не его экземпляр. Пустая строка адреса соответствует любому доступному адресу 1Рч4 (включая текущий сетевой адрес машины и локальный адрес 1осз1лов!). Затем серверу сообщается, что он должен выполнять обслуживание запросов без остановки. Когда сервер останавливается (как это происходит, мы увидим немного ниже), он сохраняет словарь саге, поскольку информация в нем могла быть изменена клиентами.

Оет 1ове(Г!1епаве): тгу: в!ть ооптехт1!ь.о1ов!пд(дг!Р.преп(г!1епвве, "гь")) ав гь: гетогп р1РК!е. 1овп(ГЬ) ехоер! (Епч!гопвептЕггог, р!ЬК1е.рпр!РК1тпдЕггог) ав егг; рг!пт(" вегчег свппо! 1ово за!в: (1)". гогва!(егг)) вув.ех!!(1) Загрузка выполняется очень просто благодаря тому что здесь используется менеджер контекста из модуля соптех!1!Ь, входящего в состав стандартной библиотеки, который гарантирует закрытие файла независимо от того, произошло исключение или нет. Другой способ добиться того же эффекта состоит в том, чтобы использовать собственный менеджер контекста.

Например: о1ввв 6ЫРМвпв9ег: Оет !и!! (ве1Г, Г!1епвве, вове): ве11. Г!1епвве = Г!1епаве ве1т.вове = вове оег ептег (ве11): ве1Г.ГП = дыр,преп(ве1Г.Г11впаве, ве1т.вове) гегогп ве1Г.ГЬ Оет ех!! (ве1Г, *!дпоге): ве1т.тп.о)ове() При использовании собственного менеджера Ег!РМападег инструкция и1(Ь приобретает вид: Сервер ТСР 499 а11П да1рйапацег((11епаае, "гЬ") ав Гп: Функция яаче( ) (здесь она не показана) по своей структуре очень похожа на функцию 1оаз(), только она открывает файл в двоичном режиме для записи, сохраняет данные с помощью функции р1сК1е.

совр() и ничего не возвращает. с1авв сагйец(вггагаопзегчег(зоскегвегчег.тпгеаоапцм)х1п, восйегвегчег.ТСРВегчег): рава Это полное определение нашего собственного класса сервера. Если появится необходимость создать сервер, который будет обслуживать запросы в отдельных процессах, а не в потоках, достаточно будет лишь унаследовать класс зосйегзегчег. ЕогК1пцМ!х1п вместо класса зосйегзегчег. Тйгеаз1пдМ1х1п. Термин гл(х(л (сагесь) часто используется для описания классов, специально предназначенных для множественного наследования.

Классы из модуля зосйегяегчег могут использоваться для создания самых разнообразных серверов, включая серверы Ш)Р и серверы ТЛ)Р и ТОР в операционной системе 0Х1Х, посредством наследования соответствующей пары базовых классов. Обратите внимание, что класс-смесь из модуля зосхе(ее гче г всегда должен наследоваться первым. Это гарантирует, что методы класса-смеси будут пользоваться преимуществом перед методами второго наследуемого класса при наличии одноименных методов в обоих классах, поскольку интерпретатор Руд)!оп выполняет поиск методов в базовых классах в том порядке, в каком они перечислены в определении класса, и использует первый найденный метод. Для обработки каждого запроса сервер создает обработчик запросов (используя переданный ему класс).

Наш собственный класс йейоевзНапз1ег реализует методы для обработки каждого типа запросов плюс обязательный метод Ьапд1е(), который вызывается классом сервера. Но прежде чем перейти к рассмотрению этих методов, познакомимся с объявлением класса и с атрибутами класса. с1авв йедиевгнапо1ег(воокегвегчег. 81геаайеооевгнапо1ег): Сага(оой = гпгеас(пц.

ЕЬЬК() Са11(осй = гпгеао1пц. (Ьсй() Са11 = Оасг( 6ЕТ САН СЕТА1(3=( 1ааьоа ве1г, *агцв; ве1(.цег саг ое(а!!я( агдв)), СНАИЙЕ М!(ЕАОЕ=( 1ааоса ве1Г, *агцв: яе1(.сйапде аа1еа9е(*агдя)), СНАИСЕ СИНЕН=( !ааЬОа ве1Г, .агцз: ве1(.спапде сапог(*агцз)), ИЕМ НЕ918ТНАТ10И=( 500 Глава 10. Сети 1аавба ве1Г, *згцв, ве1т.пел гецввтгзттоп(*агцв)), ЯНОТООИН=1запбз ве1Г, *згцв: ве1т.влоыанп(*згцв)) Мы наследуем класс вооКетвегнег.ВтгезайвцоевтНапо1вг, потому что будем использовать потоковый (ТСР) сервер. Для создания серверов ТЛ)Р можно использовать класс восКетвегнег.

Характеристики

Тип файла
DJVU-файл
Размер
6,88 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6417
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее