Основное руководство по программированию сокетов на Python: клиентские, серверные и одноранговые библиотеки

Основное руководство по программированию сокетов на Python: клиентские, серверные и одноранговые библиотеки

7 марта 2023 г.

В этом руководстве вы узнаете, как обмениваться данными между клиентом и сервером с помощью программирования сокетов Python и Socket API. Позже в этом руководстве будет обсуждаться обмен данными напрямую между двумя или более клиентами Python с использованием размещенного провайдера. Исходный код, использованный в этом руководстве, можно найти в репозитории GitHub.

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

Настройка среды

Вам потребуется стабильная версия Python версии 3.x, установленная на вашем компьютере. Если вы являетесь пользователем Windows, у вас есть возможность добавить Python в свой PATH.

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

Visual Studio Code – популярный бесплатный редактор кода с открытым исходным кодом, который поддерживает множество языков и сред, включая Python.

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

Создайте и запустите приложение сокета Python

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

Python socket stack

Создайте файл client.py в каталоге проекта. Чтобы использовать сокеты, импортируйте библиотеку сокетов Python и создайте новый объект сокета, который подключается к указанному IP-адресу (в данном случае это локальный хост с номером порта 8080, но вы можете выбрать любой адрес ipv4).

Создайте новое соединение с сервером сокетов, отправьте данные на сервер TCP и закройте соединение сокета.

Ваш файл client.py должен выглядеть следующим образом:

import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('0.0.0.0', 8080))
client.send("I am CLIENTn".encode())
from_server = client.recv(4096)
client.close()
print (from_server.decode())

Вам понадобится сервер сокетов для прослушивания входящих соединений и сообщений от вашего клиента.

Создайте файл server.py и добавьте следующее содержимое:

import socket
serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serv.bind(('0.0.0.0', 8080))
serv.listen(5)
while True:
  conn, addr = serv.accept()
  from_client = ''
  while True:
    data = conn.recv(4096)
    if not data: break
    from_client += data.decode('utf8')
    print (from_client)
    conn.send("I am SERVERn".encode())
  conn.close()
  print ('client disconnected and shutdown')

Server.py привязывает объект сокета к имени хоста (localhost) через порт 8080 и постоянно прослушивает новые клиентские подключения. Когда клиент подключается к этому адресу, сервер принимает соединение и считывает любые данные.

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

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

python3 server.py

Во втором окне запустите:

python3 client.py

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

Клиент отправит серверу строку «Я КЛИЕНТ» и будет ждать ответа. Сервер прочитает сообщение клиента, выведет его на терминал и отправит ответ клиенту.

Python socket example

Программирование сокетов на Python с использованием PubNub

До сих пор в этом руководстве рассматривался обмен сообщениями между сервером и клиентом, но что, если вам нужно напрямую общаться между клиентами Python?

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

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

Кроссплатформенные SDK PubNub, в том числе Python, могут идентифицировать пользователей и отправлять сообщения по определенным каналам, что доступно только подписавшимся клиентам. получить.

Программирование сокетов Python между клиентами

Итак, как написать представленное ранее простое приложение с PubNub для обмена сообщениями напрямую между двумя клиентами? Важно понимать, что хотя PubNub использует архитектуру «публикации» и «подписки» (pub/sub) для отправки и получения двунаправленных сообщений между конечными точками, он по-прежнему использует сокеты за кулисами. PubNub предоставляет вам преимущества связи через сокеты, не беспокоясь о деталях сетевого программирования Python и поддерживая постоянное соединение между вашими клиентами независимо от операционной системы.

Для интеграции PubNub в проект установите пакет PubNub с pip в терминале; это позволит вам использовать PubNub Python SDK и взаимодействовать с инфраструктурой PubNub.

pip3 install 'pubnub>=7.1.0'

Вам нужно будет создать два клиента для подключения и обмена данными через сеть PubNub. Создайте файл pn_client_1.py и добавьте следующий код:

from pubnub.callbacks import SubscribeCallback
from pubnub.enums import PNStatusCategory
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub
import time
import os
pnconfig = PNConfiguration()
userId = os.path.basename(__file__)
pnconfig.publish_key = 'demo'
pnconfig.subscribe_key = 'demo'
pnconfig.user_id = userId
pnconfig.ssl = True
pubnub = PubNub(pnconfig)
def my_publish_callback(envelope, status):
  # Check whether request successfully completed or not
  if not status.is_error():
    pass
class MySubscribeCallback(SubscribeCallback):
  def presence(self, pubnub, presence):
    pass
  def status(self, pubnub, status):
    pass
  def message(self, pubnub, message):
    if message.publisher == userId : return
    print ("from device " + message.publisher + ": " + message.message)
pubnub.add_listener(MySubscribeCallback())
pubnub.subscribe().channels("chan-1").execute()
## publish a message
while True:
  msg = input("")
  if msg == 'exit': os._exit(1)
  pubnub.publish().channel("chan-1").message(str(msg)).pn_async(my_publish_callback)

Создайте файл pn_client_2.py и добавьте тот же код, что и для pn_client_1.py

.

В приведенном выше коде используются «демонстрационные» ключи, но вы можете бесплатно получить собственные ключи PubNub.

Запустите pn_client_1.py и pn_client_2.py одновременно в двух разных окнах терминала

python3 pn_client_1.py

python3 pn_client_2.py

Каждый клиент инициализирует свое подключение к сети PubNub и подписывается на получение новых сообщений всякий раз, когда они публикуются на канале chan-1. Вы можете думать об этом как об отправке данных через сокет TCP в Python; за кулисами PubNub создает и управляет сокетом для вас и направляет ваше сообщение всем клиентам, которые его прослушивают. Как только удаленный клиент получает сообщение, полученное сообщение отображается в командной строке.

Python PubNub example

И это все! Чтобы получить дополнительную информацию о разработке с помощью PubNub, ознакомьтесь с набором руководств. Кроме того, ознакомьтесь с интерактивным экскурсионным туром по PubNub, чтобы понять, как платформа обеспечивает интерактивность приложений в реальном времени. PubNub поддерживает передачу дейтаграмм TCP и UDP, а также Linux, Unix и Windows.

Также опубликовано здесь: https://www.pubnub.com/blog/socket -программирование-на-питоне-клиент-сервер-p2p/


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE