My Chat 3 9 (Server Client) Русская Версия
Программирование на Python: Часть 1. Сетевое программирование. Программирование на Python.
Сергей Яковлев. Опубликовано 0. Серия контента: Этот контент является частью # из серии # статей: Программирование на Pythonhttps: //www. Интернет становится обязательным атрибутом повседневности. Все больше появляется приложений, ориентированных на сеть: это серверы баз данных, сетевые игры, различные сетевые протоколы, Web- серверы, апплеты, сервлеты, CGI- скрипты и т. Более того, сеть – это уже компьютер в том случае, когда используется распределенная кластерная архитектура вычислений.
Версия для Windows. Описание · Отзывы (0) · Обсуждение (4) · Файлы (4) · Вопросы и ответы (13) · Подписка на обновления. 4.2 (Голосов: 9) .
В этой статье речь пойдет о сетевом программировании на Python. Модуль socket предлагает простой интерфейс для использования сокетов. Программисты на C/C++ найдут, что здесь реализация сокетов значительно проще. В Python есть и другие сетевые модули: httplib, ftplib, telnetlib, smtplib, реализующие различные сетевые протоколы. Кроме того, в статье значительное внимание будет уделено инструментарию twisted, который еще в большей степени унифицирует рутинные операции, связанные с особенностями сетевого программирования. Сегодня мы рассмотрим следующие темы.
TCP клиент- сервер. TCP – стандартный протокол для межсетевого взаимодействия. Его основным достоинством является принцип гарантированной доставки – все пакеты, посланные сервером, будут доставлены клиенту. Напишем простое клиент- серверное приложение.
- Официальный сайт MyChat - клиент-серверный чат для локальной сети, IM для корпоративной и офисной сети, работает через TCP/IP. Чат для офиса .
- Сервер MyChat. MSI пакет для развертывания MyChat клиента в сети под управлением Active. Mac OS alpha версия MyChat.
Для этого нам нужно импортировать класс socket из стандартной библиотеки, в котором есть все методы для организации соединения. Клиент посылает строку на сервер, сервер получает ее и отсылает клиенту обратно. Код простого сервера: вначале мы создаем сокет, представляющий собой указатель на объект соединения.
Клиент посылает строку на сервер, сервер получает ее и отсылает клиенту обратно. Дженсен Эклз И Джессика Альба В Фильме. Код простого. Код примеров проверялся на версии Python 2.6.
Этому сокету мы передаем два аргумента: первый аргумент говорит о том, что это интернет- сокет, второй – что мы используем TCP- протокол. Первый метод, который мы используем – bind(), он инициализирует ip- адрес и порт. При этом проверяется, не занят ли порт другой программой. Второй метод – listen() – устанавливает количество клиентских соединений, которые будет обслуживать операционная система. Третья функция – accept() – блокирует приложение до тех пор, пока не придет сообщение от клиента. Функция возвращает кортеж из двух параметров – объект самого соединения и адрес клиента. Четвертая функция – recv() – читает данные из сокета.
Аргумент устанавливает максимальное количество байтов в сообщении. Пятая функция – send() – отсылает данные клиенту. Шестая функция – close() – закрывает сокет. Функция raw. Первый клиентский метод – connect() – позволяет соединиться с сервером. Второй метод – send() – отсылает данные на сервер. Третий метод – recv() – получает данные с сервера.
Четвертый метод – close() – закрывает сокет. AF? По сути, они представляют собой оболочки (wrappers) для аналогичных системных вызовов.
Так, метод socket. Посылаемые данные копируются в буфер операционной системы и при этом могут разбиваться на отдельные блоки (chunk). После того как последний блок будет скопирован в буфер, функция send() вернет управление программе, при этом совсем не факт, что все данные уже уйдут по назначению и будут получены на том конце клиентом. Клиент по дороге может обнаружить, что отдельные блоки пропали, и запросит их у сервера повторно. Но это уже не наша забота – за полную гарантированную отсылку данных отвечает операционная система, а не приложение.
Архитектура TCP- сервера. В предыдущем простом примере сервера вы успели заметить, что функция accept() блокирует приложение. Пример банальный, рассчитан на одного клиента, и к реальной жизни имеет отдаленное отношение. Реальные серверы имеют нагрузку в несколько тысяч клиентов, и нужна более серьезная реализация.
Для этого существует несколько различных подходов: использование отдельного потока на каждого клиента; использование неблокирующих сокетов; использование select/poll. В Python неблокирующий сокет реализуется с помощью специального метода setblocking() с параметром, равным нулю. Пример: lstn = socket.
AF. Третий вариант с использованием select() позволяет переложить эту проверку на саму операционную систему. Более поздняя его вариация – функция poll(). Twisted. Twisted – кросс- платформенная сетевая библиотека, написанная на Python.
Это асинхронный инструмент, который избавляет вас от необходимости использовать потоки. Он поддерживает работу с mail, web, news, chat, DNS, SSH, Telnet, RPC, и т. Многие дистрибутивы Linux уже включают в себя twisted. Можно установить инструментарий из исходных текстов, которые лежат тут: http: //twistedmatrix. В основе Twisted лежат события – event.
Работой таких событий управляют специальные функции, называемые хэндлерами – event handler. Есть специальный бесконечный цикл по обработке событий – так называемый event loop. Он отлавливает события, после чего запускает соответствующие хэндлеры. После этого кошмар с последовательной обработкой событий заканчивается. За работу цикла event loop в twisted отвечает объект, называемый reactor, который находится в модуле twisted.
Для его запуска нужно вызвать команду: reactor. Twisted Protocol. Для написания сетевого приложения нужно использовать класс Protocol, который находится в twisted. Protocol. Большинство протоколов унаследованы от этого класса. Они никогда не ждут события, обрабатывая их по мере появления. Вот простой пример: from twisted. Protocol. class Echo(Protocol).
Received(self, data). Это простейший протокол. Он просто пишет назад то, что пишет ему клиент, и не отвечает ни на какие события. Вот пример протокола, отвечающего на событие connect: from twisted. Protocol. class Connector(Protocol). Made(self). self.
Событие connection. Made происходит при коннекте. Событие connection. Lost срабатывает при разрыве коннекта. Twisted Factory. Конфигурация поведения протокола прописывается в фабрике – классе Factory, который унаследован от twisted.
Factory. В программе может быть несколько протоколов, фабрика является для них организующим и конфигурационным компонентом. По умолчанию фабрика запускает каждый протокол, и устанавливает ему атрибут, называемый factory, который указывает на себя. Пример фабрики, которая позволяет протоколу писать лог- файл: from twisted. Factory. from twisted. Line. Receiver. class Logging. Protocol(Line. Receiver).
Received(self, line). Logfile. Factory(Factory). Logging. Protocol. Twisted Client- Server. Код простого сервера: на событие data. Received сервер выводит полученные данные и тут же отсылает их обратно: from twisted.
Factory, Protocol. Server(Protocol). Made(self). self. Lost(self, reason). Received(self, data). Server. Factory(Factory). Server. def . Twisted чат- сервер.
Чат- сервер – это сервер, который делает широковещательную рассылку всех сообщений, которые были посланы клиентами. Сервер анализирует клиентские сообщения и в зависимости от их типа может сообщить остальным о том, что клиент зашел под своим именем, может просто разослать всем клиентское сообщение, либо отключает клиента. Список клиентов хранится в фабрике и называется client. Protocols. При каждом новом коннекте клиента в методе connection. Made протокола происходит добавление объекта Chat. Protocol в этот список.
Код простого чат- сервера: from twisted. Server. Factory. from twisted.
Line. Only. Receiver. Chat. Protocol(Line. Only. Receiver). name = . При написании TCP клиент- серверных приложений функции протокола распределяются между приложением и самой операционной системой. В зависимости от архитектуры сервера, сокеты могут быть блокирующими и неблокирующими. Системные вызовы select() и poll() позволяют писать высоконагруженные серверы с подключением большого количества клиентов.
Инструментарий twisted значительно облегчает труд по написанию сетевых приложений, предоставляя программисту возможность сфокусироваться на логике приложения, скрывая при этом низкоуровневые подробности сетевого протокола. Код примеров проверялся на версии Python 2. Предыдущая статья. Следующая статья > > Ресурсы для скачивания. Подпишите меня на уведомления к комментариям.