Как вставить розетку в подрозетник


5 правил как установить розетку в подрозетник

Установить розетку в готовый подрозетник, казалось бы простая задача. Ведь зачастую, высверливание и монтаж самого подрозетника в стену, занимает гораздо больше времени.

Однако и здесь есть свои нюансы, заблуждения и правила, о которых некоторые могут не знать, а другие наоборот спорить до последнего, настаивая на своей правоте (например, подключение шлейфом двойной розетки).

Рассмотрим основные моменты и этапы этого процесса.

Безопасность и инструмент

В первую очередь, перед производством работ требуется обеспечить безопасность. При замене или установке розеток, всегда отключайте именно ОБЩИЙ вводной автомат на всю квартиру или дом, а не конкретно на эту розетку.

Делать это нужно для того, чтобы разорвать не только фазу, но и ноль. После отключения, проверяйте отсутствие напряжения индикатором по месту работ.

Подготовьте необходимый инструмент:

  • отвертка крестовая
  • мини уровень
  • пассатижи

Также могут понадобиться:

  • гильзы ГМЛ
  • термотрубка
  • пресс клещи

Углубленный подрозетник

Первое правило касается самого подрозетника. Если вы монтируете не конечную, а проходную розетку, то есть ту, на которой кабель не будет заканчиваться, а идти дальше вниз или вбок, к другим розеткам или выключателям, всегда используйте углубленные подрозетники.

Стандартный идет глубиной 45мм, а вам нужно брать 60мм. Это необходимо для компактного размещения проводов, в особенности жилы заземления (почему именно ее, будет сказано ниже).

Не старайтесь запихать все проводники, что называется впритык. Никакой пользы от такой экономии не будет, а только один вред.

Кроме того, сам монтаж будет более качественным, удобным и не вызовет неразрешимых трудностей. Например, когда розетка или ее рамка не будут плотно прилегать к стене. Из-за этого придется укорачивать жилы. Опять все разбирать, производить повторный монтаж-демонтаж.

Вот фото стандартной розетки утопленной в стандартном подрозетнике.

Все пространство, которое остается внутри нее для монтажа проводов – около 1см. Если же вы используете модель глубиной 60мм, то вам добавится целых 1,5см глубины монтажа.

Почувствуйте, что называется разницу.

Длина зачистки изоляции

При зачистке внешней оболочки кабеля, не нужно стремиться снять ее на максимальную глубину, т.е. до самой стенки подрозетника.

Всегда старайтесь оставлять несколько миллиметров. Таким образом, будет обеспечена защита изоляции жил, от перетирания или передавливания острыми краями подрозетника.

Очень удобно это проделывать на круглом кабеле NYM, специальным съемником Jokari.

Делаете круговой надрез, а потом сразу продольный. После чего, даже в стесненных условиях оболочка легко вытягивается наружу.

С плоскими кабелями марки ВВГ и ножом электрика с пяткой, такого фокуса проделать не удастся.

А если это еще будет ГОСТовский кабель, а не ТУ-шный, то тем более.

Как правило, нож с пяткой режет внешнюю изоляцию вплотную до самой стенки подрозетника.

Именно поэтому, многим электрикам и нравится марка кабеля NYM, а не ВВГ. Из-за удобства разделки и простоты работы с ним.

Хотя у каждой марки, есть как свои преимущества, так и недостатки.

Кстати, в редких случаях можно найти и кабель марки ВВГ круглого сечения.

Сколько изоляции нужно снимать с самой жилы, перед тем как ее завести во внутрь контакта? Многое конечно зависит от марки розетки.

На некоторых моделях даже есть шаблон, по которому очень легко сориентироваться.

Но обычно, оголенная часть жилы не должна превышать 8-10мм.

Длина проводов торчащих из подрозетника выбирается исходя из:

  • удобства монтажа
  • глубины подрозетника
Вы должны понимать, что та длина, которую вы оставите, в будущем пригодится для удобного демонтажа, вытаскивания и проведения каких-то ревизионных работ. Либо вообще замены розетки на другую модель.

Как правило, оставляют длину, равную ширине 3-4-х пальцев руки.

Подключение розеток шлейфом

Основной нюанс, который вызывает жаркие споры у электриков – можно ли подключать розетку шлейфом? И в этом вопросе многие разделились на 3 лагеря:

  • категорически нельзя
  • можно в отдельных случаях
  • можно всегда, если позволяет конструкция розетки

У большинства современных розеток, всегда имеются по две клеммы на каждый провод: фаза-ноль-земля. Итого 6 контактов.

Предполагается, что в проходном подрозетнике все шесть концов проводов (3 приходящих+3 отходящих) можно спокойно завести в клеммы, зажать и быть уверенным, что все сделано правильно.

Однако есть пункт правил ПУЭ п.1.7.144, который гласит:

То есть, фазные и нейтральные рабочие проводники подключаются шлейфом без проблем, а вот для заземляющего, как считают приверженцы категорического запрета, это недопустимо.

Для него необходимо делать именно ответвление. Более того, желательно выполнить его безвинтовым способом, чтобы не приходилось в дальнейшем обслуживать (подтягивать). А это значит – гильзование опрессовкой, либо пайка или сварка.

Проще и удобнее всего это проделать методом опрессовки. Складываете итоговое сечение трех жил, которые будут соединяться опрессовкой и подбираете соответствующую гильзу.

Например, у вас кабель питания 3*2,5мм2. Приходящая жила 2,5мм2+ответвление на розетку 2,5мм2+отходящая жила кабеля на соседнюю розетку 2,5мм2. Итого теоретически – 7,5мм2.

Ввиду того, что фактическое сечение жил не всегда соответствует заявленному, да и прослабление контактов здесь не допустимо, подбирайте гильзу немного меньшего сечения чем расчетное – ГМЛ-6.

Заводите жилку в гильзу и обжимаете пресс клещами.

Лишнюю длину гильзы всегда откусывайте, чтобы не занимала свободное пространство в подрозетнике.

Получившееся в итоге соединение, лучше всего защитить термоусаживаемой трубкой.

Хотя конечно никто не запрещает и наложить несколько слоев качественной изоленты.

Особенно если у вас мощный термофен, без плавной регулировки температуры. С таким аппаратом можно ненароком и поплавить отдельные части подрозетника.

Если сделать по другому, используя заводские клеммы розетки, чем это грозит? Например, у вас есть две двойных розетки подключенных последовательно. Одна на высоте 90см, другая, чуть ниже нее, на уровне выше плинтуса.

Питание на нижнюю, приходит с верхней. Если произойдет обрыв или нарушение заземляющего контакта в самой первой из них, то автоматически ”земля” исчезнет и на остальных.
Что категорически недопустимо.

Однако многие электрики уверены, что запрет на такое шлейфование относится только к розеткам, находящимся в разных блоках, на удалении друг от друга. И это правило никоим образом не касается двойных розеток, расположенных в одном блоке, объединенных единой рамкой.

То есть фактически, такой блок представляет из себя некий разъем, имеющий единый корпус. А значит, его можно рассматривать как единое электроустановочное изделие.

Подобным образом изготовлено большинство двойников-тройников и даже удлинителей.

Вы не сможете разобрать единое изделие, не отключив вилки из соседних разъемов. А раз вы эти вилки отключили, то и разрыв заземляющего проводника в самой первой точке ни на что не повлияет.

А вот если розеточные блоки располагаются вдали друг от друга, и не имеют общего корпуса, то соединять их шлейфом категорически нельзя.

Ну и третьи трактователи пункта правил ПУЭ 1.7.144 резонного замечают, что в самом ПУЭ, ничего не сказано о запрете ”шлейфов”. Там даже такого понятия для розеток нет.

Там говорится, что "Pe" проводник должен быть электрически неразрывным (суть именно в этом слове – электрически). И что нельзя включать токопроводящие элементы устройства последовательно в цепь заземляющего проводника.

Ни того, ни другого в шлейфе нет. В большинстве таких розеток под одну клемму, сразу зажимаются оба проводника. Причем допустимым способом (винтовым или пружинным).

Вот если бы в розетке вход земли был с одной стороны, а выход с другой (из-под другого независимого контакта), тогда да – нельзя! Более того, ПУЭ не рассматривает контакты розетки как открытые проводящие части, поэтому п.1.7.144 здесь даже не причем.

Даже если вы будете вынуждены произвести демонтаж одной из зашлейфованных розеток таким способом, то кроме защитного провода, вы по любому разорвете фазный и нулевой проводники.

Какое из этих мнений верно и как монтировать вам?

Если вы делаете, что называется для себя и “на века”, чтобы не заглядывать в подрозетник десятки лет, то ставьте гильзу и выполняйте ответвление, а не шлейф.

То же самое относится для объектов под сдачу контролирующим органам. Чтобы не переделывать всю проводку и не доказывать собственное прочтение ПУЭ, какому-нибудь инспектору энергонадзора, забудьте про шлейфование. Не давайте лишний повод для замечаний.

Ну а если вы твердо убеждены, что шлейф вовсе не является нарушением, и не зря производители розеток изначально заложили возможность такого подключения в своих изделиях, то у себя дома вы вольны поступать так, как сторонники второго и третьего способов.

В конце концов, это ваш собственный дом, и никто не вправе вам запрещать поступать так, а не иначе.

Расположение суппорта

Следующий вопрос, как правильно расположить суппорт розетки внутри подрозетника – клеммами вниз или вверх.

Некоторые ориентируются по надписям на корпусе. Они должны быть нормально читаемы, а не оказаться перевернутыми вверх тормашками.

