Сокеты в Python 3

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

Сокет – это программный интерфейс, который является точкой соединения сторон для обмена данными. Он имеет определенное содержание, которое можно извлечь или пополнить. Сокеты имеют свою характеристику. Одним из пунктов является версия интернет протокола. Их выделяют две: IPv4 и IPv6.

Второй пункт характеристики сокетов – тип передачи данных и протокол. При этом, в одном информационном пакете данных есть лимит веса. Каждому пакету присваивается адрес сторон и время.
При передаче данных вероятна потеря информации или нарушение её целостности. То есть сообщение может попросту не прийти или не отправиться, а также прийти с задержкой.

Это может привести к общей не читаемости отправленного сообщения. Чтобы избежать подобных ситуаций, НТТР работает вместе с ТСР, протоколом управления передачей. Для осуществления цели используется соединение. Они содержат информацию о нумерации пакетов.

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

Python 3 сетевое программирование

Для создания сокета используется функция socket.socket( ). Работа с сокетами может осуществляться путем применения к ним функций, таких как bind (связь с портом и именем), listen (прослушивание сокета), accept(присоединение пользователя). Клиент может присоединиться к сокету при помощи функции connect.
Для работы с сокетом используются также конструкции recv или recvfrom(получение), send или sendto(отправка), close(закрытие сокета), а также gethostname(получить имя хоста).

Чат клиент/сервер

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

Для работы чата необходимо минимум две части:

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

Приступим к написанию сервера. Изначально нужно создать программный интерфейс (сокет, socket), который будет обеспечивать обмен данных. Сделать это можно с помощью конструкции importsocket. В ту же строку через запятую добавляемtime.

Затем вводим переменнуюhost, обозначающую IP-адрес. Это необходимо для правильной работы программы при смене геолокации.

Host=socket.gethostbyname (socket.gethostname( ))

Для создания подключения нужно выбрать порт (port). Всего их существует 65535, но обычно до определенной цифры их использовать можно только при наличии прав root. Примем значение порта за 11111.
Создаем массив, хранящий адреса клиентов. Используем переменнуюclients для наглядности.

Clients= [ ]

Сокеты могут быть клиентские и серверные. К серверному сокету подключается клиентский. Через установленное соединение происходит обмен данными. Создадим переменную: sock = socket.socket(). В скобках через запятую указываем версию интернет протокола и тип сокета (socket.AF_INET, socket.SOCK_DGRAM).

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

Sock.bind((host, port)).

Вводим переменную, обозначающую ложь (false). Её используют для окончания цикла программы. Это произойдет тогда, когда переменная, означающая правду станет равна лжи. Цикл остановится, и сервер перестанет работать.

F=false

Чтобы обозначить начало работы цикла, выводим надпись Started.

Print(‘[ Started ]’)

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

WhilenotF:

Затем, будем последовательно описывать блоки try и except. Эти конструкции связаны, так как если программа находит исключение из условия блока try, то она действует по блоку except.

В части try вводим две равнозначные переменные даты и адреса, обозначимmessage, address. Последняя означает адрес пользователя, а первая – текст сообщения с никнеймом отправителя. Присваиваем этим переменным значение сокета с функцией recvfrom( ). В скобках указываем вес файла. Базовое значение – 1024 байт.

Try:

Message, address = sock.recvfrom (1024)

Далее идёт строка распознавания адреса клиента. Если он новый, то адрес вносится в массив Clients.

If address not in Clients:
Clients.append(address)

В мессенджерах обычно указывается время отправки сообщений или уведомлений о присоединении новых участников или выходе старых. Для этого введем переменную T. В её значении укажем год, месяц, день, час, минуту, секунду. Для этого используем конструкцию strftime и localtime.

T=time.strftime(‘ %y-%m-%d-%h.%M.%s ’, time.localtime())

Чтобы всё это было видно на сервере, выводим данные с помощью функции print и расшифровываем закодированное в 8-битном виде сообщение.

Print( ‘[‘+address[0]+’]=[‘+str(address[1])+’]=[‘+T+’]/’, end=’ ’ )
Print (massage.decode( ‘utf-8’ ))

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

For client in Clients:
If address! =client:
Sock.sendto (message, client)

Теперь опишем исключение. Если в программе произошла ошибка (например, выход из программы). Эту часть мы пишем в разделе except. Для обозначения окончания работы сервера выведем надпись Stopped.

Print (‘\n[ Stopped ]’)
F=true

Последняя, завершающая срока в программе сервера – закрытие сокета.

Sock.close()

