Основы программирования сокетов Python|Месяц тем Python

задняя часть Python WebSocket
Основы программирования сокетов Python|Месяц тем Python

Эта статья участвует в "Месяце тем Python", подробнее см.Ссылка на мероприятие

В сегодняшнем уроке мы познакомимосновы питонаизПрограммирование сокетов Python. Интерфейс сокетов Python похож на C и Java. Итак, если у вас уже есть опыт программирования на C/Java, вам будет намного проще изучить программирование сокетов на Python.

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

Python предоставляетДва типа библиотек API, который можно использовать для программирования сокетов. существуетНижний слой, Python использует "socket"libraryРеализуйте клиентские и серверные модули для сетевых протоколов без установления и с установлением соединения. пока ввысший уровень, вы можете использовать егоftplibиhttplibБиблиотеки, такие как Interact, с сетевыми протоколами уровня приложений, такими как FTP и HTTP.

В этом посте мы обсудим наиболее широко используемые"разъем"библиотека. Мы рассмотрим основные функции, предоставляемые библиотекой, которые помогут вам создавать клиентские и серверные модули. Наконец, вы увидите демонстрацию взаимодействия клиент-сервер с примером кода.

Сокет — это самый важный и основной объект, который вам нужно знать, чтобы изучить программирование сокетов на Python. В этом разделе мы представили концепцию сокетов и связанные с ними методы создания сокетов и взаимодействия с ними.

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

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

Сокет — это конечная точка двустороннего канала связи. Конечная точка представляет собой комбинацию IP-адреса и номера порта.

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

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

Как создать объект сокета в Python?

Для создания/инициализации сокета мы используемsocket.socket()метод. это на питонеsocketопределяется в модуле. Его синтаксис следующий.

sock_obj = socket.socket(socket_family, socket_type, protocol=0)

Где,

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

    • AF_UNIX или
    • AF_INET (IP версии 4 или IPv4).
  • сокет_тип:Определяет тип связи между двумя конечными точками. Он может иметь следующие значения.

    • SOCK_STREAM (для протоколов, ориентированных на соединение, таких как TCP), или
    • SOCK_DGRAM (для протоколов без установления соединения, таких как UDP).
  • протокол:Обычно мы сохраняем это поле или устанавливаем для него нулевое значение.

import socket   #for sockets

#实例化一个AF_INET, STREAM socket (TCP)

sock_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

print ('Socket Initialized')

Вот как создается объект сокета. Но что, если в приведенном выше примере не удается создать экземпляр сокета. Как вы будете устранять ошибку?

Вам нужно обернуть приведенный выше код в блоки try и кроме блоков Python. С помощью обработки исключений Python вы можете отследить причину ошибки.

#管理python套接字编程中的错误
 
import socket   #for sockets
import sys  #for exit
 
try:
    #创建一个 AF_INET, STREAM 套接字 (TCP)

    sock_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error as err_msg:
    print ('Unable to instantiate socket. Error code: ' + str(err_msg[0]) + ' , Error message : ' + err_msg[1])
    sys.exit();
 
print ('Socket Initialized')

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

Сколько методов сокетов доступно в библиотеке сокетов Python?

Мы можем разделить методы сокетов для программирования сокетов Python на следующие три категории.

  • методы серверных сокетов,
  • методы клиентских сокетов и
  • Общий метод сокета.

Какие методы доступны для серверных сокетов?

Методы сокета сервера

  • sock_object.bind(адрес):

    • Этот метод привязывает сокет к адресу (имя хоста, пара номеров портов).
  • sock_object.listen (отставание):

    • Этот метод используется для прослушивания соединений, связанных с сокетом.
    • Параметр невыполненной работы представляет максимальное количество подключений в очереди.
    • Максимальное значение может быть до 5, а минимальное значение должно быть не ниже нуля.
  • sock_object.accept():

    • Эта функция возвращает пару (conn, address), где «conn» — это новый объект сокета, используемый для отправки и получения данных по каналу связи, а «address» — это IP-адрес, привязанный к сокету на другом конце канала. .
    • Метод ACCEPT() возвращает объект сокета, который отличается от объекта сокета, созданного с помощью socket.socket().
    • Этот новый объект сокета предназначен для управления связью с конкретным клиентом, где происходит принятие.
    • Этот механизм также помогает серверу одновременно поддерживать соединения с n клиентами.

Какие методы доступны для клиентских сокетов?

Методы клиентских сокетов

  • sock_object.connect():

    • Этот метод используется для подключения клиента к хосту и порту и инициации подключения к серверу.

Какие общие методы сокетов доступны в Python?

Общий метод сокета

  • sock_object.recv():

    • Используйте этот метод для получения сообщений в конечной точке, когда значением параметра протокола является TCP.
  • sock_object.send():

    • Если используется протокол TCP, используйте этот метод для отправки сообщений с конечной точки.
  • sock_object.recvfrom():

    • Если используется протокол UDP, вызовите этот метод, чтобы получить сообщение в конечной точке.
  • sock_object.sendto():

    • Если параметр протокола — UDP, этот метод вызывается для отправки сообщения из конечной точки.
  • sock_object.gethostname():

    • Этот метод возвращает имя хоста.
  • sock_object.close():

    • Этот метод используется для закрытия сокета. Удаленная конечная точка не будет получать данные с этого конца.

До сих пор мы перечисляли "socket«Библиотека предоставляет все возможности сокетов для программирования сокетов Python. Далее мы покажем вам рабочий процесс вызова функции сокета для реализации связи клиент-сервер. Пожалуйста, обратитесь к следующему снимку. Он иллюстрирует каждый вызов сокета, необходимый для установления канала с сервером.

Рабочий процесс программирования сокетов Python

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

image.png

Итак, из приведенной выше блок-схемы вы узнаете все методы сокетов, необходимые для создания клиент-серверной программы сокетов в Python. Теперь пришло время настроить настоящий клиентский и серверный компоненты Python.

Пример кода взаимодействия клиент-сервер Python

Программа клиент-сервер будет иметь следующие два модуля Python.

  • Python-Server.py и
  • Python-Client.py.

Сначала рассмотрим код сервера. Обратите внимание, что мы протестировали этот код на Python 3.

Python-Server.py

Этот серверный модуль будет отправлять и получать данные от клиентов.

  • Файл Python-Server.py содержит код для создания серверного сокета, ожидающего получения запроса от клиента.

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

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

import socket
import time

def Main():
    host = "127.0.0.1"
    port = 5001

    mySocket = socket.socket()
    mySocket.bind((host,port))
                
    mySocket.listen(1)
    conn, addr = mySocket.accept()
    print ("Connection from: " + str(addr))

    while True:
        data = conn.recv(1024).decode()
        if not data:
            break
        print ("from connected  user: " + str(data))
                                                
        data = str(data).upper()
        print ("Received from User: " + str(data))

        data = input(" ? ")
        conn.send(data.encode())
                                                
    conn.close()
                
if __name__ == '__main__':
    Main()

Python-Client.py

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

  • В клиентском коде есть цикл while для обмена сообщениями. Он продолжает печатать все данные, которые получает с сервера.
  • После этого он вызоветвходитьФункция для запроса ответа клиента. Затем передайте ответ серверу.
  • Пользователь также может ввести «q», чтобы остановить связь в любой момент времени.
import socket

def Main():
    host = '127.0.0.1'
    port = 5001

    mySocket = socket.socket()
    mySocket.connect((host,port))

    message = input(" ? ")

    while message != 'q':
        mySocket.send(message.encode())
	data = mySocket.recv(1024).decode()

	print ('Received from server: ' + data)
	message = input(" ? ")

    mySocket.close()

if __name__ == '__main__':
    Main()

Как запустить клиент-серверную программу?

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

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

Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.

 RESTART: C:\Users\Techbeamers\AppData\Local\Programs\Python\Python35\Python-Server.py 
Connection from: ('127.0.0.1', 50001)
from connected  user: Hello TechBeamers
Received from User: HELLO TECHBEAMERS
 ? Hello Dear Reader
from connected  user: You posts are awesome :)
Received from User: YOU POSTS ARE AWESOME :)
 ? Thank you very much. This is what keeps us motivated.
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
 
 RESTART: C:\Users\Techbeamers\AppData\Local\Programs\Python\Python35\Python-Client.py 
 ? Hello TechBeamers

Received from server: Hello Dear Reader
 ? You posts are awesome :)

Received from server: Thank you very much. This is what keeps us motivated.
 ? q

Проверить совместимость программы

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

data = input(" ? ")

Используйте следующий Python для Python 2.7входитьфункция.

data = raw_input(" ? ")

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

  • Некоторые другие функции в Python 2.7 (например, печать) не требуют закрывающих фигурных скобок.
  • Ни одна из функций сокета Python 2.7 (например, send()/recv() ) не нуждается в декодировании своих возвращаемых значений, в то время как в Python 3 это требуется.

Краткое резюме — Программирование сокетов Python

Мы надеемся, что приведенный выше учебник дал вам новые знания о программировании сокетов Python. Если вам понравилась эта статья и вы хотите увидеть больше, вы можете прочитать ее здесь (Github/Gitee) Следуйте за мной, чтобы увидеть больше информации, вот сводка всего моего оригинального и исходного кода

🧵 Другие статьи по теме

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

Если вы действительно узнали что-то новое из этой статьи, ставьте лайк, добавляйте в закладки и делитесь с друзьями. 🤗Наконец, не забудьте поддержать ❤ или 📑