- Ошибки и исключения, определяемые модулем socket в Python.
- Содержание:
- socket.error :
- socket.herror :
- socket.gaierror :
- socket.timeout :
- Либа socket, не прилетают сообщения от сервера
- Сокеты в Python для начинающих
- Предисловие
- Что это
- Сервер
- Клиент
- Ошибка подключения клиента к серверу. Сокеты Python
- 1 ответ 1
- Всё ещё ищете ответ? Посмотрите другие вопросы с метками python сокет или задайте свой вопрос.
- Похожие
- Подписаться на ленту
- Проблема с СОКЕТАМИ в Python не по локальной сети?
Ошибки и исключения, определяемые модулем socket в Python.
В разделе рассмотрены ошибки и исключения, определяемые модулем socket , а так же возможные причины их возникновения.
Содержание:
- socket.error устарело, псевдоним OSError ,
- socket.herror ошибки функций gethostbyname_ex() и gethostbyaddr() ,
- socket.gaierror ошибки функций getaddrinfo() и getnameinfo() ,
- socket.timeout ошибки функций settimeout() и setdefaulttimeout() .
socket.error :
Исключение socket.error устаревший псевдоним исключения OSError .
socket.herror :
Исключение socket.herror являющееся подклассом исключения OSError , возникает для ошибок, связанных с адресом, то есть для функций, использующих h_errno в POSIX C API, включая функции socket.gethostbyname_ex() и socket.gethostbyaddr() .
Сопутствующее значение — это кортеж (h_errno, string) , представляющая ошибку, возвращаемую вызовом библиотеки. Значение h_errno — это числовое значение, в то время как string представляет описание h_errno , возвращаемое функцией hstrerror() языка C.
socket.gaierror :
Исключение socket.gaierror являющееся подклассом исключения OSError , возникает для ошибок, связанных с адресом, в функциях socket.getaddrinfo() и socket.getnameinfo() .
Сопутствующее значение — это парный кортеж (error, string) , представляющая ошибку и возвращаемую вызовом библиотеки. Строка string представляет собой описание ошибки error , возвращаемое функцией gai_strerror() языка C. Числовое значение ошибки будет соответствовать одной из констант socket.EAI_* , определенных в модуле socket .
socket.timeout :
Исключение socket.timeout являющееся подклассом исключения OSError , возникает когда в сокете происходит тайм-аут, для которого были включены тайм-ауты с помощью предыдущего вызова Socket.settimeout() или неявно через функцию socket.setdefaulttimeout() .
Сопутствующее значение представляет собой строку, значение которой в настоящее время всегда: «timed out”.
Источник
Либа socket, не прилетают сообщения от сервера
Доброго времени суток. Продолжаю учиться писать сетевые программки и тут вышел косяк. Скину основные куски кода, потом поясню:
В классе сервера смотрим StartServer -> AcceptMessage. Тут все прекрасно работает. Сообщения по локальной сети прилетают на сервер. Но как только речь идет о клиенте. смотрим вызов потока в конце и после функцию ReceivingMessage. Почему то она не отлаживается находясь в отдельном потоке и такое чувство будто вообще не выполняется. Что не так я делаю?
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Ошибка: Socket WouldBlock, при отправке сообщения от сервера к клиенту
Привет, есть некий сервер, раньше работало все четко, а после последних изменений (незначительных).
Socket.io сообщения
В общем недавно набрел вот на такую статью, про то как организовать личные сообщения на Socket.io +.
Перемешиваются сообщения socket
Столкнулся с такой проблемой, что при отправке нескольких сообщений у получателя эти сообщения.
Socket сообщения слепливаются!
Объясните пожалуйста почему когда я отправляю два сообщения серверу.
И еще. Если увидите ошибки со стороны клинкода, сообщите пожалуйста
Рыжий Лис,
Следующая ошибка вылетает если блокировку отключить:
BlockingIOError: [WinError 10035] Операция на незаблокированном сокете не может быть завершена немедленно
Проблема найдена. Дело вовсе не в запросах. После старта потока исполняется код потока и только.
Принимает но не отправляет сообщения! (Socket)
Сообщения от клиента приходят на сервер и сервер должен отправить всем клиентам, однако он.
Node.js и socket.io сообщения между пользователями
Всем привет,не так давно наткнулся на статью,поставил ноду,установил всё,что нужно,скопировал.
Передача сообщения от клиентов к серверу Socket
Доброго времени суток, сидел целые 2 сутки думал разберусь сам. но не тут то было. Суть.
Socket не отсылает сообщения через SEND и не принимает
Когда конектится клиент с сервером, сервер должен отображать то, что передает клиент, т.е. asdf, но.
Socket TCP: обрывается соединение после первого сообщения
Всем привет! Начал учить сокеты, написал по примере первую программу: клиент и сервер на TCP.
Реализация отправки сообщения всем клиентам (TCP Socket)
Пишу чат на TCP Сокетах и возник вопрос: Как при получении сообщения сервером, отправить его всем.
Источник
Сокеты в Python для начинающих
Предисловие
В далеком для меня 2010 году я писал статью для начинающих про сокеты в Python. Сейчас этот блог канул в небытие, но статья мне показалась довольно полезной. Статью нашел на флешке в либровском документе, так что это не кросспост, не копипаст — в интернете ее нигде нет.
Что это
Для начала нужно разобраться что такое вообще сокеты и зачем они нам нужны. Как говорит вики, сокет — это программный интерфейс для обеспечения информационного обмена между процессами. Но гораздо важнее не зазубрить определение, а понять суть. Поэтому я тут постараюсь рассказать все как можно подробнее и проще.
Существуют клиентские и серверные сокеты. Вполне легко догадаться что к чему. Серверный сокет прослушивает определенный порт, а клиентский подключается к серверу. После того, как было установлено соединение начинается обмен данными.
Рассмотрим это на простом примере. Представим себе большой зал с множеством небольших окошек, за которыми стоят девушки. Есть и пустые окна, за которыми никого нет. Те самые окна — это порты. Там, где стоит девушка — это открытый порт, за которым стоит какое-то приложение, которое его прослушивает. То есть, если, вы подойдете к окошку с номером 9090, то вас поприветствуют и спросят, чем могут помочь. Так же и с сокетами. Создается приложение, которое прослушивает свой порт. Когда клиент устанавливает соединение с сервером на этом порту именно данное приложение будет ответственно за работу этим клиентом. Вы же не подойдете к одному окошку, а кричать вам будут из соседнего 🙂
После успешной установки соединения сервер и клиент начинают обмениваться информацией. Например, сервер посылает приветствие и предложение ввести какую-либо команду. Клиент в свою очередь вводит команду, сервер ее анализирует, выполняет необходимые операции и отдает клиенту результат.
Сервер
Сейчас создайте два файла — один для сервера, а другой для клиента.
В Python для работы с сокетами используется модуль socket:
Прежде всего нам необходимо создать сокет:
Здесь ничего особенного нет и данная часть является общей и для клиентских и для серверных сокетов. Дальше мы будем писать код для сервера. Это вполне логично — зачем нам писать клиентское приложение, если некуда подключаться 🙂
Теперь нам нужно определиться с хостом и портом для нашего сервера. Насчет хоста — мы оставим строку пустой, чтобы наш сервер был доступен для всех интерфейсов. А порт возьмем любой от нуля до 65535. Следует отметить, что в большинстве операционных систем прослушивание портов с номерами 0 — 1023 требует особых привилегий. Я выбрал порт 9090. Теперь свяжем наш сокет с данными хостом и портом с помощью метода bind, которому передается кортеж, первый элемент (или нулевой, если считать от нуля) которого — хост, а второй — порт:
Теперь у нас все готово, чтобы принимать соединения. С помощью метода listen мы запустим для данного сокета режим прослушивания. Метод принимает один аргумент — максимальное количество подключений в очереди. Напряжем нашу бурную фантазию и вспомним про зал с окошками. Так вот этот параметр определяет размер очереди. Если он установлен в единицу, а кто-то, явно лишний, пытается еще подстроится сзади, то его пошлют 🙂 Установим его в единицу:
Ну вот, наконец-то, мы можем принять подключение с помощью метода accept, который возвращает кортеж с двумя элементами: новый сокет и адрес клиента. Именно этот сокет и будет использоваться для приема и посылке клиенту данных.
Вот и все. Теперь мы установили с клиентом связь и можем с ним «общаться». Т.к. мы не можем точно знать, что и в каких объемах клиент нам пошлет, то мы будем получать данные от него небольшими порциями. Чтобы получить данные нужно воспользоваться методом recv, который в качестве аргумента принимает количество байт для чтения. Мы будем читать порциями по 1024 байт (или 1 кб):
Как мы и говорили для общения с клиентом мы используем сокет, который получили в результате выполнения метода accept. Мы в бесконечном цикле принимаем 1024 байт данных с помощью метода recv. Если данных больше нет, то этот метод ничего не возвращает. Таким образом мы можем получать от клиента любое количество данных.
Дальше в нашем примере для наглядности мы что-то сделаем с полученными данными и отправим их обратно клиенту. Например, с помощью метода upper у строк вернем клиенту строку в верхнем регистре.
Теперь можно и закрыть соединение:
Собственно сервер готов. Он принимает соединение, принимает от клиента данные, возвращает их в виде строки в верхнем регистре и закрывает соединение. Все просто 🙂 В итоге у вас должно было получиться следующее:
Клиент
Думаю, что теперь будет легче. Да и само клиентское приложение проще — нам нужно создать сокет, подключиться к серверу послать ему данные, принять данные и закрыть соединение. Все это делается так:
Думаю, что все понятно, т.к. все уже разбиралось ранее. Единственное новое здесь — это метод connect, с помощью которого мы подключаемся к серверу. Дальше мы читаем 1024 байт данных и закрываем сокет.
Источник
Ошибка подключения клиента к серверу. Сокеты Python
При подключении клиента к серверу возникает ошибка: ConnectionRefusedError: [WinError 10061] Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение Язык Python Сначала запускаю сервер и только после пытаюсь подключить клиента. Подскажите, пожалуйста, по какой причине может возникать такая ситуация?
1 ответ 1
Проблема в том, что Вы используете UDP протокол ( socket.SOCK_DGRAM ), который не поддерживает создания соединения, поэтому s.connect((host, port)) и выдаёт Вам ошибку. Советую почитать про TCP и UDP , а ещё лучше хотя бы поверхностно изучить стек протоколов TCP/IP (если хотите изучить сети более углублённо, то есть очень хороший курс на хабре Сети для самых маленьких). Для решения проблемы
- Либо используйте TCP сокет на сервере:
И используйте соответствующие методы ( listen , recv и т.д.)
- Либо не пытайтесь создать соединение с клиента. Вместо этого можете сразу отправлять байты на сервер:
Всё ещё ищете ответ? Посмотрите другие вопросы с метками python сокет или задайте свой вопрос.
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.15.40479
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Источник
Проблема с СОКЕТАМИ в Python не по локальной сети?
Нужна помощь. Создал чат клиент-сервер По локальной сети работает, а через интернет НЕТ. И посмотрел внешний IP на 2ip.ru после ввода айпи в серверной части программы начала выскакивать ошибка OSError: [WinError 10049] Требуемый адрес для своего контекста неверен. Что делать?
Айпи статический.
Код сервера:
- Вопрос задан более трёх лет назад
- 2434 просмотра
Дорогой пользователь, настоятельно рекомендуем еще раз обратить самое пристальное внимание на п. 3.1 регламента работы сервиса (и, в особенности, на его последний абзац).
В противном случае, ваши вопросы будут удаляться по причине тег-спама, а систематические нарушения приведут к блокировке учетной записи.
Так же хочу обратить внимание, что шанс получить ответ на вопрос на много больше в том случае, когда заголовок действительно является вопросительным предложением, кратко передающем суть вопроса, а не просто заканчивается вопросительным знаком.
1. Реальный внешний IP указываете в коде биндовки, запускаете и проверяете здесь открыт порт или нет: https://portchecker.co/
2. Если роутер — тогда указываете (меняете!) в коде биндовки ВНУТРЕННИЙ IP компа и делаете проброс/mirroring порта из внешней сети внутрь.
Не нужно пробрасывать порт только тогда, когда IP компьютера совпадает с проверкой внешнего IP на любом веб-чекере, например на myip.ru. Это означает, что Ваш компьютер подключен напрямую к интернету без дополнительных промежуточных сетей (обычно, через роутер).
Как вы подключаетесь к интернет?
Без покупки белого адреса можно обойтись, если завести сервер в интернете уже с белым адресом, например арендовать VPS.
Когда-то пользовался радмином — там стандартная клиент-серверная архитектура, использует протокол TCP, все проблемы с NAT там так же присутствуют. Возможно в современных версиях они каким-то образом обходят это, например так как это делает teamviewer.
И еще: NAT нужно преодолевать только на одной стороне соединения, на той что принимает соединения, т.е. на сервере. Клиенты свой NAT обычно проходят спокойно.
Говорю же у меня кабельный интернет.
А как же бэкдоры, трояны ?
Slavik0981, Пусть будет кабельный, это не мешает иметь роутер, но этое важно.
Какой адрес конкретно на вашем компе вы можете посмотреть в свойствах сети в винде (или ipconfig в cmd) или по команде ifconfig в линуксе.
Бэкдоры и трояны держат снаружи свой сервер, а сами трояны являются клиентом, поэтому НАТ проходят без проблем.
Для TCP трафика преодоление NAT реальная проблема.
Для UDP есть вариант использовать промежуточный STUN/TURN/ICE сервер, но это требует их поддержки в программном обеспечении, так что простым этот вариант тоже назвать нельзя, но он вполне реальный.
Добрый день, я новичок в этом деле.
Пытаюсь открыть Клиент/Сервер чат, как описано в https://www.youtube.com/watch?v=MPjgHxK8k68&t=59s
Имею Виндовс 10, запускаю два приложенных файла через Виндовс Консоль (cmd.exe):
- python «D:\PATH_TO_FILE\server.py»
- python «D:\PATH_TO_FILE\client.py»
Если в файле «client.py» оставлять строку server = («192.168.0.101»,9090), то ничего не происходит, то есть сервер «не получает» сообщения.
Если же поменять на пустой сервер server = («»,9090) , то выдаёт такую же ошибку, что и в заголовке — OSError: [WinError 10049] Требуемый адрес для своего контекста неверен.
Сложно понять, куда копать дальше, как определить Ай-Пи адрес (Сокет?) сервера, или вообще, как «разблокировать» порт в Виндовс.
Источник