Сборка сервера и клиента WebSocket с использованием Python
Вы наверняка видели приложения реального времени, в которых данные часто изменяются или обновляются в режиме реального времени. Это происходит потому, что это приложение использует WebSocket для достижения этой функциональности.
К концу этой статьи вы сможете узнать:
- Что такое WebSocket?
- Как создать сервер и клиент WebSocket с помощью Python?
Что такое WebSocket?
WebSocket обеспечивает двустороннюю связь (двунаправленную) между двумя объектами через одно TCP
-соединение. Это означает, что клиент и сервер WebSocket могут взаимодействовать друг с другом несколько раз в одном соединении.
Соединение Websocket — это полнодуплексный протокол соединения, который означает, что данные могут отправляться и получаться одновременно в обоих направлениях, сохраняя соединение до тех пор, пока сервер или клиент не решит прекратить соединение.
Он используется в приложениях реального времени для обмена данными с низкой задержкой в обоих направлениях.
Как создать WebSocket с помощью Python
В этом разделе вы создадите сервер и клиент WebSocket с использованием Python. Вы будете использовать библиотеку веб-сокетов Python для создания сервера и клиента.
Установка зависимости
Откройте окно терминала и выполните следующую команду:
pip install websockets
Используя библиотеку websockets
, вы можете очень легко создать сервер и клиент веб-сокетов на Python.
Создайте сервер WebSocket
В этом разделе вы создадите сервер WebSocket, который будет получать значения от клиента и на основе этих значений отправлять клиенту соответствующий ответ.
import websockets
import asyncio
# Creating WebSocket server
async def ws_server(websocket):
print("WebSocket: Server Started.")
try:
while True:
# Receiving values from client
name = await websocket.recv()
age = await websocket.recv()
# Prompt message when any of the field is missing
if name == "" or age == "":
print("Error Receiving Value from Client.")
break
# Printing details received by client
print("Details Received from Client:")
print(f"Name: {name}")
print(f"Age: {age}")
# Sending a response back to the client
if int(age) < 18:
await websocket.send(f"Sorry! {name}, You can't join the club.")
else:
await websocket.send(f"Welcome aboard, {name}.")
except websockets.ConnectionClosedError:
print("Internal Server Error.")
async def main():
async with websockets.serve(ws_server, "localhost", 7890):
await asyncio.Future() # run forever
if __name__ == "__main__":
asyncio.run(main())
Приведенный выше код импортирует библиотеку websockets для создания сервера WebSocket и связи с ним, а также библиотеку asyncio для использования асинхронных задач.
Затем код определяет асинхронную функцию ws_server(), которая принимает соединение WebSocket (websocket
) в качестве параметра.
Внутри функции используется блок try
, который обрабатывает входящие сообщения от клиента. Внутри блока try создается цикл while
, что означает, что код будет выполняться непрерывно.
Внутри цикла код получает два значения от клиента с помощью websocket.recv() и сохраняет их в переменных name
и age
соответственно. Код проверяет, отсутствует ли какое-либо значение, если да, то он выводит сообщение и разрывает циклы, в противном случае он продолжает работу и печатает значения, полученные от клиента.
Затем код отправляет соответствующий ответ обратно клиенту на основе полученных значений.
В блоке исключений код обрабатывает любые исключения websockets.ConnectionClosedError
, которые указывают на ошибку, произошедшую во время соединения.
Затем код определяет другую асинхронную функцию под названием main(), которая запускает сервер WebSocket. Сервер WebSocket создается с использованием метода websockets.serve()
, который прослушивает локальный хост и порт 7890
.
Сервер будет работать вечно из-за asyncio.Future()
. Это обеспечит работу сервера и его постоянную работу для прослушивания входящих сообщений.
В конце функция main()
запускается с использованием asyncio.run(main())
.
Создание клиента WebSocket
В этом разделе вы создадите клиент, который принимает вводимые пользователем данные и отображает ответ, отправленный сервером WebSocket.
import websockets
import asyncio
# The main function that will handle connection and communication
# with the server
async def ws_client():
print("WebSocket: Client Connected.")
url = "ws://127.0.0.1:7890"
# Connect to the server
async with websockets.connect(url) as ws:
name = input("Your Name (type 'exit' to quit): ")
if name == 'exit':
exit()
age = input("Your Age: ")
# Send values to the server
await ws.send(f"{name}")
await ws.send(f"{age}")
# Stay alive forever, listen to incoming msgs
while True:
msg = await ws.recv()
print(msg)
# Start the connection
asyncio.run(ws_client())
Приведенный выше код определяет асинхронную функцию ws_client()
. Внутри функции клиент WebSocket подключается к серверу WebSocket с помощью метода websockets.connect()
, передаваемого с URL-адресом (ws://127.0.0.1:789
) сервера, созданного в предыдущем разделе.
Пользователю предлагается ввести имя, и если он наберет «выход», код завершит процесс. Затем пользователю предлагается ввести свой возраст, и оба значения (имя и возраст) отправляются на сервер WebSocket с помощью метода ws.send()
.
После этого код входит в бесконечный цикл для непрерывного прослушивания входящих сообщений от сервера с помощью метода ws.recv(). Затем сообщение печатается на консоли.
Наконец, функция ws_client()
запускается с использованием asyncio.run(ws_client())
. Это запустит клиент WebSocket для приема информации от пользователя и отображения ответа, отправленного сервером.
Запуск сервера и клиента WebSocket
Вам необходимо поместить серверный и клиентский код в два отдельных файла Python. Сначала вам нужно запустить скрипт сервера WebSocket, чтобы запустить сервер.
Откройте окно терминала, перейдите в каталог проекта и запустите файл сценария. В этом случае сценарий хранится в файле Python main.py
.
python main.py
Теперь откройте другое окно терминала и запустите клиентский скрипт WebSocket, в данном случае скрипт хранится в файле client.py
.
python client.py
Это запустит клиент WebSocket, подключенный к серверу. Вы увидите подсказки с запросом вашего имени и возраста.
Здесь «Sachin
» и «22
» отправляются на сервер, а в ответ сервер отвечает сообщением «Welcome aboard, Sachin
» на консоли.
Информация, введенная пользователем, будет отображаться на консоли сервера WebSocket. Вы можете увидеть это на изображении ниже.
Вы также можете запустить клиент с помощью интерактивной оболочки WebSocket, используя следующую команду.
python -m websockets ws://localhost:7890
Заключение
В этой статье вы научились создавать сервер и клиент WebSocket, используя библиотеку веб-сокетов в Python. Эта технология используется в приложениях, в которых данные изменяются в режиме реального времени.