Добрый день, учащиеся! В предыдущем уроке мы обсуждали модуль Python unittest. Сегодня мы рассмотрим пример программирования сокетов на Python. Мы создадим сервер и клиентские приложения на Python.
Программирование сокетов на Python
Для понимания программирования сокетов на Python нам нужно знать три интересных темы – Сокет сервера, Сокет клиента и Сокет. Итак, что такое сервер? Ну, сервер – это программное обеспечение, которое ожидает запросы клиентов и обслуживает их соответственно. С другой стороны, клиент – это запроситель этой услуги. Клиентская программа запрашивает некоторые ресурсы у сервера, и сервер отвечает на этот запрос. Сокет является конечной точкой двустороннего канала связи между сервером и клиентом. Сокеты могут обмениваться данными внутри процесса, между процессами на одной машине или между процессами на разных машинах. Для любого общения с удаленной программой мы должны подключиться через порт сокета. Основная цель этого учебного пособия по программированию сокетов – познакомить вас с тем, как сервер и клиент сокетов общаются друг с другом. Вы также узнаете, как написать программу сервера сокетов на Python.
Пример сокета Python
Мы уже говорили ранее, что клиент сокета запрашивает некоторые ресурсы у сервера сокетов, и сервер отвечает на этот запрос. Поэтому мы разработаем модель как сервера, так и клиента, чтобы каждый мог взаимодействовать с ними. Шаги можно рассмотреть так.
- Программа сервера сокета Python выполняется сначала и ждет любого запроса.
- Программа клиента сокета Python инициирует беседу сначала.
- Затем программа сервера будет отвечать соответственно запросам клиента.
- Программа клиента завершится, если пользователь введет сообщение «пока». Программа сервера также завершится, когда завершится программа клиента; это необязательно, и мы можем оставить программу сервера работающей бесконечно или завершить ее с определенной командой в запросе клиента.
Сокет-сервер 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