С одной стороны это вполне логично. Но на самом деле, разницы особой нет. В нормативных документах это никак не отражено.

Поэтому монтируйте так, как вам удобно это делать. Например, ориентируйтесь на приходящий кабель.

Фаза слева или справа

Далее, все что остается это подключить жилы к самой розетке и установить ее во внутрь. Здесь можно столкнуться со следующим моментом, который также вызывает у электриков споры и противоречия.

Куда именно в розетке подключать провода? Если с землей все понятно, для нее место посередине, то вот куда заводить ноль и фазу?

На левый контакт или на правый? Каждый электрик делает это на свое усмотрение. Потому что, опять же в правилах, нет четкого указания куда в розетке должна быть заведена фаза.

Самое главное условие здесь, которое вы должны соблюсти – подключить все розетки в доме или квартире единообразно.

Например, будет неправильным на розетки в зале, фазу завести на правую клемму, а в спальне – на левую. Если уж подключили одну по какой-то схеме, точно также подключайте и все остальные.

Что касается расцветки подключенных жил, то тут уже необходимо соблюдать действующий норматив.

  • желто-зеленый провод – земля
  • синий или бело-синий – ноль
  • разноцветный или белый – фаза

После подключения, постепенно упаковываете провода. Для этого загибаете розетку на себя и вниз, после чего поджимаете провода к ее задней части и засовываете всю конструкцию гармошкой в подрозетник.

Крепежными винтами по бокам производите предварительное крепление. Далее компактным уровнем электрика проверяете горизонтальность установки.

Если все нормально, затягиваете винты окончательно. После этого не забудьте затянуть еще два внутренних крепежных винта.

При их затяжке происходит выдвижение лапок, которыми розетка как бы цепляется за внутренние стенки подрозетника.

В качественных и дорогих экземплярах, такие лапки производители делают двойными с каждой стороны.

Все что остается, это установить лицевую панель и накладную рамку.

У некоторых марок, например Legrand, накладные рамки бывают взаимозаменяемыми.

То есть, сам механизм крепления в подрозетнике остается, а вставной элемент можно поменять. Например, вместо обычной модели со шторками, поставить влагозащищенную (для ванной комнаты), либо наоборот.

Еще один момент касается рамок. Если вы ставите блок розеток, то имейте в виду, что не на всех марках лицевая панель квадратная. Чаще всего она прямоугольная.

А это значит, что вы не сможете как угодно вставить ее в декоративную рамку.

К примеру, для поворота на 90 градусов, вам придется выковыривать из рамки крепежный элемент с защелками, и также поворачивать его под прямым углом.

Только после этого, все закрепляется без проблем.



Таким образом, одну и ту же рамку, можно поставить как в вертикальный блок розеток, так и в горизонтальный.

Статьи по теме

javascript - Как вставить данные с клиента на сервер с помощью socket.io?

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
.HOWTO по программированию сокетов

- документация Python 3.3.7

Аннотация

Розетки используются почти везде, но являются одними из самых неправильно понятые технологии вокруг. Это обзор розеток на 10 000 футов. На самом деле это не учебник - вам еще нужно поработать, чтобы что-то получить оперативный. Он не затрагивает тонкости (а их очень много), но Я надеюсь, что это даст вам достаточно знаний, чтобы начать их прилично использовать.

Розетки

Я буду говорить только об INET (т.е. IPv4), но они составляют не менее 99% используемые розетки. И я буду говорить только о сокетах STREAM (т. Е. TCP) - если только вы знать, что вы делаете (в этом случае этот HOWTO не для вас!), вы получите лучшее поведение и производительность от сокета STREAM, чем что-либо еще. Я буду попытаться раскрыть тайну того, что такое сокет, а также дать несколько советов о том, как работа с блокирующими и неблокирующими розетками. Но я начну с разговора о блокировка розеток. Вам нужно знать, как они работают, прежде чем начинать неблокирующие розетки.

Отчасти проблема с пониманием этих вещей состоит в том, что «сокет» может означать количество неуловимо разных вещей, в зависимости от контекста. Итак, сначала давайте сделаем различие между «клиентским» сокетом - конечной точкой разговора и «Серверная» розетка, которая больше похожа на операторский коммутатор. Клиент приложение (например, ваш браузер) использует исключительно «клиентские» сокеты; то веб-сервер, с которым он разговаривает, использует как «серверные», так и «клиентские» сокеты.

История

Из различных форм МПК , розетки на сегодняшний день являются самыми популярными.На любой платформе есть вероятно, будут другие формы IPC, которые быстрее, но для кроссплатформенное общение, сокеты - это почти единственная игра в городе.

Они были изобретены в Беркли как часть разновидности BSD Unix. Они распространяются как лесной пожар с Интернетом. Не зря - комбинация розеток. с INET делает разговор с произвольными машинами по всему миру невероятно простым (по крайней мере, по сравнению с другими схемами).

Создание сокета

Грубо говоря, когда вы нажимали на ссылку, которая привела вас на эту страницу, ваш браузер сделал что-то вроде следующего:

 # создать INET, STREAMing сокет s = розетка.сокет (socket.AF_INET, socket.SOCK_STREAM) # теперь подключаемся к веб-серверу через порт 80 - обычный http порт s.connect (("www.python.org", 80)) 

Когда соединение завершится, сокет s может использоваться для отправки в запросе текста страницы. Тот же сокет будет читать ответить, а затем быть уничтоженным. Правильно, уничтожено. Клиентские сокеты обычно используются только для одного обмена (или небольшого набора последовательных обмены).

То, что происходит на веб-сервере, немного сложнее.Во-первых, веб-сервер создает «серверный сокет»:

 # создать INET, STREAMing сокет serversocket = socket.socket (socket.AF_INET, socket.SOCK_STREAM) # привязываем сокет к общедоступному хосту и известному порту serversocket.bind ((socket.gethostname (), 80)) # стать серверным сокетом serversocket.listen (5) 

Следует отметить пару вещей: мы использовали socket.gethostname (), чтобы сокет будет видно внешнему миру. Если бы мы использовали s.bind (('localhost', 80)) или s.bind (('127.0.0.1 ', 80)) у нас остался бы «серверный» сокет, но тот, который был виден только внутри той же машины. s.bind ((', 80)) указывает, что сокет доступен по любому адресу, с которым встречается машина имеют.

Второе, на что следует обратить внимание: порты с небольшим номером обычно зарезервированы для «хорошо известных» сервисы (HTTP, SNMP и т. д.). Если вы играете, используйте хорошее большое число (4 цифры).

Наконец, аргумент listen сообщает библиотеке сокетов, что мы хотим, чтобы она поставьте в очередь до 5 запросов на соединение (нормальный максимум), прежде чем отказывать извне соединения.Если остальная часть кода написана правильно, этого должно быть достаточно.

Теперь, когда у нас есть «серверный» сокет, прослушивающий порт 80, мы можем ввести основной цикл веб-сервера:

, пока True: # принимать подключения извне (клиентский сокет, адрес) = serversocket.accept () # теперь что-нибудь сделаем с клиентским сокетом # в этом случае мы представим, что это многопоточный сервер ct = client_thread (клиентский сокет) ct.run () 

На самом деле существует 3 основных способа работы этого цикла - отправка поток для обработки клиентского сокета, создайте новый процесс для обработки clientocket или реструктурируйте это приложение, чтобы использовать неблокирующие сокеты, и мультиплексирование между нашим «серверным» сокетом и любыми активными клиентскими сокетами, использующими Выбрать.Подробнее об этом позже. Сейчас важно понять, это: это все «серверный» сокет. Он не отправляет никаких данных. Это не получать любые данные. Он просто производит «клиентские» сокеты. Каждый клиентский сокет создается в ответ на других «клиентских» сокетов, выполняющих соединение () с хост и порт, к которым мы привязаны. Как только мы создали этот клиентский сокет, мы вернитесь к прослушиванию для получения дополнительных подключений. Два «клиента» могут свободно общаться в чате. вверх - они используют какой-то динамически выделенный порт, который будет переработан, когда разговор заканчивается.

МПК

Если вам нужен быстрый IPC между двумя процессами на одной машине, вам следует изучить каналы или разделяемая память. Если вы решили использовать сокеты AF_INET, привяжите Сокет «server» на «localhost». На большинстве платформ это займет сократить несколько слоев сетевого кода и работать немного быстрее.

См. Также

Многопроцессорность интегрирует межплатформенный IPC в более высокий уровень API.

Использование розетки

Первое, что следует отметить, это то, что "клиентский" сокет веб-браузера и Интернет серверные «клиентские» сокеты такие же звери.То есть это «одноранговый» разговор. Или, другими словами, в качестве дизайнера вам придется решить, каковы правила этикета для разговора . Обычно Соединительный сокет начинает диалог, отправляя запрос, или возможно знак. Но это дизайнерское решение, а не розетки.

Теперь есть два набора глаголов, которые можно использовать для общения. Вы можете использовать send и recv, или вы можете превратить свой клиентский сокет в файлового зверя и используйте чтение и запись.Именно так Java представляет свои сокеты. Я не собираюсь здесь говорить об этом, но хочу предупредить, что вам нужно использовать заподлицо с розетками. Это буферизованные «файлы», и распространенной ошибкой является напишите что-нибудь, а затем прочтите, чтобы получить ответ. Без смыва там вы можете ждать ответа вечно, потому что запрос все еще может быть в ваш выходной буфер.

Теперь мы подошли к главному камню преткновения сокетов - работе send и recv. в сетевых буферах. Они не обязательно обрабатывают все передаваемые вами байты их (или ожидайте от них), потому что их основное внимание уделяется работе с сетью буферы.Как правило, они возвращаются, когда соответствующие сетевые буферы были заполнены (отправить) или опорожнены (recv). Затем они сообщают вам, сколько байтов они обработано. Это , ваша ответственность - позвонить им еще раз, пока ваше сообщение не будет полностью разобрались.

Когда recv возвращает 0 байтов, это означает, что другая сторона закрылась (или находится в процесс закрытия) соединение. Вы больше не получите данных о это соединение. Когда-либо. Возможно, вы сможете успешно отправить данные; Я поговорю подробнее об этом позже.

Протокол, такой как HTTP, использует сокет только для одной передачи. Клиент отправляет запрос, затем читает ответ. Это оно. Сокет отбрасывается. Это значит, что клиент может определить конец ответа, получив 0 байтов.

Но если вы планируете повторно использовать розетку для дальнейших передач, вам необходимо что нет EOT на розетке. Повторяю: если розетка send или recv возвращается после обработки 0 байтов, соединение было сломан.Если соединение , а не разорвано, вы можете подождать навсегда, потому что сокет , а не скажет вам, что больше нечего читать (пока). Если вы немного подумаете об этом, вы поймете, что Основная истина сокетов: сообщения должны иметь фиксированную длину (фу), или быть разделенными (пожать плечами), или указать их длину (намного лучше), или закончиться отключение соединения . Выбор полностью за вами, но некоторые способы правее других).

Если вы не хотите разрывать соединение, самым простым решением является фиксированный длина сообщения:

Класс
 mysocket: "" "только демонстрационный класс - закодирован для ясности, а не эффективности "" " def __ini 
.

Руководств по программированию на Python


Учебное пособие по сокетам с Python 3, часть 1 - отправка и получение данных

Добро пожаловать в учебник по сокетам с Python 3. Нам есть о чем рассказать, так что давайте сразу приступим. Библиотека socket является частью стандартной библиотеки, так что она у вас уже есть.

 импортный разъем # создаем сокет # AF_INET == ipv4 # SOCK_STREAM == TCP s = socket.socket (socket.AF_INET, сокет.SOCK_STREAM) 

Переменная s - это наш TCP / IP-сокет. AF_INET относится к семейству или домену, это означает ipv4, в отличие от ipv6 с AF_INET6. SOCK_STREAM означает, что это будет сокет TCP, который является нашим типом сокета. TCP означает, что он будет ориентирован на соединение, а не без установления соединения.

Хорошо, а что такое розетка? Сам сокет - это лишь одна из конечных точек связи между программами в какой-то сети.

Сокет будет привязан к какому-то порту на каком-то хосте.В общем, у вас будет объект или программа клиентского или серверного типа.

В случае сервера вы привяжете сокет к какому-либо порту на сервере (localhost). В случае клиента вы подключите сокет к этому серверу на том же порту, который использует код на стороне сервера.

Давайте пока сделаем этот код нашей серверной:

 s.bind ((socket.gethostname (), 1234)) 

Для IP-сокетов адрес, к которому мы привязываемся, представляет собой кортеж из имени хоста и номера порта.

Теперь, когда мы это сделали, давайте послушаем входящие соединения. Мы можем обрабатывать только одно соединение в данный момент времени, поэтому мы хотим разрешить какую-то очередь, на случай, если мы получим небольшой всплеск. Если кто-то попытается подключиться, пока очередь заполнена, ему будет отказано.

Сделаем очередь из 5:

 s.listen (5) 

А теперь послушаем!

, пока True: # теперь наша конечная точка знает о ДРУГОЙ конечной точке. clientocket, адрес = s.принять () print (f "Соединение с {адрес} установлено.") 

Полный код для server.py :

 импортный разъем s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) s.listen (5) в то время как True: # теперь наша конечная точка знает о ДРУГОЙ конечной точке. clientocket, адрес = s.accept () print (f "Установлено соединение с {адрес}.") 

Теперь нам нужно сделать код нашего клиента!

 импортный разъем s = розетка.сокет (socket.AF_INET, socket.SOCK_STREAM) 

Теперь, поскольку это клиент, а не привязка , мы собираемся подключиться к .

 s.connect ((socket.gethostname (), 1234)) 

В более традиционном понимании термина «клиент и сервер» у вас не может быть клиента и сервера на одной машине. Если вы хотите, чтобы две программы общались друг с другом локально, вы могли бы это сделать, но обычно ваш клиент с большей вероятностью будет подключаться к какому-либо внешнему серверу, используя свой общедоступный IP-адрес, а не сокет .gethostname () . Вместо этого вы передадите строку IP.

Полный client.py Код до этого момента:

 импортный разъем s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 1234)) 

Хорошо, теперь мы просто запускаем оба. Сначала запустим наш сервер:

python3 server.py

python3 client.py

На нашем сервере мы должны увидеть:

 Подключение из ('192.168.86.34 ', 54276). 

Однако наш клиент просто выходит после этого, потому что он выполнил свою работу.

Итак, мы установили соединение, и это круто, но мы действительно хотим отправлять сообщения и / или данные туда и обратно. Как мы это делаем?

Наши розетки могут отправлять данные и recv . Эти методы обработки данных имеют дело с буферами. Буферы бывают порциями данных фиксированного размера. Посмотрим, что в действии:

