Socket 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] Требуемый адрес для своего контекста неверен.

Сложно понять, куда копать дальше, как определить Ай-Пи адрес (Сокет?) сервера, или вообще, как «разблокировать» порт в Виндовс.

Источник

Оцените статью