Поиск по сайту:

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


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

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

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

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

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

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

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

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

import socket


def server_program():
    # get the hostname
    host = socket.gethostname()
    port = 5000  # initiate port no above 1024

    server_socket = socket.socket()  # get instance
    # look closely. The bind() function takes tuple as argument
    server_socket.bind((host, port))  # bind host address and port together

    # configure how many client the server can listen simultaneously
    server_socket.listen(2)
    conn, address = server_socket.accept()  # accept new connection
    print("Connection from: " + str(address))
    while True:
        # receive data stream. it won't accept data packet greater than 1024 bytes
        data = conn.recv(1024).decode()
        if not data:
            # if data is not received break
            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 и будет ждать запроса клиента. Если вы хотите, чтобы сервер не завершал работу при закрытии клиентского соединения, просто удалите цикл Python while, используемый для бесконечного запуска серверной программы, и продолжайте ждать запроса клиента.

Сокет-клиент 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

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 и клиентов сокетов. Ссылка: Официальная документация