Внутри сервера .py , добавим:

 clientsocket.send (bytes («Привет !!!», «utf-8»)) 

В наш цикл while , поэтому полный код для server.py становится:

 импортный разъем s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) s.listen (5) в то время как True: # теперь наша конечная точка знает о ДРУГОЙ конечной точке. clientocket, адрес = s.accept () print (f "Установлено соединение с {адрес}.") клиентский сокет.send (bytes («Привет !!!», «utf-8»)) 

Итак, мы отправили некоторые данные, теперь мы хотим их получить. Итак, в нашем client.py мы сделаем:

 сообщение = s.recv (1024) 

Это означает, что наш сокет будет пытаться получить данные с размером буфера 1024 байта за раз.

Тогда давайте просто сделаем что-нибудь базовое с полученными данными, например, распечатаем их!

 print (msg.decode ("utf-8")) 

Круто, теперь наш полный код client.py :

 импортный разъем s = розетка.сокет (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 1234)) msg = s.recv (1024) print (msg.decode ("utf-8")) 

Теперь запустите server.py и затем client.py . Наш server.py показывает:

 Соединение с ('192.168.86.34', 55300) установлено. 

В то время как наш client.py теперь показывает:

 Привет !!! 

И он выходит. Хорошо, давайте немного настроим этот буфер, изменив клиента .py recv , чтобы быть в 8 байтах за раз.

client.py

 импортный разъем s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 1234)) msg = s.recv (8) print (msg.decode ("utf-8")) 

Теперь повторно запустите client.py , и вместо этого вы увидите что-то вроде:

 Привет, 

Не выглядишь так жарко! Таким образом, вы можете понять, что буквально складывается до 8 символов, поэтому каждый байт является символом.Почему бы ... вернуться к 1024? или какое-то огромное количество. Зачем вообще работать в буферах?

В какой-то момент, независимо от того, какой номер вы установили, многие приложения, использующие сокеты, в конечном итоге захотят отправить некоторое количество байтов, намного превышающее размер буфера. Вместо этого нам, вероятно, нужно построить нашу программу с нуля, чтобы фактически принимать все сообщения в кусках буфера, даже если обычно есть только один фрагмент. Мы делаем это в основном для управления памятью. Расчеты в зависимости от приложения могут отличаться, и вы можете позже поиграть с размером буфера.Единственное, что я могу с уверенностью пообещать, это то, что вам нужно с самого начала планировать обработку коммуникаций по частям.

Как мы можем это сделать для нашего клиента? Петля и звучит так, как будто она отвечает всем требованиям. Данные будут поступать в виде потока, поэтому на самом деле обработка этого так же проста, как изменение нашего файла client.py на:

 импортный разъем s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 1234)) в то время как True: сообщение = s.recv (8) print (msg.decode ("utf-8")) 

Итак, на данный момент мы будем получать эти данные и распечатывать их порциями. Если сейчас запустить client.py , мы увидим:

 Привет е !!! 

Также следует отметить, что наш client.py больше не закрывается. Это соединение сейчас остается открытым. Это связано с нашим циклом и . Мы можем использовать .close () на сокете, чтобы закрыть его, если захотим. Мы можем сделать это либо на сервере, либо на клиенте ...или оба. Вероятно, это хорошая идея, чтобы быть готовым к разрыву или закрытию соединения по какой-либо причине. Например, мы можем закрыть соединение после того, как отправим наше сообщение на сервер:

server.py

 импортный разъем s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) s.listen (5) в то время как True: # теперь наша конечная точка знает о ДРУГОЙ конечной точке. clientocket, адрес = s.accept () print (f "Соединение с {адрес} установлено.") clientsocket.send (bytes («Привет !!!», «utf-8»)) clientsocket.close () 

Однако, если мы запустим это, мы увидим наш client.py. затем рассылает кучу пустоты, потому что данные, которые он получает, ну, ну, ничто. Оно пустое. 0 байт, но мы по-прежнему просим его распечатать то, что он получает, даже если это ничего! Мы можем это исправить:

client.py

 импортный разъем s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) с.подключить ((socket.gethostname (), 1234)) full_msg = '' в то время как True: msg = s.recv (8) если len (сообщение) 

