Что такое программирование сокетов в Python и как его освоить?



Узнайте, что такое программирование сокетов в Python, а также взаимодействие клиент-сервер и передача объектов Python с помощью pickle и сокетов.

Интернет, несомненно, стал «душой существования», и его деятельность характеризуется «связями» или «сетями». Эти сети стали возможными благодаря одной из важнейших основ Розетки. Эта статья охватывает все области, связанные с программированием сокетов в Python. Сокеты помогают устанавливать эти соединения, а , несомненно, делает это легко.

Давайте кратко рассмотрим все темы, затронутые в этой статье:





Зачем использовать сокеты?
Что такое сокеты в Python?
Как достичь программирования сокетов в Python
Что такое сервер?
Что такое клиент?
Эхо клиент-сервер
Множественные коммуникации
Передача объектов Python



Зачем использовать сокеты?

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

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

Что такое сокеты?

В общем, сокеты - это внутренние конечные точки, созданные для отправки и получения данных. В единой сети будет два разъема, по одному для каждого устройства или программы, передающих данные. Эти сокеты представляют собой комбинацию IP-адреса и порта. Одно устройство может иметь «n» сокетов в зависимости от номера порта, который используется. Для разных типов протоколов доступны разные порты. Взгляните на следующее изображение, чтобы узнать больше о некоторых общих номерах портов и связанных протоколах:




общие порты-SocketProgramminginPython-Edureka

Теперь, когда вы понимаете концепцию сокетов, давайте взглянем на модуль Socket в Python:

завершить программу на java

Как достичь программирования сокетов в Python:

Чтобы достичь программирования сокетов в Python, вам необходимо импортировать разъем модуль или . Этот модуль состоит из встроенных методов, которые необходимы для создания сокетов и помогают им связываться друг с другом.

Вот некоторые из важных методов:

МетодыОписание

socket.socket ()

используется для создания сокетов (требуется как на сервере, так и на стороне клиента для создания сокетов)

socket.accept ()

используется для принятия соединения. Он возвращает пару значений (conn, адрес), где conn - это новый объект сокета для отправки или получения данных, а address - это адрес сокета, присутствующего на другом конце соединения.

socket.bind ()

используется для привязки к адресу, указанному в качестве параметра

socket.close ()

используется для обозначения сокета как закрытого

socket.connect ()

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

socket.listen ()

позволяет серверу принимать соединения

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

Что такое сервер?

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

Серверы обычно используют такие методы, как socket.socket (), socket.bind (), socket.listen () и т. Д., Чтобы установить соединение и привязать к клиентам. Теперь напишем программу для создания сервера. Рассмотрим следующий пример:

ПРИМЕР:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) # номер порта может быть любым от 0 до 65535 (обычно мы указываем не приоритетные порты, которые являются > 1023) s.listen (5) while True: clt, adr = s.accept () print (f'Connection to {adr} installed ') #f string - это буквальная строка с префиксом f, которая # содержит выражения Python в фигурных скобках clt .send (bytes ('Socket Programming in Python', 'utf-8')) # для отправки информации в clientocket

Как видите, первая необходимость для создания сокета - это импортировать модуль сокета. После этого метод socket.socket () используется для создания серверного сокета.

НОТА:

AF_INET относится к адресу из Интернета, и для него требуется пара (хост, порт), где хост может быть либо URL-адресом определенного веб-сайта, либо его адресом, а номер порта - целым числом. SOCK_STREAM используется для создания протоколов TCP.

Метод bind () принимает два параметра как кортеж (хост, порт). Однако лучше использовать 4-значные номера портов, так как младшие обычно заняты. Метод listen () позволяет серверу принимать соединения. Здесь 5 - это очередь для нескольких одновременных подключений. Минимальное значение, которое можно указать здесь, - 0 (если вы зададите меньшее значение, оно изменится на 0). Если параметр не указан, выбирается подходящий по умолчанию.

В позволяет принимать соединения навсегда. «Clt» и «adr» - это объект и адрес клиента. Оператор печати просто выводит адрес и номер порта клиентского сокета. Наконец, clt.send используется для отправки данных в байтах.

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

Что такое клиент?

Клиент - это компьютер или программное обеспечение, которое получает информацию или услуги от сервера. В модуле клиент-сервер клиенты запрашивают услуги с серверов. Лучшим примером является веб-браузер, такой как Google Chrome, Firefox и т. Д. Эти веб-браузеры запрашивают веб-серверы для необходимых веб-страниц и услуг в соответствии с указаниями пользователя. Другие примеры включают онлайн-игры, онлайн-чаты и т. Д.

Теперь давайте посмотрим, как кодировать клиентскую программу на :

ПРИМЕР:

импорт сокета s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) msg ​​= s.recv (1024) print (msg.decode ('utf-8') )

