почему
Часто вижу, как другие используют и контактируют на работеwebsocket
, Но я не могу использовать его для своей работы, поэтому я решил сделать личный проект, чтобы узнатьwebsocket
, случайно увиделwebsocket
Создал проект музыкального чата ошибка, поэтому я разработал такой зал музыкального чата с нуля, я хочу записать формирование общего личного проекта и, кстати, поделиться им с вами.
- Адрес предварительного просмотра проектаЛобби музыкального чата
Разница между веб-сокетом и http
В нашем повседневном развитии наибольший контактhttp
соглашение,http
Протокол — это протокол, используемый на прикладном уровне, который основан наtcp
соглашение,http
Протокол для установления связи также должен иметь трехстороннее рукопожатие для отправки информации. В этом сценарии сервер пассивен, он не может работать и общаться с клиентом, а может только ждать, пока клиент инициирует инициативу.Это может подчеркнуть недостатки такого рода связи в некоторых сценариях, поэтомуwebsocket
Оно возникло.
WebSocket
Он должен решить проблему, которую клиент инициирует несколькоhttp
Запросы к обозревателю ресурсов сервера должны пройти долгий круг обучающих задач, он реализует мультиплексирование, а это полнодуплексная связь. существуетwebSocke
По протоколу t клиент и браузер могут отправлять информацию одновременно. учредилWebSocket
После этого сервер не должен отправлять в браузереrequest
Только после запроса информация может быть отправлена в браузер. В это время у сервера есть инициатива отправлять информацию на сервер, когда он этого хочет. И информация не обязательно должна быть в части информации с головой иhttp
Для длинной связи этот метод может не только снизить нагрузку на сервер. И некоторая избыточная информация также сокращается в информации.
Технический отбор
Часто, когда мы что-то разрабатываем сами, мы тратим очень мало времени на написание кода и больше времени тратим на размышления о том, как сделать проект, какую технологию использовать, как его собрать и т. д. Пока мы думаем об этих вопросах, мы действительно можем начать писать, время будет скоро.
Моя личная привычка всегда заключалась в том, чтобы писать фронтенд и бэкенд отдельно, поэтому первая идея — разделить проект на два проекта: фронтенд и бэкенд, фронтенд выбирает стек технологий на данный момент используется компаниейvue
, а серверная часть выбирает узел, с которым каждый внешний интерфейс может быстро начать работу. В то же время из-заwebsocket
, я выбрал более полную комплектациюsocket-io
. Между ними нет большой разницы. Грубо говоряsocket-io
правдаwebsocket
инкапсуляция, но это не совсем правильно,Socket.io
будетWebsocket
и轮询(Polling)
Механизмы и другие методы связи в реальном времени инкапсулированы в общий интерфейс, и их повседневное использование аналогично.
-
внешний интерфейс
- Используйте интерфейсные фреймворки
vue
Займитесь базовой фронтенд-разработкой - использовать
socket-io-client
альтернативаwebsocket
дуплексная связь - использовать комплект
vue-socket.io-extended
,правильноsocket-io
существуетvue
Пакет интеграции , который удобнее использовать в разработке
- Используйте интерфейсные фреймворки
-
задняя часть
- использовать
node
Рамкаnestjs
Back-end разработка (поскольку она использовалась доexpress
,koa
,egg
И т. д. для разработки личных проектов, проектов компанииhapi
, личное ощущение, разные фреймворки вызывают разные чувства,express
,koa
Этот тип фреймворка официально не помогает ограничивать вашу разработку, единой спецификации нет, потому что у разных людей разные увлечения разработкой, а определение официального сайтаПрогрессивная платформа Node.js для создания эффективных, надежных и масштабируемых серверных приложений., дабы попробовать, так я тоже пришел попробоватьnestjs
за эту разработку) - База данных, чаще всего используемая в личных целях
mysql
- используемая форма
nestjs
дополнительныйtypeorm
. (личное ощущениеtypeorm
Не использовал его раньшеsequelize
Он прост в использовании), конечно, как фронтенд, вы можете мало знать о бэкенде, и все зависит от личных предпочтений. - Как музыкальный чат, конечно же, он неотделим от фонотеки.
歌曲来源是通过爬虫获取xx音乐网站实现的
- использовать
Общая идея проекта
создать音乐聊天室
, вот видите, нужны две вещи,音乐
,聊天功能
, чтобы реализовать эти две функции, мы разделяем его на порядок, сначала реализуем чат, а затем реализуем музыку на основе чата.
- Чтобы реализовать функцию чата, основной процесс внешнего и внутреннего интерфейса заключается в том, что внешний интерфейс инициирует запрос на соединение, а серверная часть обрабатывает соединение, записывает пользователя соединения и сохраняет основную личную информацию для распространения среди других пользователей. которые входят в чат.
- Проверка разрешений проекта по-прежнему используется
jsonwebtoken
Но эта идея немного отличается от нашей повседневной проверки - Когда мы успешно подключимся, мы начнем воспроизводить музыку, и если песни, которые все слышат, синхронизированы, это означает, что для управления воспроизведением песен необходим бэк-энд, а не интерфейс, так как управлять музыкой из фонового воспроизведения тоже проблема
- При этом, какие функции нам нужно реализовать, такие как текстовые сообщения в чате, отправка смайликов, отправка картинок, копирование и вставка картинок, заказ песен, вырезание песен, топ песен и т. д., давайте реализуем их по очереди
реализовать функцию
1. Проверка прав доступа к интерфейсу и серверу
Когда мы ежедневно используем внешние и внутренние взаимодействия, мы будем указывать их в заголовке запроса.token
, и эту операцию мы обычно проходимaxios
Запросите перехват для глобальных операций, тогда мыsocket
Как действовать, во-первых, мы по-прежнему неразлучныtoken
Наша проверка в конечном итоге будет использовать его для проверки, поэтому без входа в систему мы не можем обойтись. После входа в систему мы получаемtoken
внесен вsocket
В запросе, во фронтенд-проекте, мы обычно поддерживаем только одинsocket
Для примера посмотрим, какие вещи нужны при инициализации.
официальный сайт сокетаПараметры инициализации в основном такие, какой тут прок от комплекта? На самом деле, когда мы используем этот комплект, в первую очередь$socket
Прикреплено кVue
На прототипе , во-вторых, можно определить a иmethods
,data
ниже того же уровняsockets
, мы можем иmethods
Нравится, определите все нижеsocket-io
События с сервера, если коснулисьwensocket
, мы знаем, что сервер и клиент общаются через события, и две стороны будут запускать разные события, чтобы сообщить другой стороне, что делать. конкретный метод. Прежде всего, мы знаем, чтоtoken
не может быть вaxios
Унифицированное глобальное дополнение, то с ним нужно разбираться самим.
Во-первых, когда мы используемsocket
когда мы отказываемся от традиционногоhttp
метод для запуска новой концепции.Здесь он будет создан во время инициализации.Когда мы инициализируем, пользователь не вошел в систему, как может бытьtoken
Ну, так очевидно,token
Время инъекции должно быть до подключения и после входа в систему, поэтому мы можем пропустить здесь инициализацию и перейти к этапу подключения.
Частые просьбы к серверу о проверке будут потреблять ненужную производительность, интерфейс сначала оценивает, нетtoken
Заставлять пользователей входить в систему, прежде чем они смогут подключиться. Как подключиться?
Вставляем токен перед подключениемthis.$socket.client.io.opts.query
, также можно вынести в заголовок запроса, в зависимости от личных потребностей, оба эти пункта прекрасны, мы просто хотим нести токен в процессе запроса соединения, тогда мы можем контролировать входящие параметры, кроме конечноtoken
Вы также можете указать больше параметров, чтобы увидеть, если это необходимо, и тогда сервер можетrequest
изquery
Залезайtoken
проверено. Таким образом, мы можем свободно контролировать время и параметры подключения, а контрольная сумма сервера в норме.http
Разницы нет, достаточно отклонить соединение, если проверка не проходит.
существуетsocket
, нам не нужно нестиtoken
, нам нужно только перенести его в это время соединения.После того, как последующее соединение будет передано, будет сгенерирован фиксированный идентификатор соединения.cliend.id
, которая является единственной регистрационной информацией для соединения между двумя сторонами, а также связывается с вами через нее, то наши разрешения завершаются здесь.
2. Обмен сообщениями в чате
Самая основная функция комнаты для чата — это общение. Как мы общаемся? Как мы уже говорили ранее,socket
На самом деле общение происходит в ответ на различные события. Простое понимание состоит в том, что мы определяем некоторые методы, которые будут срабатывать в процессе отправки событий с обеих сторон. Как отправлять события, клиент и сервер немного отличаются
- клиент
this.$socket.client.emit('CustomEvent', data)
Вот как клиент отправляет событие с именемCustomEvent
и несdata
данные, то после отправки этого запроса сервер выполнит заданныйCustomEvent
метод для получения данных в то же время. Например, как показано на рисунке ниже, получено сообщение
-
Серверная часть в принципе такая же но другая.Почему вы так говорите?Потому что на клиентской стороне мы один к одному,и наша цель только серверная сторона,поэтому мы можем отправлять события только на серверную сторону , но на стороне сервера по-другому.Если к нему подключается несколько клиентов, то он много к одному.Он хочет работать для нескольких человек.Поэтому сценарии событий, с которыми он сталкивается, делятся на три категории.
- Отправлять уведомления о событиях в качестве подключенного в данный момент клиента
- Отправляйте сообщения, как и все остальные, кроме текущего подключенного пользователя
- Отправить сообщение всем пользователям, включая подключенных в настоящее время клиентов
Хорошо понятно, что мы не можем оповещать всех обо всех сообщениях.Нам нужно раздавать сообщения разным людям.С такой концепцией можно быстро разобраться
3. Основной интерактивный процесс
Вообще говоря, наш ежедневный контент чата будет существоватьDB
Исходный код проекта уже привязан к базе данных, здесь я используюmysql
, это почти одно и то же, не нужно особо заострять внимание, давайте примерно проанализируем, что нужно сделать пользователю после отправки сообщения.
-
Когда пользователь А подключается и входит в комнату, сначала нам нужно предоставить пользователю начальную информацию о комнате.Какую информацию содержит базовый чат?
- Исторические сообщения пользователей чата
- Информация о комнате, объявления о комнате, другие настройки комнаты
- Список всех текущих онлайн-пользователей, включая некоторую основную информацию о пользователях, такую как пол, подпись и т. д.
- Информация о песне, текущая воспроизводимая песня, сколько секунд она проигрывалась и когда она начала играть? [Поговорим об этом позже]
-
После того, как пользователь входит в комнату и отправляет сообщение, сервер получает сообщение и сначала должен сохранить сообщение в
db
Для того, чтобы сохранить историю, а затем уведомить всех об этом сообщении, а затем все клиенты получат уведомление о том, что приходит новое сообщение, и они будут уведомлены о новом сообщении.push
Введите текущий список сообщений, поэтому тому, кто отправляет сообщение, нужно только добавить его в массив. -
Это основной поток чата
Конечно, простой чат — это не только текстовые сообщения.У нас также есть выражения, картинки или мы добавляем небольшие выражения к нашим словам в WeChat.Как этого добиться, мы будем разбирать их по очереди.
- Небольшое выражение для нас на самом деле просто маленькая иконка или картинка, поэтому когда мы выбираем, мы фактически выбираем картинку.Общая форма представления такова
- Мы обнаружили, что после щелчка на выражении оно стало таким форматом.На самом деле, если вы наблюдали предыдущий
QQ
Вы обнаружите, что многие из них на самом деле/大笑
В подобном формате он фактически преобразует путь изображения в такое значение прокси-ключа и передает его при отправке.v-html
или какой-либо другой способ перекомпилировать его вimg
Этикетки достаточно, чтобы был достигнут эффект от такого небольшого выражения и текста вместе, и рассылается следующим образом
- Вторым нам нужно отправить пакет смайликов, далее точно также, пакет смайликов это тоже картинка для нас, адрес изображения, разница в том, что нам не нужно, чтобы он оставался в поле ввода сообщения для смайлика Пакет, который проще, Просто нажмите на пакет смайликов и отправьте ссылку на картинку.Чтобы отличить сообщение, вам нужно только добавить тип к сообщению, например
text文字类型
,img图片类型
,notice消息通知类型
, чтобы он был кратким и всеобъемлющим, и чтобы можно было легко различать разные стили, отображая разные типы, как показано на следующем рисунке.
- Третье, что если пользователь хочет отправить свое сообщение с изображением, мы знаем, что изображение должно быть вставлено или отправлено в виде файла, а суть в том, чтобы отправить файл, как это сделать?
input
Одним из событий является событие вставки@paste
, в этомe.target.file
Затем вы можете получить вставленную информацию об изображении, а затем загрузить файл на удаленный конец через интерфейс загрузки файла, получить возвращенный адрес изображения через интерфейс и отправить адрес изображения на сервер для завершения отправки индивидуальной информации об изображении. , то видео, конечно же, так понятно?
4. Музыкальная функция
В качестве музыкального чата, помимо общения в чате, вторым моментом, конечно же, является музыкальная функция.h5
С точки зрения,h5
только одинvideo
илиaudio
, мы все знаем этот момент, разумеется, нам просто нужноsrc
Очень просто импортировать адрес ресурса и воспроизвести его, но, конечно, мы не просто слушаем песню, мы хотим реализовать функцию одного человека, когда все вместе заказывают песню, а затем вместе проигрывают ее по порядку. все песня одного времени, для этой функции клиенту нужно всего две вещи,
-
Передовые идеи
- Знайте, какая песня сейчас играет и каков адрес ресурса песни.
- На какой секунде воспроизводится песня в данный момент, пользователь начнет воспроизведение с текущего времени, когда все вместе, и будет воспроизводиться синхронно.
- Общий процесс таков: введите информацию о комнате или комнате, текущую песню, время начала песни, загрузите песню, перейдите к текущему времени воспроизведения, чтобы начать воспроизведение.
- Следует отметить, что в настоящее время из-за ограничений браузера музыка не может воспроизводиться автоматически.
autopalay
Это также не вступит в силу, для игры необходимо взаимодействие с пользователем, поэтому перед входом в комнату появляется всплывающее окно для подтверждения пользователем, и функция воспроизведения будет реализована при входе в комнату.
-
Бэкэнд идеи
- Во-первых, серверу нужны ресурсы песни. Нам нужно использовать краулер. На этапе инициализации мы получим несколько песен в качестве музыки, которая будет воспроизводиться случайным образом, когда никто не заказывает песню. В этой части есть подробные комментарии в этап инициализации исходного кода, в зависимости от личных предпочтений Будьте готовы инициализировать, сколько музыки для загрузки.
- Время воспроизведения песни контролируется сервером, когда песня автоматически переключается, поэтому серверу нужно знать, когда следует переключать песню, и в то же время гарантировать, что песня всегда доступна, тогда нам нужно чтобы начать играть музыку при запуске проекта.Как?Операция заключается в том, чтобы случайно получить песню из базы данных, затем начать запись, записать текущую песню, затем время текущей песни, адрес ресурса текущей песни, и т.д., пользователь входит в комнату и толкает ее к пользователю, но пользователь входит в комнату.Откуда мы знаем, сколько секунд в данный момент, поэтому нам нужно записать временную метку, когда мы получим песню из базы данных
timespace
, после того, как пользователь входит в комнату, время входа за вычетом записанной метки времени является временем воспроизведения песни, и с этого времени песня может воспроизводиться. - Итак, когда пора обрезать песню? Конечно, автоматическую обрезку песни нужно переключать после того, как песня проиграна. Когда песня заканчивает играть? Это время песни. Когда я получаю информацию о песне, я также знаю время песни. Просто установите таймер и выполните метод вырезания песен после стольких секунд времени песни. В то же время, при переключении Путем обновления временную метку, мы реализовали функцию автоматического вырезания песни.
- Конечно, нам также нужна операция заказа песен пользователем. Как это реализовать? Поиск песен также должен использовать поисковый робот для поиска песен. После поиска песни функция заказа песен пользователя отправит текущий идентификатор песни и сервер к серверу, и сервер будет записывать, кто какую песню заказал, конечно, нам также нужно, чтобы первый пришел первый обслужен, поэтому нам нужно поддерживать
队列
, песни пользователей, заказавших песни, будут добавлены по порядку. В это время автоматическая нарезка песен не будет поступать в базу данных для чтения. Общий процесс, проверьте队列
Песен, указанных пользователем, нет в базе随机
Получите один, если он есть, получите первую песню в очереди, затем вырежьте песню, а затем удалите песню из очереди, и песня будет воспроизводиться автоматически. - Итак, что мне делать, если песню, которую кто-то заказал, трудно слушать, или если пользователь хочет удалить заказанную песню, это очень просто, просто получите идентификатор песни и информацию о пользователе и удалите ее из очереди. Общая идея такова, конкретно Есть еще много деталей, и есть много моментов, которые можно оптимизировать.Жду ваших предложений.
issues
указал на это
V. Резюме
Обучение с отношением к обучению может быть медленным, обучение с отношением интереса даст вам в два раза больше результата с половиной усилий, отношение к обучению как к развлечению, борьба с монстрами и обновление будет очень интересным, поделитесь небольшим личным проектом со всеми, добро пожаловать где вам не хватает Давайте поднимем этот вопрос и будем учиться друг у друга вместе.
6. Личный блог
Здесь мой личный блог, друзья могут оставлять сообщения для обмена цепочкой друзей.Сообщения могут быть в формате домашней страницы.адрес блога