Вопрос или проблема
У меня есть серверный код, написанный на python websockets (сервер полностью обслуживает вебсокеты), который я протестировал и который работает на localhost. Я пытаюсь настроить сервер на render.com с этим кодом, но у меня возникли проблемы. URL, который предоставляет render.com, выглядит примерно так: https://sample-site.onrender.com
. В серверном коде есть строка:
start_server = websockets.serve(main, "0.0.0.0", 8765)
и в консоли появилось сообщение Ваш сервис активен 🎉
. У меня возникают проблемы с подключением к нему с моим клиентским кодом (также используя пакет python websockets)
websockets.connect('ws://sample-site.onrender.com:8765')
при попытке подключиться в консоли на стороне сервера ничего не отображается, и у меня истекает время ожидания на клиентской стороне.
Код, который я тестировал, использовал только ws (не wss), поэтому я попытался подключиться с URL в качестве ws вместо wss, но это не сработало. Оба варианта вернули ошибку истечения времени ожидания при попытке подключиться. Ошибка выглядит так:
"C:\Users\...\Python\Python312\Lib\asyncio\proactor_events.py", line 729, in sock_connect
return await self._proactor.connect(sock, address)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
asyncio.exceptions.CancelledError
что привело к истечению времени ожидания программы при подключении.
Если бы мне пришлось угадать, я бы сказал, что это связано с тем, что wss не работает, поскольку wss не работает в моих клиентских тестах, но я не знаю, в каком направлении это исправить: понизить с wss до ws или обновить мой код, чтобы работать с wss. Буду признателен за направление, куда двигаться.
Ответ или решение
Настройка веб-сокетов-сервера на Render.com
Настройка Python веб-сокетов-сервера на хостинге, таком как Render.com, может представлять некоторые трудности, особенно для тех, кто впервые работает с данной технологией. Давайте разберёмся в этой задаче шаг за шагом.
1. Подготовка окружения
Убедитесь, что у вас установлен Python (рекомендуется версия 3.7 или выше) и пакет websockets
. Если этого ещё нет, установите его с помощью pip:
pip install websockets
2. Написание кода серверной части
Ваш код, судя по всему, выглядит следующим образом:
import asyncio
import websockets
async def main(websocket, path):
async for message in websocket:
await websocket.send(f"Сообщение получено: {message}")
start_server = websockets.serve(main, "0.0.0.0", 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
3. Деплой на Render.com
Render.com позволяет запускать Python приложения. Ваши шаги будут следующими:
-
Создание нового сервиса: Выберите тип сервиса «Web Service»
-
Настройка репозитория: Свяжите ваш репозиторий (например, на GitHub) с Render.com.
-
Конфигурация: Обязательно укажите команду развертывания. Возможно, вам потребуется добавить в ваши зависимости файл
requirements.txt
, в котором будет указано:websockets
-
Настройка порта: Render.com автоматически предоставляет переменную окружения
PORT
, которая содержит номер порта. Измените вашу серверную часть на:import os start_server = websockets.serve(main, "0.0.0.0", int(os.environ["PORT"]))
4. Подключение с клиентской стороны
Теперь разберёмся с клиентом. Для подключения к веб-сокетам на Render.com необходимо использовать безопасный протокол wss
. Попробуйте подключение следующим образом:
import asyncio
import websockets
async def connect():
uri = "wss://sample-site.onrender.com" # Согласно URL, который вы получили
async with websockets.connect(uri) as websocket:
await websocket.send("Привет серверу!")
response = await websocket.recv()
print(f"Ответ от сервера: {response}")
asyncio.get_event_loop().run_until_complete(connect())
5. Устранение неполадок
Если вы всё ещё сталкиваетесь с проблемами соединения, проверьте следующее:
-
Ошибка таймаута: Убедитесь, что ваш сервер на Render.com действительно запущен и активен. Посмотрите логи в консоли Render.com на предмет ошибок.
-
Сертификаты: Убедитесь, что никто не блокирует соединение. Возможно, вам стоит попытаться подключиться из сети, не имеющей ограничений.
-
Переменная окружения PORT: Проверяйте, что ваш сервер слушает именно тот порт, который указан в переменной окружения.
Заключение
Правильная настройка веб-сокетов на облачном хостинге требует внимания к деталям, особенно когда дело касается управления портами и протоколами безопасности. Следуя данным шагам и рекомендациям, вы сможете успешно развернуть свой Python веб-сокет сервер на Render.com и обеспечить надёжную связь с клиентскими приложениями. Не забывайте проверять логи и проводить тестирование на каждом этапе, чтобы исключить возможные проблемы.