Мой эксперимент с чистым 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. Кто знает, что вы можете выучить / отучить несколько концепций, как я?

Удачного обучения !!!

Я хотел бы поблагодарить Куинси Ларсона, Самера Буна за то, что они вдохновили меня своим контентом на среде.

Не стесняйтесь оставлять комментарии со своим мнением или вопросом ниже! Спасибо!