В процессе поддержки бэкенда для небольших программ есть много интересных функций. Некоторые из них основаны на вашей практической способности к распространению идей и решению проблем. Вот отрывок, чтобы записать это. Будет лучше, если вы сможете помочь другим.
Давайте начнем с нескольких чертежей, чтобы увидеть общие функции:
На рисунках мы видим, что задействованы несколько более сложные функции: распознавание речи, алгоритм выделения красных пакетов, алгоритм периферийных красных пакетов и так далее. Все остальное-простые грубые операции. Я использовал КОДИРОВАНИЕ + ТЕСТИРОВАНИЕ почти неделю. Вот несколько идей и методов для реализации каждой точки функции.
Распознавание речи:
Сценарий применения этой функции таков: Пользователь устанавливает красный пакет китайского пароля, пользователь B получает красный пакет, который должен озвучить пароль, и, если он идеально совпадает, получает определенную долю красного пакета.
Запись, естественно, является собственным интерфейсом, предоставляемым виджетом вызова, но загвоздка здесь в том, что формат записи Weixin таков. шелк. Метод онлайн – поиска заключается в конвертации. формат silk в формат WAV или MP3, а затем вызовите интерфейс платформ облачных сервисов для реализации функции распознавания речи.
Как создать свою игру? | ТОП 5 программ для новичков
Библиотека, предоставленная https://github.com/kn007/silk… используется для преобразования в формат WAV, а затем результаты распознавания голоса распознаются с помощью открытого интерфейса распознавания речи Baidu https://ai.baidu.com/tech/spe….
Этапы реализации бизнеса заключаются в следующем:
1. Достижение функции записи в интерфейсе 2. интерфейс загрузки для загрузки. голосовые файлы silk и сохраните их в библиотеке 3. Запустите задачу распознавания речи и успешно верните ее на внешний интерфейс (асинхронно) 4. Результаты опроса внешнего интерфейса.
Поскольку загрузка для распознавания и возврат результатов являются трудоемкими операциями, процесс идентификации лучше всего выполнять асинхронно. (Шаг 3)
Загрузить код детали голосового интерфейса:
//. Business Code Sketch ___________ Voice = $this — > getCreatedVoiceByBody (); // Upload and put into the library This — > identifyVoice ($voice); // Triggered Speech Recognition Task // . public function identifyVoice($voice) < WorkerUtil::sendTaskByRouteAndParams(‘task/detectvoice’, [‘voiceid’ =>$voice->id, ‘type’ =>’redpack’]); >
Как видно выше, идентификатор записи и тип, содержащий адрес голосового файла, отправляются в службу внутренних задач.
Служба внутренних задач обрабатывается следующим образом:
Логика обработки службы задач также понятна: получение voiceid, который необходимо распознать, поиск записей, загрузка голосовых файлов в локальный каталог TMP, вызов формата преобразования оболочки, вызов голосового интерфейса Baidu для распознавания преобразованного формата, а затем внесение результатов в базу данных.
Голосовая таблица структурирована следующим образом:
Python как сделать красивую программу под ПК за 10 минут?
Таким образом, функция распознавания речи завершена.
Распределение красных пакетов
Сценарий применения: при создании красных конвертов
Как правило, есть два способа открыть красные конверты. Один из них заключается в выделении доли каждой акции при ее создании. Один из них заключается в динамическом выделении при его открытии, и первый из них принят здесь.
Подробные обсуждения можно найти по адресу https://www.zhihu.com/questio.
Честно говоря, прочитав этот ответ, я кое-что узнал, например, о реализации структуры пакета Weixin Red, распределении записи и так далее.
Поскольку наше приложение не имеет величины Weixin, нам, естественно, не нужно слишком много учитывать (нагрузку, параллелизм и т. Д.). Требования к продукту заключаются только в том, чтобы реализовать подобный Weixin метод распределения красных пакетов с точки зрения суммы денег. Поэтому, учитывая расширение и производительность, а также время, я напрямую использовал ответ Чэнь Пэна при распределении написания, но стал версией PHP. Он также соответствует redis в качестве хранилища общего доступа к пакетам red и возможной схеме одновременного решения проблем.
Сначала код (красный пакет/создать):
$redpack = $this->getCreatedRedPackByBody(); //. Business Logic Code Sketch ___________ // Setting Random Red Pack Share $this->setRedPackOpenOdds($redpack); protected function setRedPackOpenOdds($rp) < $remainNum = $rp->num; $remainMoney = $rp->fee; $key = ‘redpack:’.$rp->id; $redis = yii::$app->redis; while (!empty($remainNum)) < $money = $this->getRandomMoney($remainNum, $remainMoney); $redis->executeCommand(‘RPUSH’, [$key, $money]); > $redis->executeCommand(‘expire’, [$key, 259200]); > protected function getRandomMoney($remainMoney) < if ($remainNum == 1) < $remainNum—; return $remainMoney; >$randomNum = StringUtil::getRandom(6, 1); $seed = $randomNum / 1000000; $min = 1; $max = $remainMoney / $remainNum * 2; $money = $seed * $max; $money = $money
Эта часть логики кода относительно проста, в основном:
После вычисления случайной суммы текущая сумма и количество копий записываются в список redis: id), а затем общая сумма и количество копий вычитаются до тех пор, пока они не будут вычтены.
Есть несколько примечательных моментов:
1. Метод генерации случайных чисел в исходном ответе использует java. math. БигДецимал. Но у PHP нет соответствующей функции, и его собственное случайное число не очень хорошо. Здесь мы используем наш собственный метод генерации случайных чисел (получаем шесть битов случайных чисел, затем делим их на биты и получаем случайные числа, аналогичные 0,608948) 2. На долю каждого красного конверта устанавливается однодневное время истечения срока действия, которое предназначено для реализации функции истечения срока действия красного конверта.
Результат в redis (в баллах):
распределение 10 юаней 15
Сто юаней выделяется на семь:
Пятьдесят юаней выделяется на 25:
Можно видеть, что случайное распределение в основном реализовано, и учитывается требование лучшей руки.
Использовать также просто, откройте красный пакет, чтобы получить общий доступ, используйте левую часть этого списка по одному из стека в строке.
Карта в красном конверте
Сценарий приложения: Просмотр Красных пакетов, Опубликованных вокруг
Ключом к этой реализации является алгоритм координат вокруг нее. Прежде всего, обязательным условием является получение координат широты и долготы при создании красных конвертов, что реализовано на переднем конце, мы можем только записывать.
Затем, когда вызывается интерфейс, передаются текущие широта и долгота пользователя. В соответствии с этой широтой и долготой рассчитайте диапазон периметра, а затем просмотрите записи в таблице в диапазоне периметра.
Код выглядит следующим образом:
Ключом является getAroundByCoordinats, который вычисляет координаты верхнего левого, нижнего левого, верхнего правого и нижнего правого углов в соответствии с долготой и широтой ввода и размером диапазона. Если он отмечен на карте, то представляет собой прямоугольный диапазон.
Заинтересованные люди могут использовать http://lbs.qq.com/tool/getpoint/tool чтобы выбрать координату случайным образом и вычислить четыре угла в соответствии с приведенным выше методом, чтобы увидеть, точно ли это диапазон, указанный $raidus.
Важно отметить, что я не писал этот метод, но я действительно не помню, откуда он взялся. Я просто помню, как изменил реализацию Java на php . Приношу извинения автору оригинала.
- Метки function, packet, password, program
Источник: funnyphp.com
Русские Блоги
Небольшой программный инструмент Вы должны не использовали апплет, вы никогда не использовали его.
Хотите поделиться несколькими небольшими платформами программного инструмента и поделиться небольшим программным инструментом, который можно получить, применяя небольшой программный трафик, чтобы получить рекламный доход.
В настоящее время есть много платформ, которые могут автоматически генерировать небольшие программы, такие как онлайн, маленькие нежные, короткие книги, Цяо и т. Д., Но переживает различные возможности использования неровным.
Первичная программа онлайн-образования (оплата контента) класс:
Короткие книги, маленькие Geofeng, тысячи чата, похвалы (без бесплатных инструментов), в которых взимается короткие книги, есть много услуг, есть много опыта, и вам нужно обновить агентства (поддерживается в форме Из контента недостаточно богат), только паузы являются хорошими средствами.
Ответить «Малый программный инструмент», чтобы выбрать небольшой программный инструмент, который подходит вам
Электронный апплет класса электронного коммерции:
Если у вас есть сертифицированный сервисный номер WECHAT или номер подписки, вы можете использовать инструмент «WECHAT Xiaofa», предоставленный фоном WECHAT, чтобы генерировать WECHAT E-Commerce Applet (маркетинговые способности и украшения и украшение, но могут завершить основные транзакции электронной коммерции, Дополнительные функции, такие как групповое Spike, распределение второго уровня не должно думать больше).
В дополнение к официальному инструменту электронной коммерции, есть некоторые сторонние небольшие программные инструменты, такие как пассажиры по точкам, арахисовые магазины и похвалы.
Существует бесплатная версия арахисового магазина, но если вы используете бесплатную версию количества предметов, количество товаров и других функций, если вы не рассматриваете маркетинговую способность Группы, основной и WECHAT официального WECHAT Магазин не слишком большой; если у вас нет опыта, вы не испытывали его. Если вы рассматриваете эклектичное распределение электронной коммерции, вы можете выбрать удивительные без вредных денег; другие апплеты электронной коммерции не совсем поняты.
Ответить «Малый программный инструмент» выберите маленький программный инструмент, который вам подходит.
Консультироваться с контентом:
Бесплатная версия — это онлайн (ограничивается более опытом), также есть новый список (бесплатные, небольшие программы маркетинговые возможности, но не достаточно просты) и легкие небольшие процедуры + (текущие я), где новый список легких небольших процедур + Добавление собственников-апплетов, чтобы получить доходы от рекламы (немного выше, чем по одной цене, чем реклама Wechat Public Account, основной доход, может посмотреть на эту статьюКак Xiaobai управляется публичным аккаунтом WECHAT с нуля?), Новый список свободен использовать, светлый апплет + входная версия — принять 300 юаней, профессиональная версия дороже.
Легкие небольшие процедуры имеют много поддержки для профессиональной версии, вы можете выполнять оплату контента, курсы и т. Д., Это необходимо задать.
Персональный класс трудно просмотреть микропрограмму, здесь есть метод:Как контент класс апплета личной темы был одобрен WECHAT?
Например, другие инструменты, такие как понимание, в настоящее время есть небольшая помощь, Tencent Micro, потому что рынок не очень хорош, не поддерживается), и нет открытого трафика основных доходов, нет необходимости для среднего человека, может иметь Университетский кампус номер немного ценности, могут быть некоторые небольшие программные инструменты для еды, питья, питья, такие как облако полутура (очень дорого) и т. Д.
Есть также некоторые платформы, которые патруют веб-сайт в небольшую программу, такие как станция Express Suhu (высокие сборы) и WordPress (многие разработчики могут разрабатывать небольшие программные инструменты для него, например, WPJAM Plug in The High классную версию моей любви Водяные рыбаки должны платить, недавно он основанный на этой программе продажи плагинов с нуля, большой коровы).
Простое суммарное изложение — это, отвечая на «небольшой программный инструмент», чтобы выбрать апплет, чтобы использовать ваш вид
Небольшая программа обслуживания клиентов:Сотрудник отдела работы с клиентами
Интеллектуальная рекомендация
Упражнение по сценарию использования RabbitMQ: проверенный идентификатор пользователя, ограничение длины (12)
[list][*][b]Validated User ID[/b][/list] При отправке сообщения укажите идентификатор пользователя, и только имя пользователя текущего соединения может отправить сообщение (тест обнаружил, что имя пол.
Конфигурация идеи шаблона генерации файлов VUE
Повторное появление оригинального вопроса Diu’an Cup — скачать
Ссылка на тему:ссылка Откройте ссылку заголовка и обнаружите, что есть только одна ссылка для загрузки файла флага на веб-странице, затем нажмите, чтобы загрузить, и попробуйте Разумеется, у вас нет ф.
Восемь основных сортов сортировки (семь)
Восемь основных сортов сортировки (семь) Принцип базовой сортировки: нет необходимости сравнивать ключевые слова, и только ключевые слова должны быть «выделены» и «собрать» для.
Машина обучения базовой концепции
Машина обучения базовой концепции Добыча данных и механические отношения обучения Обучение данных / проверка данных / тестовые данные Контролировать исследование / без надзора в обучении / половине на.
Источник: russianblogs.com
Пишем свой веб-сервер на Python: сокеты
Подпишись на обновления блогa, чтобы не пропустить следующий пост!
Оглавление
- Что определяет хорошего разработчика ПО?
- Что же такое веб-сервер?
- Как общаться с клиентами по сети
- Простейший TCP сервер
- Простейший TCP клиент
- Заключение
- Cсылки по теме
Лирическое отступление: что определяет хорошего разработчика?
Разработка ПО — это инженерная дисциплина. Если вы хотите стать действительно профессиональным разработчиком, то необходимо в себе развивать качества инженера, а именно: системный подход к решению задач и аналитический склад ума. Для вас должно перестать существовать слово магия. Вы должны точно знать как и почему работают системы, с которыми вы взаимодействуете (между прочим, полезное качество, которое находит применение и за пределами IT).
К сожалениею (или к счастью, ибо благоприятно складывается на уровне доходов тех, кто осознал), существует огромное множество людей, которые пишут код без должного понимания важности этих принципов. Да, такие горе-программисты могут создавать работающие до поры до времени системы, собирая их из найденных в Интернете кусочков кода, даже не удосужившись прочитать, как они реализованы. Но как только возникает первая нестандартная проблема, решение которой не удается найти на StackOverflow, вышеупомянутые персонажи превращаются в беспомощных жертв кажущейся простоты современной разработки ПО.
Для того, чтобы не оказаться одним из таких бедолаг, необходимо постоянно инвестировать свое время в получение фундаментальных знаний из области Computer Science. В частности, для прикладных разработчиков в большинстве случаев таким фундаментом является операционная система, в которой выполняются созданные ими программы.
Веб-фреймворки и контейнеры приложений рождаются и умирают, а инструменты, которыми они пользуются, и принципы, на которых они основаны, остаются неизменными уже десятки лет. Это означает, что вложение времени в изучение базовых понятий и принципов намного выгоднее в долгосрочной перспективе. Сегодня мы рассмотрим одну из основных для веб-разработчика концепций — сокеты. А в качестве прикладного аспекта, мы разберемся, что же такое на самом деле веб-сервер и начнем писать свой.
Что такое веб-сервер?
Начнем с того, что четко ответим на вопрос, что же такое веб-сервер?
В первую очередь — это сервер. А сервер — это процесс (да, это не железка), обслуживающий клиентов. Сервер — фактически обычная программа, запущенная в операционной системе. Веб-сервер, как и большинство программ, получает данные на вход, преобразовывает их в соответствии с бизнес-требованиями и осуществляет вывод данных.
Данные на вход и выход передаются по сети с использованием протокола HTTP. Входные данные — это запросы клиентов (в основном веб-браузеров и мобильных приложений). Выходные данные — это зачастую HTML-код подготовленных веб-страниц.
На данном этапе логичными будут следующие вопросы: что такое HTTP и как передавать данные по сети? HTTP — это простой текстовый (т.е. данные могут быть прочитаны человеком) протокол передачи информации в сети Интернет. Протокол — это не страшное слово, а всего лишь набор соглашений между двумя и более сторонами о правилах и формате передачи данных. Его рассмотрение мы вынесем в отдельную тему, а далее попробуем понять, как можно осуществлять передачу данных по сети.
Как компьютеры взаимодействуют по сети
В Unix-подобных системах принят очень удобный подход для работы с различными устройствами ввода/вывода — рассматривать их как файлы. Реальные файлы на диске, мышки, принтеры, модемы и т.п. являются файлами. Т.е. их можно открыть, прочитать данные, записать данные и закрыть.
При открытии файла операционной системой создается т.н. файловый дескриптор. Это некоторый целочисленный идентификатор, однозначно определяющий файл в текущем процессе. Для того, чтобы прочитать или записать данные в файл, необходимо в соответсвующую функцию (например, read() или write() ) передать этот дескриптор, чтобы четко указать, с каким файлом мы собираемся взаимодействовать.
int fd = open(«/path/to/my/file», . ); char buffer[1024]; read(fd, buffer, 1024); write(fd, «some data», 10); close(fd);
Очевидно, что т.к. общение компьютеров по сети — это также про ввод/вывод, то и оно должно быть организовано как работа с файлами. Для этого используется специальный тип файлов, т.н. сокеты.
Сокет — это некоторая абстракция операционной системы, представляющая собой интерфейс обмена данными между процессами. В частности и по сети. Сокет можно открыть, можно записать в него данные и прочитать данные из него.
Т.к. видов межпроцессных взаимодействий с помощью сокетов множество, то и сокеты могут иметь различные конфигурации: сокет характеризуется семейством протоколов (IPv4 или IPv6 для сетевого и UNIX для локального взаимодействия), типом передачи данных (потоковая или датаграммная) и протоколом (TCP, UDP и т.п.).
Далее будет рассматриваться исключительно клиент-серверное взаимодействие по сети с использованием сокетов и стека протоколов TCP/IP.
Предположим, что наша прикладная программа хочет передать строку «Hello World» по сети, и соответствующий сокет уже открыт. Программа осуществляет запись этой строки в сокет с использованием функции write() или send() . Как эти данные будут переданы по сети?
Т.к. в общем случае размер передаваемых программой данных не ограничен, а за один раз сетевой адаптер (NIC) может передать фиксировнный объем информации, данные необходимо разбить на фрагменты, не превышающие этот объем. Такие фрагменты называются пакетами. Каждому пакету добавляется некоторая служебная информация, в частности содержащая адреса получателя и отправителя, и они начинают свой путь по сети.
Адрес компьютера в сети — это т.н. IP-адрес. IP (Internet Protocol) — протокол, который позволил объединить множество разнородных сетей по всеми миру в одну общую сеть, которая называется Интернет. И произошло это благодаря тому, что каждому компьютеру в сети был назначен собственный адрес.
В силу особенности маршрутизации пакетов в сети, различные пакеты одной и той же логической порции данных могут следовать от отправителя к получателю разными маршрутами. Разные маршруты могут иметь различную сетевую задержку, следовательно, пакеты могут быть доставлены получателю не в том порядке, в котором они были отправлены. Более того, содержимое пакетов может быть повреждено в процессе передачи.
Вообще говоря, требование получать пакеты в том же порядке, в котором они были отправлены, не всегда является обязательным (например, при передаче потокового видео). Но, когда мы загружаем веб-страницу в браузере, мы ожидаем, что буквы на ней будут расположены ровно в том же порядке, в котором их нам отправил веб-сервер. Именно поэтому HTTP протокол работает поверх надеждного протокола передачи данных TCP, который будет рассмотрен ниже.
Чтобы организовать доставку пакетов в порядке их передачи, необходимо добавить в служебную информацию каждого пакета его номер в цепочке пакетов и на принимающей стороне делать сборку пакетов не в порядке их поступления, а в порядке, определенном этими номерами. Чтобы избежать доставки поврежденных пакетов, необходимо в каждый пакет добавить контрольную сумму и пакеты с неправильной контрольной суммой отбрасывать, ожидая, что они будут отправлены повторно.
Этим занимается специальный протокол потоковой передачи данных — TCP.
TCP — (Transmission Control Protocol — протокол управления передачей) — один из основных протоколов передачи данных в Интернете. Используется для надежной передачи данных с подтверждением доставки и сохранением порядка пакетов.
В силу того, что передачей данных по сети по протоколу TCP на одном и том же компьютере может заниматься одновременно несколько программ, для каждого из таких сеансов передачи данных необходимо поддерживать свою последовательность пакетов. Для этого TCP вводит понятие соединения. Соединение — это просто логическое соглашение между принимающей и передающей сторонами о начальных и текущих значениях номеров пакетов и состоянии передачи. Соединение необходимо установить (обменявшись несколькими служебными пакетами), поддерживать (периодически передавать данные, чтобы не наступил таймаут), а затем закрыть (снова обменявшись несколькими служебными пакетами).
Итак, IP определяет адрес компьютера в сети. Но, в силу наличия TCP соединений, пакеты могут принадлежать различным соединениям на одной и той же машине. Для того, чтобы различать соединения, вводится понятие TCP-порт. Это всего лишь пара чисел (одно для отправителя, а другое для получателя) в служебной информации пакета, определяющая, в рамках какого соединения должен рассматриваться пакет. Т.е. адрес соединения на этой машине.
Простейший TCP сервер
Теперь перейдем к практике. Попробуем создать свой собственный TCP-сервер. Для этого нам понадобится модуль socket из стандартной библиотеки Python.
Основная проблема при работе с сокетами у новичков связана с наличием обязательного магического ритуала подготовки сокетов к работе. Но имея за плечами теоретические знания, изложенные выше, кажущаяся магия превращается в осмысленные действия. Также необходимо отметить, что в случае с TCP работа с сокетами на сервере и на клиенте различается.
Сервер занимается ожиданием подключений клиентов. Т.е. его IP адрес и TCP порт известны потенциальным клиентам заранее. Клиент может подключиться к серверу, т.е. выступает активной стороной. Сервер же ничего не знает об адресе клиента до момента подключения и не может выступать инициатором соединения. После того, как сервер принимает входящее соединения клиента, на стороне сервера создается еще один сокет, который является симметричным сокету клиента.
Итак, создаем серверный сокет:
# python3 import socket serv_sock = socket.socket(socket.AF_INET, # задамем семейство протоколов ‘Интернет’ (INET) socket.SOCK_STREAM, # задаем тип передачи данных ‘потоковый’ (TCP) proto=0) # выбираем протокол ‘по умолчанию’ для TCP, т.е. IP print(type(serv_sock)) #
А где же обещанные int fd = open(«/path/to/my/socket») ? Дело в том, что системный вызов open() не позволяет передать все необходимые для инициализации сокета параметры, поэтому для сокетов был введен специальный одноименный системный вызов socket() . Python же является объектно-ориентированным языком, в нем вместо функций принято использовать классы и их методы. Код модуля socket является ОО-оберткой вокрут набора системных вызовов для работе с сокетами. Его можно представить себе, как:
class socket: # Да, да, имя класса с маленькой буквы 🙁 def __init__(self, sock_familty, sock_type, proto): self._fd = system_socket(sock_family, sock_type, proto) def write(self, data): # на самом деле вместо write используется send, но об этом ниже system_write(self._fd, data) def fileno(self): return self._fd
Т.е. доступ к целочисленному файловому дескриптору можно получить с помощью:
print(serv_sock.fileno()) # 3 или другой int
Так мы работаем с серверным сокетом, а в общем случае на серверной машине может быть несколько сетевых адаптеров, нам необходимо привязать созданный сокет к одному из них:
serv_sock.bind((‘127.0.0.1’, 53210)) # чтобы привязать сразу ко всем, можно использовать »
Вызов bind() заставляет нас указать не только IP адрес, но и порт, на котором сервер будет ожидать (слушать) подключения клиентов.
Далее необходимо явно перевести сокет в состояние ожидания подключения, сообщив об этом операционной системе:
backlog = 10 # Размер очереди входящих подключений, т.н. backlog serv_sock.listen(backlog)
После этого вызова операционная система готова принимать подключения от клиентов на этом сокете, хотя наш сервер (т.е. программа) — еще нет. Что же это означает и что такое backlog?
Как мы уже выяснили, взаимодействие по сети происходит с помощью отправки пакетов, а TCP требует установления соединения, т.е. обмена между клиентом и сервером несколькими служебными пакетами, не содержащими реальных бизнес-данных. Каждое TCP соединение обладает состоянием. Упростив, их можно представить себе так:
СОЕДИНЕНИЕ УСТАНАВЛИВАЕТСЯ -> УСТАНОВЛЕНО -> СОЕДИНЕНИЕ ЗАКРЫВАЕТСЯ
Таким образом, параметр backlog определяет размер очереди для установленных, но еще не обработанных программой соединений. Пока количество подключенных клиентов меньше, чем этот параметр, операционная система будет автоматически принимать входящие соединения на серверный сокет и помещать их в очередь. Как только количество установленных соединений в очереди достигнет значения backlog, новые соединения приниматься не будут. В зависимости от реализации (GNU Linux/BSD), OC может явно отклонять новые подключения или просто их игнорировать, давая возможность им дождаться освобождения места в очереди.
Теперь необходимо получить соединение из этой очереди:
client_sock, client_addr = serv_sock.accept()
В отличие от неблокирующего вызова listen() , который сразу после перевода сокета в слушающее состояние, возвращает управление нашему коду, вызов accept() является блокирующим. Это означает, что он не возвращает управление нашему коду до тех пор, пока в очереди установленных соединений не появится хотя бы одно подключение.
На этом этапе на стороне сервера мы имеем два сокета. Первый, serv_sock , находится в состоянии LISTEN , т.е. принимает входящие соединения. Второй, client_sock , находится в состоянии ESTABLISHED , т.е. готов к приему и передаче данных. Более того, client_sock на стороне сервера и клиенсткий сокет в программе клиента являются одинаковыми и равноправными участниками сетевого взаимодействия, т.н. peer’ы. Они оба могут как принимать и отправлять данные, так и закрыть соединение с помощью вызова close() . При этом они никак не влияют на состояние слушающего сокета.
Пример чтения и записи данных в клиентский сокет:
while True: data = client_sock.recv(1024) if not data: break client_sock.sendall(data)
И опять же справедливый вопрос — где обещанные read() и write() ? На самом деле с сокетом можно работать и с помощью этих двух функций, но в общем случае сигнатуры read() и write() не позволяют передать все возможные параметры чтения/записи. Так, например, вызов send() с нулевыми флагами равносилен вызову write() .
Немного коснемся вопроса адресации. Каждый TCP сокет определяется двумя парами чисел: (локальный IP адрес, локальный порт) и (удаленный IP адрес, удаленный порт) . Рассмотрим, какие адреса на данный момент у наших сокетов:
serv_sock: laddr (ip=, port=53210) raddr (ip=0.0.0.0, port=*) # т.е. любой client_sock: laddr (ip=, port=51573) # случайный порт, назначенный системой raddr (ip=, port=53210) # адрес слушающего сокета на сервере
Полный код сервера выглядит так:
# python3 import socket serv_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, proto=0) serv_sock.bind((», 53210)) serv_sock.listen(10) while True: # Бесконечно обрабатываем входящие подключения client_sock, client_addr = serv_sock.accept() print(‘Connected by’, client_addr) while True: # Пока клиент не отключился, читаем передаваемые # им данные и отправляем их обратно data = client_sock.recv(1024) if not data: # Клиент отключился break client_sock.sendall(data) client_sock.close()
Подключиться к этому серверу можно с использованием консольной утилиты telnet , предназначенной для текстового обмена информацией поверх протокола TCP:
telnet 127.0.0.1 53210 > Trying 192.168.0.1. > Connected to 192.168.0.1. > Escape character is ‘^]’. > Hello > Hello
Простейший TCP клиент
На клиентской стороне работа с сокетами выглядит намного проще. Здесь сокет будет только один и его задача только лишь подключиться к заранее известному IP-адресу и порту сервера, сделав вызов connect() .
# python3 import socket client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_sock.connect((‘127.0.0.1′, 53210)) client_sock.sendall(b’Hello, world’) data = client_sock.recv(1024) client_sock.close() print(‘Received’, repr(data))
Заключение
Запоминать что-то без понимания, как это работает — злое зло не самый разумный подход для разработчика. Работа с сокетами тому отличный пример.
На первый взгляд может показаться, что уложить в голове последовательность приготовления клиентских и серверных сокетов к работе практически не возможно. Это происходит из-за того, что не сразу понятен смысл производимых манипуляций. Однако, понимая, как осуществляется сетевое взаимодействие, API сокетов сразу становится прозрачным и легко оседает в подкорке. А с точки зрения полезности полученных знаний, я считаю. что понимание принципов сетевого взаимодействия жизненно важно для разработки и отладки действительно сложных веб-проектов.
Другие статьи из серии:
- Пишем свой веб-сервер на Python: процессы, потоки и асинхронный I/O
- Пишем свой веб-сервер на Python: протокол HTTP
- Пишем свой веб-сервер на Python: стандарт WSGI
- Пишем свой веб-сервер на Python: фреймворк Flask
Ссылки по теме
Справочная информация:
Литература
- Beej’s Guide to Network Programming — отличные основы
- UNIX Network Programming — продвинутый уровень
Источник: iximiuz.com