Первый шаг - импортировать модуль сокета, а затем создать сокет, как вы это делали при создании сервера. Затем, чтобы создать соединение между клиент-сервером, вам нужно будет использовать метод connect (), указав (хост, порт).


НОТА: gethostname используется, когда клиент и сервер находятся на одном компьютере. (LAN - localip / WAN - publicip)

Здесь клиент хочет получить некоторую информацию от сервера, и для этого вам нужно использовать метод recv (), и информация сохраняется в другой переменной msg. Просто имейте в виду, что передаваемая информация будет в байтах, и клиент в приведенной выше программе может получить до 1024 байтов (размер буфера) за одну передачу. Его можно указать в любом размере в зависимости от объема передаваемой информации.

Наконец, передаваемое сообщение следует декодировать и распечатать.

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

Эхо клиент-сервер:

Чтобы выполнить эти программы, откройте командную строку, войдите в папку, в которой вы создали клиентскую и серверную программу, и введите:

py server.py (здесь server.py - это имя файла сервера, вы также можете использовать py -3.7 server.py)

Как только это будет сделано, сервер запустится. Чтобы запустить клиент, откройте другое окно cmd и введите:

py client.py (здесь client.py - имя файла клиента)

ВЫХОД (СЕРВЕР):

(КЛИЕНТ)

роли и обязанности администратора linux

Давайте попробуем ту же программу, уменьшив размер буфера до 7, и посмотрим, какой результат мы получим:

ВЫВОД:

класс python __init__

Как видите, соединение разрывается после передачи 7 байт. Но это проблема, потому что вы не получили полную информацию и соединение закрыто. Пойдем дальше решать эту проблему.

Множественные коммуникации:

Чтобы соединение продолжалось до тех пор, пока клиент не получит полную информацию, вы можете использовать цикл while:

ПРИМЕР:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) while True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

Как только вы это сделаете, полное сообщение будет получено в 7 байтах на передачу.

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

ПРИМЕР:

complete_info = '', а True: msg = s.recv (7) if len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

На стороне сервера используйте метод close () следующим образом:

clt.close ()

Результат будет таким, как показано на изображении ниже:

ВЫВОД:



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

Передача объектов Python:

До этого момента вы только что научились переносить струны. Но программирование сокетов в Python также позволяет передавать объекты Python. Эти объекты могут быть чем угодно, например наборами, кортежами, словарями и т. Д. Для этого вам необходимо импортировать модуль pickle Python.

Модуль рассола Python:

Модуль pickle Python появляется, когда вы фактически сериализуете или десериализуете объекты в python. Давайте посмотрим на небольшой пример,

ПРИМЕР:

импортировать рассол mylist = [1,2, 'abc'] mymsg = pickle.dumps (mylist) print (mymsg)

ВЫВОД: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ’

Как видите, в приведенной выше программе «mylist» сериализуется с помощью функции dumps () модуля pickle. Также обратите внимание, что вывод начинается с буквы «b», что означает, что он преобразован в байты. В программировании сокетов вы можете реализовать этот модуль для передачи объекты Python между клиентами и серверами.

Как использовать модуль pickle для передачи структур объектов Python?

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

На стороне сервера:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 2133)) # привязка кортежа s.listen (5) while True: clt, adr = s.accept () print (f'Connection to {adr} installed ') m = {1:' Client ', 2:' Server '} mymsg = pickle.dumps (m) # сообщение, которое мы хотим напечатать позже mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Здесь m - словарь, который по сути который необходимо отправить с сервера клиенту. Это делается путем сначала сериализации объекта с помощью dumps (), а затем его преобразования в байты.
Теперь давайте запишем копию на стороне клиента:

Сторона клиента:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)) while True: complete_info = b '' rec_msg = True, пока True: mymsg = s.recv (10) if rec_msg: print (f'Длина сообщения = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = False complete_info + = mymsg if len (complete_info) -a == x: print ('Получена полная информация') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' print (complete_info )

Первый цикл while поможет нам отслеживать полное сообщение (complete_info), а также сообщение, полученное (rec_msg) с использованием буфера. сообщение, установив rec_
Затем, пока сообщение получено, все, что я делаю, это распечатываю каждый его бит, полученный в буфере размера 10. Этот размер может быть любым, в зависимости от вашего личного выбора.

Затем, если полученное сообщение совпадает с полным сообщением, я просто распечатываю сообщение как полученную полную информацию, после чего я де-сериализовал сообщение с помощью load ().

Результат работы вышеуказанной программы следующий:

На этом мы подошли к концу статьи о программировании сокетов в Python. Надеюсь, вы ясно поняли все концепции.

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

Есть вопрос к нам? Пожалуйста, укажите это в разделе комментариев этого блога «Программирование сокетов в Python», и мы свяжемся с вами как можно скорее.

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