Как сделать клиент серверное приложение python
Всем привет! Не для кого не секрет, что мы каждый день пользуемся мессенджерами, такими как Telegram, What's App, Discord и т.д. В этой статье я расскажу, как сделать такое приложение.
Я не буду использовать шифрование. Я эту задачу отдам вам
Начнем писать сервер!
Код сервера примерно такой:
Этот код довольно простой(если не понятно, то Google в помощь )).
Вот весь код. Его можно улучшить, поставьте лайк автору за него старания и подпишитесь на канал, предлагайте идеи в комментариях и наслаждайтесь моими статьями. Всем пока!
В статье, написанной как учебное пособие, описано создание клиент-серверных приложений, начиная от простейшего эхо-сервера, и заканчивая удаленным доступом к экземпляру произвольного класса с передачей исключений с сервера на клиент (что существенно упрощает отладку).
Удаленный доступ к экземпляру класса реализован через тонкий клиент (оболочку) и перегрузку доступа к атрибутам класса, что вообще говоря может иметь гораздо более широкое применение чем создание сетевых приложений.
шрифт стремный, нету картинок. скучно ))
Не худший вариант, но у питона в стандартной либе есть гораздо более проработанные варианты (SimpleXMLRPCServer, например), надо было бы их упомянуть для справедливости.
Наука знает много гитик. статья не зря так называется, я пишу о чем знаю. О чем не знаю (SimpleXMLRPCServer, например) - не пишу;-)
Лучше запускать интерпретатор с ключиком '-u', вызов flush и комментарий выглядят несколько неуклюже.
Спасибо большое, поправил.
Найдите мне пожалуйста указание лицензии в ПРИМЕРАХ КОДА у Марка Лутца. Ы?
Данная версия программы Hello world распространяется под GPLv2+. LOL
Вам не нравится - не читайте. Токо не надо свое мнение выдавать за истину в конечной инстанции, лады?
if data.__class__ == str : send_string( connect, 'S'+data ) ничегонипонимаю
эквивалентно в некотором смысле type(data) is str
Я не выдаю, а ожидаю, и не мнение, а пояснения. Примерам же на главной просто не место.
Пояснения к чему именно Вы ожидаете?
- Пeтька, приборы? -200! -Что 200? -А что приборы??
Если хотите получить внятный ответ - внятно формулируйте вопрос. На вопрос по ссылке (че оно тут делает?) ответ - ЛЕЖИТ.
Десяток комментов спустя откройте глаза на мой первый коммент в третий раз. Там кроме риторического первого вопроса есть горестный печальный второй. А вы бросились доказывать со мной хором абсурдность ваших же действий.
Зачем она тут лежит?
Затем, что это не первая моя статья, которую я выкладываю тут (на главной), и на предыдущие статьи реакция была от очень хорошей до сдержанно хорошей. Затем, что мне интересно мнение специалистов о том, что я делаю. Затем, что судя по отзывам то, что я делаю, оказывается полезным кому то еще за пределами нашей рабочей группы.
А как же тематика сайта? Других ресурсов нет? Белые буквы вверху страницы глаза не режут?
А Вы считаете, что эта статья не подходит в раздел документация?
Да. Ибо документирует нетрадиционно и вообще не ОС Linux.
Вы отчасти правы, но ИМНО она ближе именно к документации, чем к какому либо другому разделу.
Да. Ибо документирует нетрадиционно и вообще не ОС Linux.
слушай, если тебя так что-то не устраивает - пожалуйся модераторам, они разберутся и примут решение, но вот только не надо устраивать плач ярославны, он в 10^30 раз менее уместен тут, нежели данная статья
интересно посмотреть, делал такое же. ссылка чтото не робит.
какая именно ссылка? У меня все робит;-)
Я ответ хотел, но его тут нет. Простите за затянувшуюся дискуссию.
А почему же не относится к тематике?Python это важный компонент дистрибутивов Linux. Далее сетевая тематика этот конек Linux как же об этом не писать? А разве кросплатформеннность была когда нибудь негативом?
И на правах юмора: когда это велосипеды не были частью Linux?)Кстати в велосипедостроении нет ничего плохого. Так что статье на главной быть должно)
в таких местах используют isinstance().
PS статью не читал.
> Клиент/серверные сетевые приложения на Python - записки дилетанта (часть 1)
На кой ляд на главной записки дилетантов постить? Был бы профи, слова не сказал ;)
Я бы сказал что запускать новый поток при соединении как минимум не эффективно. Лучше держать пул потоков и через какой-то мутекс скармливать следующему ожидающему входящий сокет.
Нет, в питоне как раз идеологически правильный и гораздо более простой вариант это делать сериализацию через pickle и передавать по сети.
По нику автора сначала подумал, что это федорчук забрел на лор
Статья интересная, но жуткое ШГ, нет сил читать.
В питоне потоки не работают из-за GIL, используйте multiprocessing
скоро потребуется спасибо!
слушайте есть хорошая дока про ООП в питоне? что нибудь общепринятое как разбиения на модули, защитные методы классов etc с практической т.з.
OMG - я хочу развидеть такой python style writing
вы молодцы и проделали большую работу, но такое впечатление, что экономили место. нечитабельно же ни хрена ;(
Статья годная. Да, иногда некоторые вещи лучше на коленке свинтить, если они для внутренних задач, чем курить маны к навороченным библиотекам/фреймворкам.
Стиль оформленя кода у автора специфический, но это не суть.
pdf? are u kidding me?
> я пишу о чем знаю
почему, например, никто не берется вырезать аппендикс кому-нибудь из своих родных или знакомых, прочитав пару статеек об этом? попробуйте на досуге - ножик, для первого раза, можно и кухонный взять, а наркоз и дизинфекцию можно и вовсе пропустить. а потом можно будет и свою статью написать. главное, указать во вступлении, что автор - не хирург, но понял что хирургия - это не так уж и сложно.
нет, я не против, чтобы люди, далекие от программирования, пробовали себя в этом увлекательном занятии. я против таких вот статей. не надо писать о том, чего не знаешь! код из этой статьи мог бы быть отличным примером, чего делать не надо и как нельзя писать. попробуйте, для начала, изучить возможности стандартной библиотеки питона. я уже даже и не говорю о существующих библиотеках для решения подобных задач.
Прочитав статтью, пойму ли я как, напрмиер, отослать 2 цифры от 1 клиента к другому? (нужно для игры, для отсылания текущих координат)
AIv, статью надо писать с пафосом, важно раздувая щеки, вот как IBM_dw делает, а не то набегут разные и будут называть тебя чайником
Сетевой сокет — это эндпоинт межпроцессного взаимодействия в компьютерной сети. В Python Standard Library есть модуль socket, предоставляющий низкоуровневый сетевой интерфейс. Этот интерфейс является общим для разных языков программирования, поскольку он использует системные вызовы на уровне операционной системы.
Для создания сокета существует функция, называемая socket . Она принимает аргументы family , type и proto (подробнее см. в документации). Чтобы создать TCP-сокет, нужно использовать socket.AF_INET или socket.AF_INET6 для family и socket.SOCK_STREAM для type .
Пример Python socket:
Функция возвращает объект сокета, который имеет следующие основные методы:
- bind()
- listen()
- accept()
- connect()
- send()
- recv()
Методы bind() , listen() и accept() специфичны для серверных сокетов, а метод connect() — для клиентских. send() и recv() являются общими для обоих типов сокетов. Приведем пример Echo-сервера, взятый из документации:
Здесь мы создаем серверный сокет, привязываем его к localhost и 50000-му порту и начинаем прослушивать входящие соединения.
Чтобы принять входящее соединение, мы вызываем метод accept() , который будет блокироваться до тех пор, пока не подключится новый клиент. Когда это произойдет, метод создаcт новый сокет и вернет его вместе с адресом клиента.
Затем он в бесконечном цикле считывает данные из сокета партиями по 1024 байта, используя метод recv() , пока не вернет пустую строку. После этого он отправляет все входящие данные обратно, используя метод sendall() , который в свою очередь многократно вызывает метод send() . И после этого сервер просто закрывает клиентское соединение. Данный пример может обрабатывать только одно входящее соединение, потому что он не вызывает accept() в цикле.
Код на стороне клиента выглядит проще:
Вместо методов bind() и listen() он вызывает только метод connect() и сразу же отправляет данные на сервер. Затем он получает обратно 1024 байта, закрывает сокет и выводит полученные данные.
Все методы сокета являются блокирующими. Это значит, что когда метод считывает данные из сокета или записывает их в него, программа больше ничего делать не может.
Одно из возможных решений — делегировать работу с клиентами отдельным потокам. Однако создание потоков и переключение контекстов между ними — операция не из дешевых.
Для решения этой проблемы существует так называемый способ асинхронного взаимодействия с сокетами. Основная идея состоит в том, чтобы делегировать поддержание состояния сокета операционной системе и позволить ей уведомлять программу, когда есть данные для чтения из сокета или когда сокет готов к записи.
Существует множество интерфейсов для разных операционных систем:
Все они примерно одинаковы, поэтому давайте создадим сервер с помощью Python select. Пример Python select :
Как видите, кода гораздо больше, чем в блокирующем Echo-сервере. Это в первую очередь связано с тем, что мы должны поддерживать набор очередей для различных списков сокетов, то есть сокетов для записи, чтения и отдельный список для ошибочных сокетов.
Создание серверного сокета происходит так же, кроме одной строки: server.setblocking(0) . Это нужно для того, чтобы сокет не блокировался. Такой сервер более продвинутый, поскольку он может обслуживать более одного клиента. Главная причина заключается в сокетах selecting :
Здесь мы вызываем метод select.select для того, чтобы операционная система проверила, готовы ли указанные сокеты к записи и чтению, и нет ли каких-либо исключений. Метод передает три списка сокетов, чтобы указать, какой сокет должен быть доступен для записи, какой — для чтения и какой следует проверить на наличие ошибок.
Этот вызов (если не передан аргумент timeout ) блокирует программу до тех пор, пока какие-либо из переданных сокетов не будут готовы. В этот момент вызов вернет три списка сокетов для указанных операций.
Так работают сокеты на низком уровне. Однако в большинстве случаев нет необходимости реализовывать настолько низкоуровневую логику. Рекомендуется использовать более высокоуровневые абстракции, такие как Twisted, Tornado или ZeroMQ, в зависимости от ситуации.
Есть у кого клиент серверное-приложение для просмотра файлов. т.е. клиент отправляет путь , сервер получает этот путь, и отправляет все то, что написано в файле. Было бы идеально, если пользователь отправлял, например 1 => нужно получить данные из ФАЙЛА Что есть client
Так что же конкретно не получается? Сделать клиент и передавать запрос? Сделать сервер и получать запрос? Считывать данные из файла? Отправлять данные обратно клиенту? Разбивайте крупные задачи на конкретные подзадачи, и у каждой найдёте сотни вариантов решений в интернете. Если на это пока не хватает навыков, то идите читать учебники, там масса практических примеров от маленьких задач до крупных проектов.
Читайте также: