#python #reactjs #websocket #command-line-interface
#python #reactjs #websocket #интерфейс командной строки
Вопрос:
Чего я хочу достичь
У меня есть веб-сайт, созданный с использованием react, и приложение командной строки, созданное с использованием python, которое пользователь загрузит на свой компьютер.
Что я хочу сделать, так это то, что когда пользователь запускает код python через терминал, код должен открыть веб-сайт в своем браузере и установить соединение websocket с веб-сайтом.
Теперь пользователь может вводить сообщения в поле ввода на веб-сайте, и эти сообщения будут отправляться обратно, в режиме реального времени, в приложение командной строки, которое запишет сообщения в файл в системе пользователя.
Как мне убедиться, что только веб-сайт, открытый пользователем, подключается к терминалу, как мне восстановить соединение, если браузер был закрыт случайно?
Мой подход
Мой подход заключается в том, что при запуске скрипта python в терминале он запрашивает соединение с сокетом с внешнего сервера, который в ответ возвращает код номера.
Затем скрипт python откроет веб-сайт с кодом комнаты в качестве строки запроса, которую веб-сайт будет использовать для запроса добавления внешнего сервера в комнату сокета с терминалом, а затем приложения могут переходить туда и обратно с сообщениями
Является ли этот подход рекомендуемым и достаточно безопасным?
Ответ №1:
Да, ваше решение звучит так, как будто оно будет работать нормально, пока трафик передается через wss, а код номера невозможно угадать.
Довольно распространенным шаблоном отправки сообщений websocket является сохранение списка подключенных идентификаторов клиентов. Когда приходит новое сообщение, перебирайте все идентификаторы клиентов, которые должны получить сообщение, и отправляйте его каждому из них.
Поэтому для обработки повторного подключения просто добавьте новый идентификатор клиента в базу данных для этой комнаты.
Я знаю, что вы упомянули python, но вот некоторый код Typescript с использованием AWS API Gateway, который это делает. Надеюсь, это может вам немного помочь:
/**
* Sends a websocket message to all connected clients
*/
sendMessage: async (message: string, room: string) => {
const connections = await database.getAllClientsInRoom(room);
const apigwManagementApi = new AWS.ApiGatewayManagementApi({
apiVersion: '2018-11-29',
endpoint: process.env.WS_ENDPOINT,
});
const requests = connections.map(async ({ connectionID }) => {
await apigwManagementApi.postToConnection({ ConnectionId: connectionID, Data: message }).promise();
console.log(`Message sent to: ${connectionID}`);
});
return await Promise.all(requests);
},