Далее нужно написать программу клиента. Её структура сходна с сервером, но она более сложная. Первая строка также исполняется при помощи функции import, но к socket и time прибавляется модуль threading. Он нужен чтобы пользователь мог получать сообщения сразу. Без этого модуля программа показывала бы новое сообщение только после отправления ответа. Так, теряется удобство и смысл мессенджера.

Importsocket, time, threading

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

Key=8194

Вводим две переменные, означающие false.

Out=false
join=false

Далее объявляем функцию конструкцией def. Объявленная функция будет receiving( ), в скобках указываем имя и сокет. Она позволит получать сообщения. После двоеточия строится система циклов. Начнем с цикла while, условием будет неравность Cut. После этой строки делаем разветвление на try иexcept. После try пишем ещё один цикл while, где условием ставим неравность Cut правде (true). Затем копируем стоку из кода сервера с адресом пользователя и сообщением, где указан вес отправляемого файла.

Defreceiving (name, sock):
While not Cut:
Try:
While true:
Message, address = sock.recvfrom (1024)

Следующий этап – расшифровка сообщений. Для этого используем конструкцию decrypt.

Decrypt = ‘ ’; k = false
For i in massage.decode(‘utf-8’):
If i==’:’:
K=true
Decrypt +=i
Elif k== false or i==’ ’:
Decrypt +=i
Else:
Decrypt +=chr(ord(i)’Key)
Print(decrypt)

Также нужно ввести строку с выводом времени с задержкой при помощи конструкции sleep.

Time.sleep(0.5)

В частиexcept, следующей далее, будет всего одна строка, означающая пропуск случившейся ошибки.

Except:
pass

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

Host=socket.gethostbyname (socket.gethostname ( ))
Port=0
Server= (‘184.155.0.112’, 11111)

Теперь вводим переменную повторяем переменную sock, которая была прописана в коде сервера.Также повторяем следующую строку. Эта функция работает со значениями host и port (адрес клиента). Следующая строка необходима для возможности покинуть чат (закрыть окно). Без функции setblocking все действия пользователя будут сопровождаться различными ошибками системы.

Sock = socket.socket (socket.AF_INET, socket.SOCK_DGRAM).
Sock.bind ((host, port)).
Sock.setblocking(0)

У пользователя должно быть имя. Для этого создаем переменную nickname, которая будет высвечиваться при отправке сообщений пользователем. Функцией input() даем возможность пользователю ввести с клавиатуры желаемый никнейм.

Nickname = input(‘Name: ’)

Теперь работаем с функцией threading. Создаем переменную eT и присваиваем ей значение обработкиthreading функцией Thread( ). В скобки вносим target, равную receiving. Через запятую указываем работу программы конструкцией args через переменную sock. Запускаем работу переменной.

eT=threading.Tread(target=receiving, args-(‘RechThread’, sock))
eT.start( )

Теперь описываем цикл while через равность переменной Outлжи. Разветвляем цикл на if иelse. В части if ставим условием join=false. Тогда программа выполняет операцию sendс переменной sock. Таким образом на сервере высветится имя пользователя и информация о его присоединении.В той же строке добавляем расшифровку закодированного сообщения.Теперь joinявляется правдой.

While Out==false:
If join==false:
Sock.sendto((‘[‘+nickname+ ‘]=> join massager’).encode(‘utf-8’), server)
Join=true

Также опишем разветвление else. Под этой частью подразумевается join==true. Используем функцию tryи except. За первой функцией следует отправка сообщения.

Else:
Try:
Massage=input( )

Далее зашифровываем сообщение.

Crypt= ’ ’
For I in massage:
Crypt += chr(ord(i)’Key)
Massage=crypt

Далее идет цикл if, где сообщение без содержания не отправляется в чат.

If massage !=’ ‘:
Sock.sendto((‘[‘+nickname+’]::’+massage).encode(‘utf-8’), server)

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

Time.sleep(0.5)

Цикл except вводим для решения ошибок. То есть при закрытии программы выводим в чат надпись о выходе пользователя, раскодируем. Теперь переменная Out равна true. Закрываем программу.

Except:
Sock.sendto((‘[‘+nickname+’]=>leftmessenger’).decode(‘utf-8’), server)
Cut=true
eT.join( )
sock.close( )

CGI: Сайт на python 3HelloWorld

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

from http.serverimportHTTPServer, CGIHTTPRequestHandler
server_address = (‘‘, 8000)
httpd = HTTPServer(server_address, CGIHTTPRequestHandler)
httpd.serve_forever()

Этот код добавит в браузер сайт с адресом http://localhost:8000.

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

print(«Content-type: text/html»)
print(«<h1>Hello World!</h1>»)

По ссылке http://localhost:8000/cgi-bin/hello.py будет находится простейший сайт всего с одной надписью: HelloWorld!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *