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

Добрый день, учащиеся! В предыдущем уроке мы обсуждали модуль Python unittest. Сегодня мы рассмотрим пример программирования сокетов на Python. Мы создадим сервер и клиентские приложения на Python.

Программирование сокетов на Python

Для понимания программирования сокетов на Python нам нужно знать три интересных темы – Сокет сервера, Сокет клиента и Сокет. Итак, что такое сервер? Ну, сервер – это программное обеспечение, которое ожидает запросы клиентов и обслуживает их соответственно. С другой стороны, клиент – это запроситель этой услуги. Клиентская программа запрашивает некоторые ресурсы у сервера, и сервер отвечает на этот запрос. Сокет является конечной точкой двустороннего канала связи между сервером и клиентом. Сокеты могут обмениваться данными внутри процесса, между процессами на одной машине или между процессами на разных машинах. Для любого общения с удаленной программой мы должны подключиться через порт сокета. Основная цель этого учебного пособия по программированию сокетов – познакомить вас с тем, как сервер и клиент сокетов общаются друг с другом. Вы также узнаете, как написать программу сервера сокетов на Python.

Пример сокета Python

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

  1. Программа сервера сокета Python выполняется сначала и ждет любого запроса.
  2. Программа клиента сокета Python инициирует беседу сначала.
  3. Затем программа сервера будет отвечать соответственно запросам клиента.
  4. Программа клиента завершится, если пользователь введет сообщение «пока». Программа сервера также завершится, когда завершится программа клиента; это необязательно, и мы можем оставить программу сервера работающей бесконечно или завершить ее с определенной командой в запросе клиента.

Сокет-сервер Python

Мы сохраним программу сервера на языке Python в файле socket_server.py. Для использования сокет-соединения в Python нам необходимо импортировать модуль socket. Затем последовательно нам нужно выполнить несколько задач для установления соединения между сервером и клиентом. Мы можем получить адрес хоста, используя функцию socket.gethostname(). Рекомендуется использовать адрес порта выше 1024, поскольку номера портов меньше 1024 зарезервированы для стандартных протоколов интернета. Вот пример кода сервера сокетов на Python, комментарии помогут вам понять код.

import socket


def server_program():
    # получаем имя хоста
    host = socket.gethostname()
    port = 5000  # initiate port no above 1024

    server_socket = socket.socket()  # get instance
    # обратите внимание. Функция bind() принимает кортеж в качестве аргумента
    server_socket.bind((host, port))  # bind host address and port together

    # настраиваем, сколько клиентов сервер может слушать одновременно
    server_socket.listen(2)
    conn, address = server_socket.accept()  # accept new connection
    print("Connection from: " + str(address))
    while True:
        # принимаем поток данных. Она не будет принимать пакеты данных больше 1024 байт
        data = conn.recv(1024).decode()
        if not data:
            # если данные не получены, выходим
            break
        print("from connected user: " + str(data))
        data = input(' -> ')
        conn.send(data.encode())  # send data to the client

    conn.close()  # close the connection


if __name__ == '__main__':
    server_program()

Таким образом, наш сервер сокетов на языке Python работает на порту 5000 и ожидает запросов клиента. Если вы хотите, чтобы сервер не завершался, когда закрыто соединение с клиентом, просто удалите условие if и оператор break. Цикл while на языке Python используется для бесконечного выполнения программы сервера и ожидания запросов клиента.

Клиент сокета на языке Python

Мы сохраняем программу клиента сокетов на Python как socket_client.py. Эта программа аналогична программе сервера, за исключением операции привязки. Основное различие между программой сервера и программой клиента заключается в том, что в программе сервера необходимо объединить адрес хоста и порта. Приведен ниже пример кода клиента сокета на Python, комментарии помогут вам понять код.

import socket


def client_program():
    host = socket.gethostname()  # as both code is running on same pc
    port = 5000  # socket server port number

    client_socket = socket.socket()  # instantiate
    client_socket.connect((host, port))  # connect to the server

    message = input(" -> ")  # take input

    while message.lower().strip() != 'bye':
        client_socket.send(message.encode())  # send message
        data = client_socket.recv(1024).decode()  # receive response

        print('Received from server: ' + data)  # show in terminal

        message = input(" -> ")  # again take input

    client_socket.close()  # close the connection


if __name__ == '__main__':
    client_program()

Вывод программирования сокетов на Python

Чтобы увидеть вывод, сначала запустите программу сервера сокетов. Затем запустите программу клиента сокетов. После этого напишите что-то из программы клиента. Затем снова напишите ответ из программы сервера. Наконец, напишите bye из программы клиента, чтобы завершить обе программы. Ниже приведено короткое видео, которое покажет, как это работало в моем тестовом запуске программы примеров сервера и клиента сокетов.

pankaj$ python3.6 socket_server.py 
Connection from: ('127.0.0.1', 57822)
from connected user: Hi
 -> Hello
from connected user: How are you?
 -> Good
from connected user: Awesome!
 -> Ok then, bye!
pankaj$
pankaj$ python3.6 socket_client.py 
 -> Hi
Received from server: Hello
 -> How are you?
Received from server: Good
 -> Awesome!
Received from server: Ok then, bye!
 -> Bye
pankaj$

Обратите внимание, что сервер сокетов работает на порту 5000, но для соединения клиенту также требуется порт сокета. Этот порт назначается случайным образом при вызове соединения клиента. В этом случае это 57822. Итак, это все, что касается программирования сокетов на Python, программ сервера и клиента сокетов на Python. Ссылка: Официальная документация

Source:
https://www.digitalocean.com/community/tutorials/python-socket-programming-server-client