Мой эксперимент с чистым HTTP-сервером чата Node.js и почему я его уничтожил?
Недавно я начал изучать Node.js и был весьма впечатлен его потенциалом. Экосистема пакетов npm - благо для разработчиков. Но для того, кто пытается изучить Node.js, модульная экосистема затрудняет копание глубже. Ваше желание кодировать сводится к имени библиотеки, вызову функции и набору параметров. В то время как профессионал не мог прожить и дня без npm, мой ученик хотел создать что-то, используя чистый Node.js.
Зачем строить HTTP-чат-сервер?
Приложение чата предоставит вам доступ к клиентской и серверной стороне приложения . Таким образом, это хорошая отправная точка для полного обзора среды Node.js. Одним из самых больших преимуществ Node.js является использование java-скрипта как на клиенте, так и на сервере.
Все знают, что такое чат и сколько разных способов его можно нарезать и нарезать кубиками. Я не собираюсь слишком подробно останавливаться на требованиях, но вот несколько пользовательских историй, чтобы облегчить обсуждение:
История пользователя 1. Создайте простую комнату чата, где пользователи могут ввести свое имя и начать общение.
История пользователя 2: наряду с сообщением чата, также отображается время и имя пользователя (основное ожидание при общении в чате).
Я назвал чат-холлер! А вот и скриншот!
Раскадровка: разбивка на компоненты
1. Создайте HTTP-сервер и попросите его прослушивать порт (скажем, 8080).
2. Соберите имя и сообщение чата, которое вводит пользователь. Отправьте его как сообщение на порт (8080), который сервер прослушивает.
3. Поддерживайте массив на сервере и, когда приходят сообщения (запросы), сохраняйте их в массиве. Ответьте на запрос клиента с полным содержимым массива. Вот образец моего массива. Формат: [пользователь, текущее_время, чат_сообщение].
var messages=[[Ross,date,”Hello, Is Rachel there?”],[Rachel,date,”Yep,take me shopping”],[Ross,date,”anything for you Rachel”[Joey,date,”I need pizza”]]
Звучит просто и понятно, правда? О, да! Я столкнулся с массой проблем.
Вот полный код для справки. Ниже перечислены различные встречающиеся проблемы -
Задача 1:
Допустим, в чате есть три пользователя (Росс, Рэйчел и Джоуи). Только когда Росс отправляет чат, он может видеть все остальные чаты. Если Росс бездействует и смотрит окно чата, он не получает ни одного из сообщений чата, которые публикуют Рэйчел или Джоуи.
Причина:
Это классическая проблема, связанная с тем, что мы используем HTTP. HTTP - это протокол запроса / ответа. Только когда есть запрос, вы можете получить ответ. Когда пользователь отправляет сообщение чата, он отправляет запрос. В ответ он получает все сообщения, которые были поставлены в очередь на сервере. Когда он не отправляет запрос, он его не получает, потому что нет запроса, на который нужно ответить.
Разрешение:
Ответ - опрос (продолжайте обращаться к серверу с заданным интервалом для получения данных. Возьмите эти данные и обновите страницу клиента). Если вы загуглите, вы найдете ссылки на длинные опросы или веб-сокеты. Это лучший подход, чем простой опрос. В моем примере я придерживался простого опроса для упрощения реализации. Клиент каждую секунду отправляет запросы на сервер. Сервер отвечает массивом сообщений, который отображается клиенту. Угадай, что! Оно работает!! Окно чата обновляется каждую секунду с последними данными.
Задача 2:
Фиктивные запросы никогда не заканчиваются на стороне клиента. Они продолжают бомбардировать сервер каждую секунду, даже когда Джои (клиент) покидает компьютер. (забрать свою пиццу, но забывает закрыть вкладку браузера)
Причина:
Я так закодировал :) Я использовал java-скрипт setInterval
для отправки запроса на сервер каждую секунду
Разрешение:
Остановите запросы, когда пользователь (Джои) неактивен более 2 минут, и возобновите, если Джоуи вернется. Я отслеживал активность Джои, наблюдая за его действиями мыши и клавиатуры. Если в течение двух минут не было запущено никаких событий, я останавливал фиктивные запросы. Вот его суть
Починил это? Чудесно!!! Теперь у вас есть приложение, из которого вы можете позвонить в чат. Я назвал его Холлер !!
Теперь зачем вам уничтожать Холлера !?
Как только вы создадите это приложение, возникает соблазн попросить друзей зайти на страницу, чтобы поболтать в стиле домашней кофейни, но не делайте этого !!! Вот мои причины-
- Холлер! не может масштабироваться за пределы нескольких пользователей. Представьте, что приложение становится популярным (в наши дни все может стать вирусным). 1000 пользователей присоединяются к чату. Ваш сервер будет засыпан фиктивными запросами. Производительность имеет значение!
- Здесь вам не следует использовать HTTP, а используйте такие понятия, как TCP, веб-сокеты, express.js и socket.io. Они делают вашу разработку простой, эффективной и масштабируемой.
- Код в его текущей форме (суть выше) не заботится ни о каких аспектах безопасности. Шифрование очень важно, и для этого есть пакеты. Безопасность очень важна, поскольку вы отправляете личные сообщения в чате.
Я узнал несколько вещей («Когда не использовать HTTP?», Типы опросов, таймеры сценариев Java), построив сервер чата HTTP. Я бы посоветовал вам создать хотя бы одно приложение, используя чистый Node.js. Кто знает, что вы можете выучить / отучить несколько концепций, как я?
Удачного обучения !!!
Я хотел бы поблагодарить Куинси Ларсона, Самера Буна за то, что они вдохновили меня своим контентом на среде.
Не стесняйтесь оставлять комментарии со своим мнением или вопросом ниже! Спасибо!