Итак, теперь мы буферизуем все сообщение. Когда мы достигаем конца, который мы отмечаем получением 0 байтов, мы прерываем, а затем возвращаем сообщение. На этом завершается client.py . Теперь клиент, вероятно, хочет также поддерживать соединение. Как мы можем это сделать? Еще один цикл и может помочь.

client.py

 импортный разъем s = розетка.сокет (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 1234)) в то время как True: full_msg = '' в то время как True: msg = s.recv (8) если len (сообщение) 

Конечно, нам, вероятно, следует еще раз убедиться, что в full_msg есть что-то существенное, прежде чем мы его распечатаем:

client.py

 импортный разъем s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 1234)) в то время как True: full_msg = '' в то время как True: сообщение = s.recv (8) если len (msg) 0: печать (full_msg) 

Это работает, но у нас есть проблемы. Что произойдет, когда мы перестанем закрывать клиентский сокет на стороне сервера? Мы никогда не получаем сообщения! Почему это?

TCP - это коммуникационный * поток * ... так как же нам узнать, когда действительно происходит сообщение? Как правило, нам нужен способ уведомить принимающий сокет о сообщении и о том, насколько оно будет большим. Есть много способов сделать это. Один из популярных способов - использовать заголовок, который всегда ведет к нашему сообщению.Мы также могли бы использовать какой-то нижний колонтитул, но это может вызвать проблемы, если кто-то узнает о наших методах.

Мы будем работать над этим в следующем уроке.

Следующий учебник: Учебник по сокетам с Python 3, часть 2 - буферизация и потоковая передача данных


.HOWTO по программированию сокетов

- документация Python 3.9.0

Автор

Гордон Макмиллан

Аннотация

Розетки используются почти везде, но являются одними из самых неправильно понятые технологии вокруг. Это обзор розеток на 10 000 футов. На самом деле это не учебник - вам еще нужно поработать, чтобы что-то получить оперативный. Он не затрагивает тонкости (а их очень много), но Я надеюсь, что это даст вам достаточно знаний, чтобы начать их прилично использовать.

Розетки

Я буду говорить только о сокетах INET (то есть IPv4), но они составляют не менее 99% используемые розетки. И я буду говорить только о сокетах STREAM (т. Е. TCP) - если только вы знать, что вы делаете (в этом случае этот HOWTO не для вас!), вы получите лучшее поведение и производительность от сокета STREAM, чем что-либо еще. Я буду попытаться раскрыть тайну того, что такое сокет, а также дать несколько советов о том, как работа с блокирующими и неблокирующими розетками.Но я начну с разговора о блокировка розеток. Вам нужно знать, как они работают, прежде чем начинать неблокирующие розетки.

Отчасти проблема с пониманием этих вещей состоит в том, что «сокет» может означать количество неуловимо разных вещей, в зависимости от контекста. Итак, сначала давайте сделаем различие между «клиентским» сокетом - конечной точкой разговора и «Серверная» розетка, которая больше похожа на операторский коммутатор. Клиент приложение (например, ваш браузер) использует исключительно «клиентские» сокеты; то веб-сервер, с которым он разговаривает, использует как «серверные», так и «клиентские» сокеты.

История

Из различных форм МПК , розетки на сегодняшний день являются самыми популярными. На любой платформе есть вероятно, будут другие формы IPC, которые быстрее, но для кроссплатформенное общение, сокеты - это почти единственная игра в городе.

Они были изобретены в Беркли как часть разновидности BSD Unix. Они распространяются как лесной пожар с Интернетом. Не зря - комбинация розеток. с INET делает разговор с произвольными машинами по всему миру невероятно простым (по крайней мере, по сравнению с другими схемами).

Создание сокета

Грубо говоря, когда вы нажимали на ссылку, которая привела вас на эту страницу, ваш браузер сделал что-то вроде следующего:

 # создать INET, STREAMing сокет s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) # теперь подключаемся к веб-серверу через порт 80 - обычный http порт s.connect (("www.python.org", 80)) 

Когда подключение завершается, сокет s может использоваться для отправки в запросе текста страницы.Тот же сокет будет читать ответить, а затем быть уничтоженным. Правильно, уничтожено. Клиентские сокеты обычно используются только для одного обмена (или небольшого набора последовательных обмены).

То, что происходит на веб-сервере, немного сложнее. Во-первых, веб-сервер создает «серверный сокет»:

 # создать INET, STREAMing сокет serversocket = socket.socket (socket.AF_INET, socket.SOCK_STREAM) # привязываем сокет к общедоступному хосту и известному порту serversocket.bind ((socket.gethostname (), 80)) # стать серверным сокетом серверный сокет.слушать (5) 

Следует отметить пару моментов: мы использовали socket.gethostname () , чтобы сокет будет видно внешнему миру. Если бы мы использовали s.bind (('localhost', 80)) или s.bind (('127.0.0.1', 80)) у нас все равно будет сокет «сервер», но тот, который был виден только внутри той же машины. s.bind (('', 80)) указывает, что сокет доступен по любому адресу, с которым встречается машина имеют.

Второе замечание: порты с небольшим номером обычно зарезервированы для «хорошо известных» сервисы (HTTP, SNMP и т. д.).Если вы играете, используйте хорошее большое число (4 цифры).

Наконец, аргумент listen сообщает библиотеке сокетов, что мы хотим, чтобы поставьте в очередь до 5 запросов на соединение (нормальный максимум), прежде чем отказывать извне соединения. Если остальная часть кода написана правильно, этого должно быть достаточно.

Теперь, когда у нас есть «серверный» сокет, прослушивающий порт 80, мы можем ввести основной цикл веб-сервера:

, пока True: # принимать подключения извне (клиентский сокет, адрес) = серверный сокет.принять () # теперь что-нибудь сделаем с клиентским сокетом # в этом случае мы представим, что это многопоточный сервер ct = client_thread (клиентский сокет) ct.run () 

На самом деле существует 3 основных способа работы этого цикла - отправка поток для обработки clientocket , создайте новый процесс для обработки clientocket , или реструктурируйте это приложение для использования неблокирующих сокетов, и мультиплексирование между нашим «серверным» сокетом и любым активным клиентским сокетом с использованием выберите .Подробнее об этом позже. Сейчас важно понять, это: это все «серверный» сокет. Он не отправляет никаких данных. Это не получать любые данные. Он просто производит «клиентские» сокеты. Каждому клиентскому сокету соответствует создается в ответ на то, что какой-то другой «клиентский» сокет выполняет соединение connect () с хост и порт, к которым мы привязаны. Как только мы создали этот клиентский сокет , мы вернитесь к прослушиванию для получения дополнительных подключений. Два «клиента» могут свободно общаться в чате. вверх - они используют какой-то динамически выделенный порт, который будет переработан, когда разговор заканчивается.

МПК

Если вам нужен быстрый IPC между двумя процессами на одной машине, вам следует изучить каналы или разделяемая память. Если вы решили использовать сокеты AF_INET, привяжите Сокет «server» на «localhost» . На большинстве платформ это займет сократить несколько слоев сетевого кода и работать немного быстрее.

См. Также

Многопроцессорная модель интегрирует межплатформенные IPC в более высокий уровень API.

Использование розетки

Первое, что следует отметить, это то, что "клиентский" сокет веб-браузера и Интернет серверные «клиентские» сокеты такие же звери.То есть это «одноранговый» разговор. Или, другими словами, в качестве дизайнера вам придется решить, каковы правила этикета для разговора . Обычно connect ing socket начинает диалог, отправляя запрос, или возможно знак. Но это дизайнерское решение, а не розетки.

Теперь есть два набора глаголов, которые можно использовать для общения. Вы можете использовать отправить и recv , или вы можете превратить свой клиентский сокет в файлового зверя и используйте для чтения и для записи .Именно так Java представляет свои сокеты. Я не собираюсь здесь говорить об этом, но хочу предупредить, что вам нужно использовать заподлицо на розетки. Это буферизованные «файлы», и распространенной ошибкой является напишите что-нибудь, а затем прочтите для ответа. Без промывки дюймов там вы можете ждать ответа вечно, потому что запрос все еще может быть в ваш выходной буфер.

Теперь мы подошли к главному камню преткновения розеток - send и recv работают. в сетевых буферах.Они не обязательно обрабатывают все передаваемые вами байты их (или ожидайте от них), потому что их основное внимание уделяется работе с сетью буферы. Как правило, они возвращаются, когда соответствующие сетевые буферы были заполнены ( отправить ) или опорожнены ( recv ). Затем они сообщают вам, сколько байтов они обработано. - это ваша ответственность - позвонить им еще раз, пока ваше сообщение не будет полностью разобрались.

Когда recv возвращает 0 байтов, это означает, что другая сторона закрыта (или находится в процесс закрытия) соединение.Вы больше не получите данных о это соединение. Когда-либо. Возможно, вы сможете успешно отправить данные; Я поговорю подробнее об этом позже.

Протокол, подобный HTTP, использует сокет только для одной передачи. Клиент отправляет запрос, затем читает ответ. Это оно. Сокет отбрасывается. Это значит, что клиент может определить конец ответа, получив 0 байтов.

Но если вы планируете повторно использовать розетку для дальнейших передач, вам необходимо что нет EOT на розетке. Повторюсь: если розетка отправить или recv возвращается после обработки 0 байтов, соединение было сломан. Если соединение , а не разорвано, вы можете подождать recv навсегда, потому что сокет , а не скажет вам, что больше нечего читать (пока). Если вы немного подумаете об этом, вы поймете, что фундаментальная истина сокетов: сообщения должны иметь фиксированную длину (фу), или быть гастроном

.

Смотрите также